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