Artigo Sobre o uso da palavra-chave Static no PHP.
A palavra-chave “static” pode ser usado para declarar propriedades e métodos que podem ser acessados sem a necessidade de criar uma instância da classe. Membros Static (classe) só existem em uma cópia, que pertence à própria classe, ao passo que os membros da instância (não-estáticos) são criados como novas cópias para cada novo objeto.
<?php class MyCircle{ // Membros de instância (um por objeto) public $r = 10; function getArea(){ } // Membro Static/class (apenas uma cópia) static $pi = 3.14; static function newArea($a){ } } ?>
Os métodos estáticos não pode usar os membros de instância uma vez que estes métodos não são parte de uma instância. No entanto, eles podem usar outros membros estáticos.
Referenciando membros estáticos
Ao contrário dos membros da instância, membros estáticos não são acessados usando o operador seta simples (->). Em vez disso, a fim de referenciar membros estáticos dentro de uma classe do membro deve-se ser prefixado com “self”, seguido pelo operador de resolução de escopo (::). A palavra-chave “self” é um apelido para o nome da classe, então, alternativamente, o nome real da classe pode ser usada.
<?php static function newArea($a){ return self::$pi * $a * $a; // ok return MyCircle::$pi * $a * $a; // alternative } ?>
Esta mesma sintaxe é usada para acessar membros estáticos de um método de instância. Note que, em contraste com métodos estáticos, métodos de instância pode usar os dois membros estáticos e de instância.
<?php function getArea(){ return self::newArea($this->$r); } ?>
Para acessar membros estáticos de fora da classe o nome da classe precisa ser usado seguido pelo operador de resolução de escopo (::).
<?php class MyCircle{ static $pi = 3.14; static function newArea($a){ return self::$pi * $a * $a; } } echo MyCircle::$pi; // "3.14" echo MyCircle::newArea(10); // "314" ?>
A vantagem de membros estáticos pode ser visto no que eles podem ser utilizados sem a necessidade de criar uma instância da classe. Métodos devem, portanto, ser declarado estático se eles realizam uma função genérica independentemente de variáveis de instância. Da mesma forma, as propriedades devem ser declarados estático se existe apenas a necessidade de uma única instância da variável.
Variáveis estáticas
As variáveis locais podem ser declaradas estática para fazer a função de “lembrar” o seu valor. Uma variável estática existe somente no escopo da função local, mas ela não perde seu valor quando a função termina. Isto pode por exemplo ser utilizado para contar o número de vezes que uma função é chamada.
<?php function add(){ static $val = 0; echo $val++; } add(); // "0" add(); // "1" add(); // "2" ?>
O valor inicial de que uma variável estática é dada somente será definida uma vez. Tenha em mente que as propriedades estáticas e variáveis estáticas só pode ser inicializado com uma constante e não com uma expressão, como uma outra variável ou um valor de retorno da função.
Últimas vinculações Estáticas
Como mencionado anteriormente, a palavra-chave self é um apelido para o nome da classe de inclusão. Isto significa que a palavra-chave irá se referir a sua classe delimitador, mesmo quando é chamado a partir do contexto de uma classe filha.
<?php class MyParent{ protected static $val = 'parent'; public static function getVal(){ return self::$val; } } class MyChild extends MyParent{ protected static $val = 'child'; } echo MyChild::getVal(); // "parent" ?>
Para obter a referência de classe para avaliar a classe chamada real, a palavra-chave static deve ser usado em vez da auto-chave. Esse recurso é chamado late static bindings e foi adicionado no PHP 5.3.
<?php class MyParent{ protected static $val = 'parent'; public static function getLateBindingVal(){ return static::$val; } } class MyChild extends MyParent{ protected static $val = 'child'; } echo MyChild::getLateBindingVal(); // "child" ?>