Classes estáticas em PHP | Programação web
by Tiago Ramalho | Dez 1, 2012 | php, programação web, Tutoriais | 0 comments
Como uma classe pode ser instanciada mais que uma vez, significa que os valores que contém são únicos para a instância/objecto e não para a classe em si. Significa também que não podemos usar os métodos ou variáveis numa classe sem a instanciar primeiro, mas como sempre há uma excepção à regra. Quer as variáveis quer os métodos das classes podem ser declarados como static ou estáticos (também identidicados como "shared" em algumas linguagens de programação), o que quer dizer que podem ser usados sem instanciar a classe primeiro. Uma vez que assim a variável da classe pode ser acedida sem uma instância específica, significa também que irá existir apenas uma versão desta variável. Outra consequência é que um método estático não pode aceder a variáveis e métodos não estáticos, uma vez que estes requerem uma instância da classe.
Num artigo anterior, criámos a classe Utilizador. Vamos expandir esta classe com algumas funcionalidades estáticas:
<?php class Utilizador { public $nome; public $idade; public static $tamanhoMinimoPass = 6; public function Descreve() { return $this->$nome . " tem " . $this->$idade . " anos."; } public static function ValidarPassword($password) { if(strlen($password) >= self::$tamanhoMinimoPass) return true; else return false; } } $password = "testar"; if(Utilizador::ValidarPassword($password)) echo "Password válida!"; else echo "Password inválida!"; ?>
public static $tamanhoMinimoPass = 6;
return $this->$nome . " tem " . $this->$idade . " anos.";
public static function ValidarPassword($password)
if(strlen($password) >= self::$tamanhoMinimoPass)
$password = "testar";
if(Utilizador::ValidarPassword($password))
echo "Password válida!";
echo "Password inválida!";
O que fizémos à classe foi adicionar a variável estática $tamanhoMinimoPass com o valor definido de 6 e de seguida adicionámos a função estática ValidarPassword para verificar se a password é ou não válida. Esta validação de password aqui exemplificada é bastante limitada, mas pode ser expandida. É certo que poderíamos usar uma variável e função normais na classe, mas simplesmente faz mais sentido usá-los como estáticos, pois não se trata de informação específica de um utilizador. Esta funcionalidade é geral, logo não há necessidade de termos de instanciar a classe para os podermos usar.
Como pode ver, para aceder à variável estática através do nosso método estático, usamos o prefixo "self", que é como o prefixo "this" mas para aceder a membros estáticos e constantes. É óbvio que só funciona dentro da classe, sendo que para chamarmos a função ValidarPassword() de fora da classe, usamos o nome da classe. Verifiquem também que para aceder a membros estáticos sao necessários duplos dois pontos "::" em vez do operador "->", tirando isso é basicamente a mesma coisa.