Статическая функция php
У меня вопрос о статической функции в php.
допустим, что у меня есть класс
class test {
public function sayHi() {
echo 'hi';
}
}
если я выполняю test::sayHi();
, он работает без проблем.
class test {
public static function sayHi() {
echo 'hi';
}
}
test::sayHi();
работает.
В чем отличия между первым классом и вторым классом?
Что особенного в статической функции?
Ответы
Ответ 1
В первом классе sayHi()
на самом деле является методом экземпляра, который вы вызываете как статический метод, и вы избегаете его, потому что sayHi()
никогда не ссылается на $this
.
Статические функции связаны с классом, а не с экземпляром класса. Таким образом, $this
недоступен из статического контекста ($this
не указывает на какой-либо объект).
Ответ 2
Вся разница в том, что вы не получаете $this
внутри статической функции. Если вы попытаетесь использовать $this
, вы получите Fatal error: Using $this when not in object context
.
Хорошо, хорошо, еще одно отличие: предупреждение E_STRICT
генерируется вашим первым примером.
Ответ 3
Просто статические функции функционируют независимо от класса, в котором они принадлежат.
$это означает, что это объект этого класса. Это не относится к статическим функциям.
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'
Ответ 4
Поскольку статические методы вызываются без экземпляра созданного объекта, псевдопеременная $this недоступна внутри метода, объявленного как static.
Статические свойства не могут быть доступны через объект с помощью оператора стрелки → .
Вызов нестатических методов статически генерирует предупреждение уровня E_STRICT.
Как и любая другая статическая переменная PHP, статические свойства могут быть инициализированы только с помощью литерала или константы; выражения не допускаются. Поэтому, хотя вы можете инициализировать статическое свойство для целого или массива (например), вы не можете инициализировать его другой переменной, возвращаемым значением функции или объектом.
Начиная с PHP 5.3.0, можно ссылаться на класс, используя переменную. Значение переменной не может быть ключевым словом (например, self, parent и static).
PHP.NET
Ответ 5
Вызов нестатических методов статически генерирует предупреждение уровня E_STRICT.
Ответ 6
Вкратце, у вас нет объекта как $this во втором случае, так как
статический метод является функцией/методом класса, а не экземпляром объекта.
Ответ 7
После тестирования примеров (PHP 5.3.5) я обнаружил, что в обоих случаях определения функций вы не можете использовать оператор $this
для работы над функциями класса. Поэтому я пока не нашел в них разницы.: (