У меня вопрос о статической функции в php.
давайте предположим, что у меня есть класс
class test { public function sayHi() { echo 'hi'; } }
если я test::sayHi(); он работает без проблем.
class test { public static function sayHi() { echo 'hi'; } }
test::sayHi(); также работает.
Каковы различия между первым классом и вторым классом?
Что особенного в статической функции?
В первом классе sayHi() на самом деле является методом экземпляра, который вы вызываете как статический метод, и вы sayHi() его, потому что sayHi() никогда не ссылается на $this .
Статические функции связаны с классом, а не с экземпляром класса. Таким образом, $this недоступно из статического контекста ( $this не указывает на какой-либо объект).
Вся разница в том, что вы не получаете $this поставленного внутри статической функции. Если вы попытаетесь использовать $this , вы получите Fatal error: Using $this when not in object context .
Ну, ладно, еще одно отличие: в первом примере генерируется предупреждение E_STRICT .
Просто статические функции функционируют независимо от класса, в котором они принадлежат.
$ это означает, что это объект этого класса. Это не относится к статическим функциям.
class test { public function sayHi($hi = "Hi") { $this->hi = $hi; return $this->hi; } } class test1 { public static function sayHi($hi) { $hi = "Hi"; return $hi; } } // Test $mytest = new test(); print $mytest->sayHi('hello'); // returns 'hello' print test1::sayHi('hello'); // returns 'hello'
Поскольку статические методы вызываются без экземпляра созданного объекта, псевдопеременная $ this недоступна внутри метода, объявленного как статический.
Статические свойства не могут быть доступны через объект с помощью оператора стрелки ->.
Вызов нестатических методов статически генерирует предупреждение уровня E_STRICT.
Как и любая другая статическая переменная PHP, статические свойства могут быть инициализированы только с использованием литерала или константы; выражения не допускаются. Поэтому, хотя вы можете инициализировать статическое свойство для целого или массива (например), вы не можете инициализировать его другой переменной, возвращаемым значением функции или объектом.
Начиная с PHP 5.3.0, можно ссылаться на класс, используя переменную. Значение переменной не может быть ключевым словом (например, self, parent и static). PHP.NET
Вызов нестатических методов статически генерирует предупреждение уровня E_STRICT.
В двух словах, у вас нет объекта как $ this во втором случае, поскольку статический метод является функцией / методом класса, а не экземпляром объекта.
После тестирования примеров (PHP 5.3.5) я обнаружил, что в обоих случаях определения функций вы не можете использовать $this operator для работы над функциями класса. Поэтому я пока не нашел в них разницы. 🙁