Fork me on GitHub

PHP e os métodos mágicos

April 07, 2008 at 17:56

O PHP tem uma funcionalidade muito útil que são os Magic Methods, eles nos permitem fazer overload de atributos e métodos, tornando nossos objetos ainda mais dinâmicos.

Porém tenho uma pergunta que ainda não tem resposta: Por que ao invés de criar os "métodos mágicos" não foi criado uma interface para isso?

Hoje é possével, por exemplo, fazer com que um objeto se comporte como um array, para isto basta implementar uma interface, chamada ArrayAccess, essa interface provê quatro métodos:

    <li>offsetExists: retorna um boolean dizendo se a chave acessada existe no objeto</li>
        <li>offsetGet: retorna o valor referente a chave passada</li>
        <li>offsetSet: define o valor para uma chave dentro do objeto</li>
        <li>offsetUnset: serve para apagar o valor de uma chave dentro do objeto</li>
        

Esses métodos não são chamados diretamente, eles são acessados através de caracteristicas da linguagem. Vamos analisar o trecho de código abaixo:


    $objeto = new ArrayObject(); // classe interna do PHP
                                 // que implementa ArrayAccess
    if(!isset($objeto["chave"])) {
        $objeto["chave"] = "valor da chave";
        echo $objeto["chave"];
    }
    else {
        unset($objeto["chave"]);
    }
    
O exemplo fez uso de todos os métodos da interface ArrayAccess, no if foi chamado offsetExists, dentro dele, na atribuição, foi chamado offsetSet, logo abaixo, na impressão da variável, offsetGet, no else foi chamado offsetUnset, quando a variável foi apagada. Na declaração da variável nós poderiamos usar um $objeto = array(); normalmente que tudo funcionaria do mesmo jeito, porém não teriamos a caracteristica OOP, nem poderiamos fazer outras operações ao verificar uma variável, setar uma variável, pegar o valor de uma variável e apagar uma variável. OK, mas o que isso tem a ver com os métodos mágicos do PHP? Tudo! Os métodos prefixados com __ não precisariam existir, poderiam estar encapsulados em uma interface, assim como ArrayAccess, tornando tudo mais OOP, que umas das promessas do PHP5. Infelizmente acredito que isso não vá mudar, e teremos que viver com isso pra sempre :( Os métodos mágicos não são a pior coisa do mundo, mas poderiam ser implementados de uma forma mais interessante, dando até mais credibilidade para a linguagem e sua promessa de linguagem orientada a objetos.