Вопрос о статических методах php

В чем разница между этими двумя частями кода?

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, который можно выполнить при автозаполнении.