Constantes e métodos de classe (estáticos) são muito utilizados em frameworks, especialmente para reuso de código e organização de escopo. Em PHP, pode-se usar a palavra-chave self
para acessar uma constante de classe a partir de um método estático da própria classe. Por exemplo:
class CarrinhoDeCompras { const SESSION_KEY = 'com.firma.ecommerce.carrinho'; static function getFromSession() { if(isset($_SESSION[self::SESSION_KEY])) return $_SESSION[self::SESSION_KEY]; return $_SESSION[self::SESSION_KEY] = new CarrinhoDeCompras(); } ... // restante do código do carrinho }
Este código encapsula dentro da classe CarrinhoDeCompras
a obtenção de um objeto da sessão, com uma chave fixa chamada SESSION_KEY, declarada com a palavra-chave const
. A variável self
poderia ser substituída pelo próprio nome da classe, mas seu uso deixa o código mais independente, facilitando possíveis refactorings (e.g., renomeação da classe).
O acesso ao método estático do exemplo é feito através do operador ::
, como a seguir:
$cestaDoUsuario = CarrinhoDeCompras::getFromSession();
Post atualizado em 5/4/2009, depois do comentário do Diego Sampaio (obrigado! ;).
O código sugerido gera um Notice caso o PHP esteja configurado para exibição do mesmo, eu sugiro o seguinte código para o método getFromSession():
if (isset($_SESSION[self::SESSION_KEY])) {
return $_SESSION[self::SESSION_KEY];
} else {
$_SESSION[self::SESSION_KEY] = new CarrinhoDeCompras();
return $_SESSION[self::SESSION_KEY];
}
assim fica mais enxuto — método getFromSession()
if (! isset($_SESSION[self::SESSION_KEY])) {
$_SESSION[self::SESSION_KEY] = new CarrinhoDeCompras();
}
return $_SESSION[self::SESSION_KEY];
Existe alguma contra indicação ou desvantagem (além de não poder utilizar os métodos contrutores e destrutores) em utilizar o acesso estático aos métodos em toda aplicação?
também percebo que mesmo que o método não seja declarado como “static”
a chamada por “::” funciona… tem algum problema em não em utilizar dessa forma?