PHP: Constantes e métodos estáticos

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! ;).

This entry was posted in PHP and tagged , , , , , . Bookmark the permalink.

3 Responses to PHP: Constantes e métodos estáticos

  1. Diego Sampaio says:

    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];
    }

  2. Marcos says:

    assim fica mais enxuto — método getFromSession()

    if (! isset($_SESSION[self::SESSION_KEY])) {
    $_SESSION[self::SESSION_KEY] = new CarrinhoDeCompras();
    }

    return $_SESSION[self::SESSION_KEY];

  3. 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?

Comments are closed.