Статический метод в PHP имеют какое-либо различие с нестатическим методом?

class t {
    public function tt()
    {
        echo 1;
    }
}
t::tt();

Видеть? Нестатическая функция может также быть вызвана на уровне класса. Таким образом, что отличается, если я добавляю a static ключевое слово прежде public?

14
задан user198729 13 March 2010 в 16:22
поделиться

3 ответа

За исключением того, что если вы попытаетесь использовать $ this в своем методе, например:

class t {
    protected $a = 10;
    public function tt() {
        echo $this->a;
        echo 1;
    }
}
t::tt();

Вы получите фатальную ошибку при статическом вызове нестатического метода:

Fatal error: Using $this when not in object context in ...\temp.php on line 11

т.е. ваш пример немного слишком прост и на самом деле не соответствует реальному случаю; -)


Также обратите внимание, что ваш пример должен дать вам строгое предупреждение ( цитата ):

Статический вызов нестатических методов генерирует предупреждение уровня E_STRICT .

И это действительно так (По крайней мере, с PHP 5.3) :

Strict Standards: Non-static method t::tt() should not be called statically in ...\temp.php on line 12
1

Итак: не очень хорошо; -)


Тем не менее, статический вызов нестатического метода не похож на любой вид хорошей практики (вероятно, поэтому он вызывает строгое предупреждение) , поскольку статические методы не имеют того же значения, что и нестатические: статические методы не ссылаются на какой-либо объект, в то время как не- статические методы работают с экземпляром вызываемого класса.


Еще раз: даже если PHP позволяет вам что-то делать (возможно, по историческим причинам - например, совместимость со старыми версиями) , это не значит, что вы должны это делать!

15
ответ дан 1 December 2019 в 12:38
поделиться

Статическое ключевое слово

Поскольку статические методы вызываются без экземпляр созданного объекта, псевдопеременная $ this недоступна внутри метода, объявленного как статический.

К статическим свойствам нельзя получить доступ через объект с помощью оператора стрелки ->.

Вызов нестатических методов статически генерирует предупреждение уровня E_STRICT.

Тот факт, что вы можете вызывать нестатические методы статически, не означает, что вы должны это делать. Это дурной тон.

4
ответ дан 1 December 2019 в 12:38
поделиться

Как правило, статический метод также называется методом класса , тогда как нестатический метод также называется методом объекта или методом экземпляра .

Разница между методом класса и методом объекта заключается в том, что методы класса могут обращаться только к свойствам класса (статическим свойствам), в то время как методы объекта используются для доступа к свойствам объекта (свойствам одного и того же экземпляра класса).

Статические методы и свойства используются для обмена общими данными для всех экземпляров этого конкретного класса.

Вы можете, например, использовать статическое свойство для отслеживания количества экземпляров:

class A {
    private static $counter = 0;

    public function __construct() {
        self::counter = self::counter + 1;
    }

    public function __destruct() {
        self::counter = self::counter - 1;
    }

    public static function printCounter() {
        echo "There are currently ".self::counter." instances of ".__CLASS__;
    }
}

$a1 = new A();
$a2 = new A();
A::printCounter();
unset($a2);
A::printCounter();

Обратите внимание, что статическое свойство counter является частным, поэтому к нему может получить доступ только сам класс и экземпляры этого класса, но не извне.

2
ответ дан 1 December 2019 в 12:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: