Iremos nesta dica tratar de duas maneiras de acessar atributos ou métodos estáticos internamentes em uma classe e mostrar a diferença de funcionalidade dos mesmos.
Iremos falar sobre o static:: e self:: . A maioria dos programadores os utiliza sem nem saber as diferenças resultantes.
Quando se está na classe primária/raiz, realmente não haverá diferença no comportamento dos dois modos de acesso.
No entanto ao se estender a classe, o comportamento se altera. Enquanto o self:: sempre irá dar preferência a classe na qual é declarado, o static:: dará preferência a classe em que o chama.
Abaixo um exemplo para demonstrar esta diferença quando se tratando com classe estendida.
class a{ static protected $test="class a"; public function static_test(){ echo static::$test; // Imprimirá 'class a' ou 'class b'. Depende de quem chamou. Ver abaixo. echo self::$test; // Imprimirá sempre 'class a' } } class b extends a{ static protected $test="class b"; } $objA = new a(); $objA->static_test(); //echo static::$test; => Imprimirá 'class a' //echo self::$test; => Imprimirá 'class a' $objB = new b(); $objB->static_test(); //echo static::$test; => Imprimirá 'class b' //echo self::$test; => Imprimirá 'class a'