Singleton Pattern no PHP 4

Tags: , — September 11, 2008 @ 12:39 am

Já sabemos como funciona o singleton pattern no PHP 5, mas devido as capacidades limitadas de POO do PHP4, não é possível se utilizar do mesmo padrão de desenvolvimento neste, mas há um pequeno truque que podemos fazer para obter o mesmo resultado.

No PHP4 não é possível termos propriedades estáticas em classes, mas ainda é possível ter variáveis estáticas dentro de funções. Assim podemos criar uma função capaz de fazer o papel do singleton ao instanciar uma classe em um objeto estático. Veja o Exemplo:

function &singleton() {
    static $obj;
 
    if (!isset($obj)) {
        //instancia a classe, caso o objeto já não exista
        $obj = new stdclass;
    }
    return $obj;
}

No exemplo, eu usei a classe padrão stdclass do PHP, mas o mesmo funciona com qualquer classe definida pelo usuário. Você pode, inclusive, utilizar um array no lugar da variável $obj para usar a mesma função singleton para instanciar ou recuperar várias classes.

Note o operador de referência ‘&’ antes do nome da função. Ele é necessário para garantir que a função sempre retorne uma referência para o objeto estático, ao invés de criar um novo objeto, e também é necessário ao se atribuir o retorno da função a uma variável . Veja um exemplo de uso da função:

$foo =& singleton(); //cria um objeto
var_dump($foo);
 
$foo->property = 'SamuraiDio'; //atribui um valor a uma propriedade
var_dump($foo);
 
$bar =& singleton(); //recupera o objeto existe (não irá criar um novo)
var_dump($bar);

A saída do código acima, será como a seguir:

object(stdClass)(0) {
}
object(stdClass)(1) {
  ["property"]=>
  string(10) "SamuraiDio"
}
object(stdClass)(1) {
  ["property"]=>
  string(10) "SamuraiDio"
}

Note que a terceira chamadas a var_dump() ainda exibe o valor da propriedade, apesar de ser de outra variável. Isso ocorre porque nossa função singleton() não instancia a classe novamente, mas sim apenas retorna uma referência para o objeto já existente. Assim temos um Singleton Pattern functional também para PHP4.

NOTA: Mesmo com a possibilidade de usar Singleton no PHP4 utiizando-se desta técnica, é altamente recomendável atualizar suas instalações para PHP5, beneficiando-se com a maior capacidade e segurança da versão.

Fontes: http://www.weberdev.com/get_example-4014.html, http://br.php.net/manual/pt_BR/language.variables.scope.php#language.variables.scope.static

Se você gostou deste artigo, inscreva-se em meu RSS feed!