Ответ 1
Когда вы используете 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
для вызова конструктора с поздними ограничениями можно найти в этом связанном вопросе: Новое я против нового статического
Однако это не исключает использования static
со свойствами.