Quando você usa self
para se referir a um membro da classe, está se referindo à classe na qual usa a palavra-chave. Nesse caso, sua Foo
classe define uma propriedade estática protegida chamada $bar
. Quando você usa self
na Foo
classe para se referir à propriedade, está fazendo referência à mesma classe.
Portanto, se você tentou usar self::$bar
em outro lugar em sua Foo
classe, mas tinha uma Bar
classe com um valor diferente para a propriedade, ela usaria em Foo::$bar
vez de Bar::$bar
, o que pode não ser o que você pretende:
class Foo
{
protected static $bar = 1234;
}
class Bar extends Foo
{
protected static $bar = 4321;
}
Quando você chama um método via static
, está invocando um recurso chamado late bindings estáticos (introduzido no PHP 5.3).
No cenário acima, usar self
resultará em Foo::$bar
(1234). E usar static
resultará em Bar::$bar
(4321) porque com static
, o interpretador leva em consideração a redeclaração dentro da Bar
classe durante o tempo de execução.
Normalmente, você usa vinculações estáticas tardias para métodos ou até mesmo para a própria classe, em vez de propriedades, visto que não costuma redeclarar propriedades em subclasses; um exemplo de uso da static
palavra - chave para invocar um construtor de ligação tardia pode ser encontrado nesta questão relacionada: Novo self vs. novo estático
No entanto, isso não impede o uso static
com propriedades também.