У меня вопрос о статической функции в 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 для работы над функциями класса. Поэтому я пока не нашел в них разницы. 🙁