https://manuais.iessanclemente.net/index.php?title=Curso_POO_PHP_M%C3%A9todos_m%C3%A1xicos&feed=atom&action=historyCurso POO PHP Métodos máxicos - Historial de revisiones2024-03-29T01:46:56ZHistorial de revisiones de esta página en el wikiMediaWiki 1.36.2https://manuais.iessanclemente.net/index.php?title=Curso_POO_PHP_M%C3%A9todos_m%C3%A1xicos&diff=36244&oldid=prevVlourido: /* Métodos máxicos */2013-06-27T23:57:03Z<p><span dir="auto"><span class="autocomment">Métodos máxicos</span></span></p>
<p><b>Página nueva</b></p><div>== Métodos máxicos ==<br />
<br />
En PHP5 introducíronse os chamados '''[http://www.php.net/manual/es/language.oop5.magic.php 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.<br />
<br />
<source lang="PHP"><br />
class Produto {<br />
private $atributos = array();<br />
<br />
public function __get($atributo) {<br />
return $this->atributos[$atributo];<br />
}<br />
public function __set($atributo, $valor) {<br />
$this->atributos[$atributo] = $valor;<br />
}<br />
}<br />
</source><br />
<br />
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'''.<br />
<br />
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++.<br />
<br />
<source lang="PHP"><br />
class Produto {<br />
...<br />
public function __call($nome, $argumentos) {<br />
switch($nome) {<br />
case "xxx":<br />
...<br />
}<br />
}<br />
...<br />
}<br />
</source><br />
<br />
O método máxico '''__callStatic''' é semellante a _call, pero permite capturar chamadas a métodos estáticos inexistentes.<br />
<br />
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.<br />
<br />
<source lang="PHP"><br />
class Produto {<br />
… <br />
public function __clone($atributo) {<br />
$this->codigo = novo_codigo();<br />
}<br />
… <br />
}<br />
<br />
</source><br />
<br />
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.<br />
<br />
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.<br />
<br />
Ademáis dos métodos máxicos anteriores (e algún outro que se pode consultar na [http://www.php.net/manual/es/language.oop5.magic.php 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.<br />
<br />
--[[Usuario:Vlourido|Víctor Lourido]] 20:25 27 jun 2013 (CEST)</div>Vlourido