Якщо ви 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
властивостей.