Primeiramente, troque de trabalho recentemente (começo do ano), estou agora trabalhando em uma empresa muito criativa e faz excelentes interações com usuário.
Precisei hoje fazer aqui no meu trabalho um método de sobrecarga (overload) numa classe aqui, escrita em PHP5, somente para getters e setters.
Antigamente eu prefiria deixar definido as variáveis que vou trabalhar, organizadinho e tudo mais. Mas percebi que é coisa de desenvolvedor dinossauro. Então comecei a usar e abusar do método __call() nas minhas classes.
Eis um exemplo básico do uso:
<?php
/**
* Overloading básico para classes PHP5
* @author Julio Vedovatto <julio.at.juliovedovatto.com>
* @see http://br.php.net/manual/pt_BR/language.oop5.overloading.php#language.oop5.overloading.methods
*
*/
public function __call($method, $args) {
switch ($type = substr($method, 0, 3)) {
case 'get':
// este truque abaixo foi pego em classes do Magento (lib/Varien/Object.php)
$key = strtolower(preg_replace('/(.)([A-Z])/', "$1_$2", substr($method, 3)));
return isset($this->$key) ? $this->$key : null;
case 'set':
// este truque abaixo foi pego em classes do Magento (lib/Varien/Object.php)
$key = strtolower(preg_replace('/(.)([A-Z])/', "$1_$2", substr($method, 3)));
$this->$key = isset($args[0]) ? $args[0] : null;
return $this;
}
throw new Exception("Type {$type} method inexistent");
}
?>
Colocando esse método em sua classe, você cria getters e setters dinâmicos para sua classe, bastando utilizar nesta forma:
<?php
// Considerando o fato que a classe tenha o método acima
$foo = new Foo();
echo $foo->getBar(); //Como a variável dentro da classe não existe, simplesmente retorna NULL
$foo->setBar("bar");
echo $foo->getBar(); //Mostra na tela "bar"
?>
Simples e indolor, com isso seu código fica elegante e bem-indentado.
Poderia simplesmente definir logo na classe direto as variáveis, desta maneira
<?php
$foo = new Foo();
echo $foo->bar; //Erro de "undefined index"
$foo->bar = "bar";
echo $foo->bar; //Mostrará "bar"
?>
Mas sinceramente, acho isso coisa de “fraco e sem talento“. Não tem muita justificativa sabe? É algo que eu considero de n00b.
Aproveite este código (não esqueça de dar créditos) e otimize ainda mais suas classes em php5.
Obs: uma dica muito boa, se tiver paciência de olhar no source de onde eu extrai um trechinho de código legal (Magento), vai poder ver a implementação para unset() e has() #fikdik