This is a discussion on La classe Entity qui simulerait les accesseurs... within the alt.comp.lang.php forums, part of the PHP Programming Forums category; Sur le site PHP France, j'ai trouvé un exemple de code "magique"... http://www.phpfrance.com/tutoriaux/...
|
|||||||
| FAQ | Members List | Calendar | Search | Today's Posts | Mark Forums Read |
|
|||
|
Sur le site PHP France, j'ai trouvé un exemple de code "magique"...
http://www.phpfrance.com/tutoriaux/i...-methodes-magi ques-avec-php-5#a4 abstract class Enttity { public function __call($method, $attrs) ... } class MaClass extends Entity { protected $prop1; protected $prop2; } Le script définit une calsse Entity dont est tirée la méthode copiée Elle est sensée permettre d'écrire des classes qui, descendant d'Entity, n'ont pas besoin de définir les getters et setters explicitement.. Les appels monObj->getProp1() appellent bien __call Une prmière fois __call est appelé avec le nom de la méthode (setProp1("maval") par exemple) comme premier argument Mais cet appel retourne au milieu de la fonction __call Un deuxième appel , avec pour premier argument "get" va jusqu'au gestionnaire d'exception... et le script prend fin avec un "La méthode set n'existe pas public function __call($method, $attrs) { $prefix = substr($method, 0, 3); $suffix = chr(ord(substr($method, 3, 1)) + 32); $suffix .= substr($method, 4); $cattrs = count($attrs); if (property_exists($this, $suffix)) { if ($prefix == 'set' && $cattrs == 1) { //Je commente ici : le premier appel retourne ici return $this->set($suffix, $attrs[0]); } if ($prefix == 'get' && $cattrs == 0) { return $this->get($suffix); } } //Je commente : le deuxième appel sort ici trigger_error("La méthode $method n'existe pas."); } Je ne comprends pas très bien le mécanisme sous-jascent... .... ni ce qui cloche dans mon utilisation de ce script... xavier |
|
|||
|
Bonjour xavier,
l'auteur dit que cette classe n'est pas utilisable en l'état, et c'est vrai .. Malheureusement la suite des exemples ne la complete pas entierement. En effet , MaClass utilise SA définition de __call quand tu appelles setProp1, celle ci tente d'appeller $this->set(...). La fonction set n'est définie nulle part, ni dans MaClass , ni dans sa parente Entity ( qui tente de la trouver qd même grâce à sa propre def de __call ). Voilà, il faut augmenter le code en ajoutant des fonctions set et get qui utilisent réellement les variables, voire, pour le jeu , utiliser __set et __get. En esperant avoir été clair. a+ |
|
|||
|
Hello Lahjah,
en lisant le code, il m'avait semblé que l'intéret de la fonction call était de dispenser le programmeur d'écrirre des setters et des getters ... dans le cas contraire... pourquoi écrire ce code sioux pour invoquer des méthodes qui pourraient l'être directement par leur nom?... Xavier "Jahjah92" <jahjah92@free.fr> a écrit dans le message de news: 44a19cf2$0$19200$626a54ce@news.free.fr... > Bonjour xavier, > l'auteur dit que cette classe n'est pas utilisable en l'état, et c'est vrai > . > Malheureusement la suite des exemples ne la complete pas entierement. > En effet , MaClass utilise SA définition de __call quand tu appelles > setProp1, celle ci tente d'appeller $this->set(...). > La fonction set n'est définie nulle part, ni dans MaClass , ni dans sa > parente Entity ( qui tente de la trouver qd même grâce à sa propre def de > __call ). > Voilà, il faut augmenter le code en ajoutant des fonctions set et get qui > utilisent réellement les variables, voire, pour le jeu , utiliser __set et > __get. > En esperant avoir été clair. > a+ > > |
|
|||
|
Bonjour,
> en lisant le code, il m'avait semblé que l'intéret de la fonction call > était de dispenser le programmeur > d'écrirre des setters et des getters ... dans le cas contraire... pourquoi > écrire ce code sioux pour > invoquer des méthodes qui pourraient l'être directement par leur nom?... L'exemple tel quel ne fait pas ce que tu veux, mais en le completant ça te permettra d'avoir setMavar($value) plutôt que set("MAvar",$value). C'est pas enorme mais bon , ça evite quand même d'ecrire tous les setters/getters de chaque variable. Il y a plein de cas pour utiliser ces méthodes. Lis plûtot ça : http://www.php.net/manual/fr/languag...verloading.php a+ |
![]() |
| Thread Tools | |
| Display Modes | |
|
|