Якщо ви 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ключового слова для виклику конструктора із запізненням можна знайти у цьому пов'язаному питанні: Новий власний та новий статичний
Однак це також не виключає використання staticвластивостей.