Curso POO PHP Métodos máxicos

De Manuais Informática - IES San Clemente.
Ir a la navegación Ir a la búsqueda

Métodos máxicos

En PHP5 introducíronse os chamados métodos máxicos, entre eles __set e __get. Se se declaran estes dous métodos nunha clase, PHP invócaos automaticamente cando dende un obxecto se intenta usar un atributo non existente ou non accesible. Por exemplo, o código seguinte simula que a clase Produto ten calquera atributo que queiramos usar.

class Produto {
    private $atributos = array();
        
    public function __get($atributo) {
        return $this->atributos[$atributo];
    }
    public function __set($atributo, $valor) {
        $this->atributos[$atributo] = $valor;
    }
}

Do mesmo xeito, cando se intenta empregar as funcións isset ou empty sobre un atributo que non existe ou non é accesible, invocarase ao método máxico __isset se existe. E á función unset correspóndelle o método máxico __unset.

Unha opción semellante para os métodos das clases, é utilizar o método máxico __call para capturar chamadas a métodos que non estean implementar na clase. Este método recibe como primer argumento o nome empregado na chamada, e como segundo un array coa lista de argumentos. Entón, en función do nome do método e do número de argumentos que se pasen, poderíanse realizar unhas accións ou outras. Deste xeito é posible simular a sobrecarga de métodos de C++.

class Produto {
    ...
    public function __call($nome, $argumentos) {
        switch($nome) {
           case "xxx":
                       ...
        }
    }
    ...
}

O método máxico __callStatic é semellante a _call, pero permite capturar chamadas a métodos estáticos inexistentes.

Tamén existe unha forma sinxela de personalizar a copia de obxectos para cada clase particular. Podes crear un método máxico de nome __clone na clase. Este método chamarase automaticamente cando se emprega a palabra clone sobre un obxecto, despois de copiar todos os atributos no novo obxecto.

class Produto {
         
    public function __clone($atributo) {
        $this->codigo = novo_codigo();
    }
         
}

Se a nosa clase define un método máxico de nome __toString, este chamarase cando se empregue un obxecto da mesma como se fora unha cadea de texto, por exemplo dentro dun echo ou dun print. Este método debe devolver unha cadea de texto.

En PHP tamén tes a opción de personalizar o proceso de serialización e deserialización dun obxecto, utilizando os métodos máxicos __sleep e __wakeup. Se na clase está definido un método con nome __sleep, execútase antes de serializar un obxecto. Igualmente, se existe un método __wakeup, execútase con calquera chamada á función unserialize.

Ademáis dos métodos máxicos anteriores (e algún outro que se pode consultar na documentación de PHP), PHP resérvase o posible uso futuro como método máxico de calquera nome de método que comence por un dobre guión baixo "__" (underscore), polo que é recomendable non empregalos para outros fines nas clases que desenvolvamos.

--Víctor Lourido 20:25 27 jun 2013 (CEST)