Возможный дубликат:
Новое я против нового статического
В чем разница между использованием self
и static
в приведенном ниже примере?
class Foo { protected static $bar = 1234; public static function instance() { echo self::$bar; echo "\n"; echo static::$bar; } } Foo::instance();
1234 1234
Когда вы используете self
для ссылки на члена класса, вы имеете в виду класс, в котором вы используете ключевое слово. В этом случае ваш класс Foo
определяет защищенное статическое свойство $bar
. Когда вы используете self
в классе Foo
для ссылки на свойство, вы ссылаетесь на тот же класс.
Поэтому, если вы попытались использовать self::$bar
другом месте вашего класса Foo
но у вас был класс Bar
с другим значением для свойства, он использовал бы Foo::$bar
вместо Bar::$bar
, что может и не быть что вы намерены:
class Foo { protected static $bar = 1234; } class Bar extends Foo { protected static $bar = 4321; }
Когда вы используете static
, вы вызываете функцию, называемую поздними статическими привязками (введенную в PHP 5.3).
В приведенном выше сценарии использование static
вместо self
приведет к использованию Bar::$bar
вместо Foo::$bar
, потому что тогда интерпретатор учитывает повторную декларацию в классе Bar
.
Обычно вы используете поздние статические привязки для методов или даже самого класса, а не свойства, поскольку вы не часто обновляете свойства в подклассах; пример использования static
ключевого слова для вызова конструктора с поздними связями можно найти в этом связанном вопросе: New self vs. new static
Тем не менее, это не исключает использования static
свойств и свойств.
self:- refers to the same class whose method the new operation takes place in. static:- in PHP 5.3's late static binding refers to whatever class in the hierarchy which you call the method on.
В следующем примере B наследует оба метода из A. self, привязан к A, потому что он определен в реализации A первого метода, тогда как static привязан к вызываемому классу (также см. Get_called_class ()).
class A { public static function get_A() { return new self(); } public static function get_me() { return new static(); } } class B extends A {} echo get_class(B::get_A()); // A echo get_class(B::get_me()); // B echo get_class(A::get_me()); // A