В чем разница между этими двумя частями кода?
class something { static function doit() { echo 'hello world'; } } something::doit();
и то же самое, но без ключевого слова static
class something { function doit() { echo 'hello world'; } } something::doit();
Они оба работают одинаково, лучше ли использовать статические ключевые слова? Правильно ли я понимаю, что он не создает экземпляр класса, если вы используете статический метод?
Второй пример технически неверен – если вы включите отчет об ошибках E_STRICT, вы увидите, что PHP на самом деле бросает ошибку.
PHP Строгие стандарты: нестатический метод something :: doit () не следует называть статическим в …
Другими словами, это хорошо и позволяет вам вызвать функцию в любом случае.
В дополнение к другим действительным ответам причина для 2-го примера работы также связана с причудой в том, как PHP обрабатывает объекты и вызовы (помимо совместимости с PHP 4). Вызов static
метода статического доступа из другого экземпляра позволит вам обращаться к методам класса на других классах, как если бы они были локальными. Чтобы понять, давайте возьмем пример:
class A { public function foo() { echo get_class($this) . "\n"; } } class B { public function bar() { A::foo(); } } $a = new a(); $a->foo(); // "A" $b = new B(); $b->bar(); // "B"
Вы видели, что там произошло? Поскольку вы вызывали метод A::foo()
из экземпляра другого класса , PHP обрабатывал вызов так, как если бы он находился в одном экземпляре. Обратите внимание, что между A
и B
нет никакой связи, кроме того, что B
вызывает A
В пределах A->foo()
, если бы мы сделали $this instanceof A
(или $this instanceof self
), он потерпит неудачу и вернет false! Довольно необычно …
Теперь я сначала подумал, что это ошибка, но после сообщения об этом , она, по-видимому, разработана . Это даже в документах .
Обратите внимание, что это не будет работать с E_STRICT
режимом E_STRICT
. Он также не будет работать, если вы объявите метод static
.
Разница заключается в том, что статические функции могут использоваться без необходимости создания экземпляра класса.
Посмотрите на этот замечательный учебник для начинающих PHP OOP. Он более подробно объясняет пример в разделе « Статические свойства и методы ».
Второй бит не должен работать так, как вы его должны называть
$something = new something(); $something->doit();
Статические функции позволяют вам вызывать функцию внутри класса, не создавая ее. Поэтому в основном, если у вас есть класс для обработки пользователей, поэтому функция, которая регистрирует пользователя, должна быть статической функцией, так как в конструкторе этого класса вы, вероятно, будете собирать информацию о пользователе, и вы не можете сделать этого, не запустив его.
Ваш второй пример неверен. Использование статического метода не создает экземпляр класса. Второй пример должен выглядеть так:
$x = new something(); $x->doit();
Статические методы должны быть объявлены статическими по двум причинам:
a) при использовании E_STRICT
error_reporting вызов нестатического метода как статического генерирует ошибку:
Strict standards: Non-static method something::doit() should not be called statically
b) на основе ключевого слова static
можно использовать метод фильтрации IDE, который можно выполнить при автозаполнении.