23/01/2012

PHP OO: Criando Getters e Setters automaticamente das classes em PHP

Todo desenvolvedor sabe que, ao criar um projeto orientado a objetos do zero, é muito trabalhoso pois, além de criarmos as classes e os atributos das mesmas, também temos que criar os métodos que irão modificar cada instância desse objeto.

Falando então sobre as classes do domínio do projeto, apesar de serem classes simples de serem projetadas, podem se tornar trabalhosas caso o número de atributos seja muito grande, o que não é muito difícil de acontecer.


O grande trabalho dessas classes é construir os métodos de setters e getters, que são métodos que servem para atribuirmos valores aos atributos e retornarmos esses valores, respectivamente.

É claro que, se você utiliza uma IDE como o NetBeans, você terá todos os recursos para criar esses métodos automaticamente. Porém, se você for utilizar o computador de um amigo, ou da casa de um parente e precisar trabalhar, provavelmente esse computador não terá o NetBeans ou qualquer seja a IDE que você utilize e você terá muito mais trabalho para criar suas clasesse. Caso você seja como eu, e nem sempre utiliza uma IDE robusta com vários recursos e prefere programar na mão, utilizando somente um “Bloco de Notas” especial, como o Notepad++, com alguns recursos e que é executado diretamente do HD externo (ou Pen Drive), aproveite abaixo a dica de como criar automaticamente os métodos de uma classe do domínio.

Antes de tudo, quero informar que não colocarei as tags do PHP, <?php e ?>, para que a colocação das mesmas já esteja subentendida.

Primeiro passo, crie sua classe somente com os atribuitos em protected:

class Usuario {

    protected $codigo;
    protected $nome;
    protected $login;

}


No PHP, quando você define a visibilidade dos atributos como protected, você está impedindo que esse atributo seja modificado diretamente. O que não aconteceria se ele fosse public.

Agora crie uma classe chamada Entity, onde o nome do arquivo será Entity.class.php, por padrão.

O código-fonte da classe Entity é o seguinte:

class Entity {

    public function __call($methodName, $args) {
        if (preg_match('~^(set|get)([A-Z])(.*)$~', $methodName, $matches)) {
            $property = strtolower($matches[2]) . $matches[3];
            if (!property_exists($this, $property)) {
                throw new MemberAccessException('Property ' . $property . ' not exists');
            }
            switch ($matches[1]) {
                case 'set':
                    $this->checkArguments($args, 1, 1, $methodName);
                    return $this->set($property, $args[0]);
                case 'get':
                    $this->checkArguments($args, 0, 0, $methodName);
                    return $this->get($property);
                case 'default':
                    throw new MemberAccessException('Method ' . $methodName . ' not exists');
            }
        }
    }

    public function get($property) {
        return $this->$property;
    }

    public function set($property, $value) {
        $this->$property = $value;
        return $this;
    }

    protected function checkArguments(array $args, $min, $max, $methodName) {
        $argc = count($args);
        if ($argc < $min || $argc > $max) {
            throw new MemberAccessException('Method ' . $methodName . ' needs minimaly ' . $min . ' and maximaly ' . $max . ' arguments. ' . $argc . ' arguments given.');
        }
    }

}

Para que os getters e setters sejam criados automaticamente, basta que você faça uma inclusão da classe no arquivo e uma herança da classe Entity para a classe em questão. A chamada desses métodos acontece, pois o método __call, criado na classe herdada, é um método que faz sobrecarga de métodos, no PHP. Desta forma, veja abaixo como vai ficar sua classe Usuario:

include_once 'Entity.class.php';

class Usuario extends Entity {

    protected $codigo;
    protected $nome;
    protected $login;

}


Você não verá os métodos na classe que herdou Entity, porém, ao instanciar um objeto basta utilizar set e get, antes dos nomes dos atributos e terá sucesso em atribuir ou obter o valor de um atribuito, como segue abaixo:

$usuario = new Usuario();
$usuario->setNome('Nome do usuario');

//para verificar o resultado
var_dump($usuario->getNome());

Ao utilizar-se deste recurso, você estará facilitando a reutilização de código e ganhando um certo tempo no cronograma do seu projeto.

Obrigado a todos e até o próximo post! Não se esqueça de curtir a nossa FanPage no Facebook e cadastrar o seu e-mail para receber as postagens por e-mail.

?>

Nenhum comentário: