статическая функция php

У меня вопрос о статической функции в php.

давайте предположим, что у меня есть класс

class test { public function sayHi() { echo 'hi'; } } 

если я test::sayHi(); он работает без проблем.

 class test { public static function sayHi() { echo 'hi'; } } 

test::sayHi(); также работает.

Каковы различия между первым классом и вторым классом?

Что особенного в статической функции?

Solutions Collecting From Web of "статическая функция php"

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