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'




