Когда вы используете 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).
В приведенном выше сценарии использование self
приведет к Foo::$bar
(1234). И использование static
приведет к Bar::$bar
(4321), потому static
что интерпретатор принимает во внимание повторное объявление внутри Bar
класса во время выполнения.
Обычно вы используете поздние статические привязки для методов или даже самого класса, а не свойств, поскольку вы не часто повторно объявляете свойства в подклассах; пример использования static
ключевого слова для вызова конструктора с поздним связыванием можно найти в этом связанном вопросе: New self vs. new static
Однако это также не исключает использования static
со свойствами.