Когда вы используете 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со свойствами.