Como criar e usar variáveis estáticas em PHP
Como já vimos em outras dicas desta seção, uma classe possui propriedades (variáveis) e métodos. Dessa forma, cada instância (cópia ou objeto) desta classe possui suas próprias cópias das variáveis declaradas na classe.
Veja a seguinte declaração de uma classe Produto:
Aqui cada instância da classe Produto terá suas próprias variáveis $nome e $preco.
Há, porém, situações nas quais gostaríamos que uma determinada variável pertencesse à classe e não à cada instância individual. Um bom exemplo disso seria uma variável que registra a quantidade de instâncias que temos de uma classe ou a técnica de se atribuir um identificador único a cada instância da classe.
Variáveis estáticas em PHP podem ser criadas por meio do uso da palavra-chave static. É comum tais variáveis serem declaradas com o modificador public, o que as torna acessíveis fora da classe na qual estas estão declaradas. Veja um exemplo:
Este código possui alguns pontos interessantes e merece uma análise bem detalhada. Perceba que, dentro da classe, uma variável estática é acessada usando-se self e não $this, como fazemos com as variáveis de instâncias. Outra observação interessante é em relação ao acesso da variável estática fora da classe. Aqui nós usamos o nome da classe seguida por um par de dois pontos "::" e não por meio de referências às suas instâncias individuais. Finalmente observe o construtor da classe. A cada instância construída nós acessamos a variável estática e incrementamos seu valor em 1.
É importante observar que variáveis estáticas não podem ser acessadas por meio de referências às instâncias da classe usando o operador "->". Assim, o trecho de código abaixo:
não provoca erros mas, também não traz o resultado esperado.
Palavras-chaves:
> Veja, tentar, Produto , Como, nome, > , usando, próprias, acessíveis, cada, acessadas, $nome, uso, forma, serem, meio, =, $this->preco, criadas, duas, dentro, variáveis, getPreco, e, das, acessamos, torna, ; , observar, instâncias, determinada, "->", instância, relação, seria, o, podem, static, ; , construída, , incrementar, com, abaixo, , $p1, valor, pertencesse, cópias, usar, individual, não, modificador, meio , acessada, já, function, ou, de, observe, código, registra, fora, se, 1, construtor, ao, vimos, instâncias , quantidade, situações, $contador++; , resultado, É, 5; , aqui , seção, echo, ", estas, Perceba, em, suas, à, que, Produto $p1->contador, mas, $nome; , cópia, nas, da, do, contar, este, qual, outras, PHP, Outra, seu, > Há, técnica, referências, correspondentes, uma, objeto, estáticas, disso, contador, ?> , não, $preco, Veja, referência, tais, , declaração, > Como, temos, nós, um, Produto, palavra-chave, mutatórios, criamos, também, detalhada, estática, self, permite, > É, incrementamos, > Variáveis, na, private, acesso, __construct, getNome, Aqui, $contador, classe , Um, porém, privadas, interessantes, obter, é, momento, > Este
Como já vimos em outras dicas desta seção, uma classe possui propriedades (variáveis) e métodos. Dessa forma, cada instância (cópia ou objeto) desta classe possui suas próprias cópias das variáveis declaradas na classe.
Veja a seguinte declaração de uma classe Produto:
- Código:
<?
// classe Produto com duas variáveis privadas e seus
// correspondentes métodos mutatórios e acessórios
class Produto{
private $nome;
private $preco;
public function setNome($nome){
$this->nome = $nome;
}
public function getNome(){
return $this->nome;
}
public function setPreco($preco){
$this->preco = $preco;
}
public function getPreco(){
return $this->preco;
}
}
?>
Aqui cada instância da classe Produto terá suas próprias variáveis $nome e $preco.
Há, porém, situações nas quais gostaríamos que uma determinada variável pertencesse à classe e não à cada instância individual. Um bom exemplo disso seria uma variável que registra a quantidade de instâncias que temos de uma classe ou a técnica de se atribuir um identificador único a cada instância da classe.
Variáveis estáticas em PHP podem ser criadas por meio do uso da palavra-chave static. É comum tais variáveis serem declaradas com o modificador public, o que as torna acessíveis fora da classe na qual estas estão declaradas. Veja um exemplo:
- Código:
<?
// classe Produto com duas variáveis privadas e seus
// correspondentes métodos mutatórios e acessórios
class Produto{
private $nome;
private $preco;
// uma variável estática que permite contar as instâncias
// desta classe
public static $contador = 0;
// construtor da classe Produto
function __construct(){
// vamos incrementar o contador aqui
self::$contador++;
}
}
// vamos criar duas instâncias da classe Produto
$p1 = new Produto();
$p2 = new Produto();
// vamos obter o valor do contador de instâncias
echo "Até este momento já criamos " . Produto::$contador .
" instâncias da classe Produto";
?>
Este código possui alguns pontos interessantes e merece uma análise bem detalhada. Perceba que, dentro da classe, uma variável estática é acessada usando-se self e não $this, como fazemos com as variáveis de instâncias. Outra observação interessante é em relação ao acesso da variável estática fora da classe. Aqui nós usamos o nome da classe seguida por um par de dois pontos "::" e não por meio de referências às suas instâncias individuais. Finalmente observe o construtor da classe. A cada instância construída nós acessamos a variável estática e incrementamos seu valor em 1.
É importante observar que variáveis estáticas não podem ser acessadas por meio de referências às instâncias da classe usando o operador "->". Assim, o trecho de código abaixo:
- Código:
// vamos tentar alterar o valor da variável estática por meio
// de uma referência a uma das instâncias da classe Produto
$p1->contador = 5;
não provoca erros mas, também não traz o resultado esperado.
Palavras-chaves:
> Veja, tentar, Produto , Como, nome, > , usando, próprias, acessíveis, cada, acessadas, $nome, uso, forma, serem, meio, =, $this->preco, criadas, duas, dentro, variáveis, getPreco, e, das, acessamos, torna, ; , observar, instâncias, determinada, "->", instância, relação, seria, o, podem, static, ; , construída, , incrementar, com, abaixo, , $p1, valor, pertencesse, cópias, usar, individual, não, modificador, meio , acessada, já, function, ou, de, observe, código, registra, fora, se, 1, construtor, ao, vimos, instâncias , quantidade, situações, $contador++; , resultado, É, 5; , aqui , seção, echo, ", estas, Perceba, em, suas, à, que, Produto $p1->contador, mas, $nome; , cópia, nas, da, do, contar, este, qual, outras, PHP, Outra, seu, > Há, técnica, referências, correspondentes, uma, objeto, estáticas, disso, contador, ?> , não, $preco, Veja, referência, tais, , declaração, > Como, temos, nós, um, Produto, palavra-chave, mutatórios, criamos, também, detalhada, estática, self, permite, > É, incrementamos, > Variáveis, na, private, acesso, __construct, getNome, Aqui, $contador, classe , Um, porém, privadas, interessantes, obter, é, momento, > Este