La classe Entity qui simulerait les accesseurs...

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/...


Go Back   Usenet Forums > PHP Programming Forums > alt.comp.lang.php

FAQ Members List Calendar Search Today's Posts Mark Forums Read
  #1 (permalink)  
Old 06-27-2006
Xavier Serrand
 
Posts: n/a
Default La classe Entity qui simulerait les accesseurs...

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


Reply With Quote
  #2 (permalink)  
Old 06-27-2006
Jahjah92
 
Posts: n/a
Default Re: La classe Entity qui simulerait les accesseurs...

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+


Reply With Quote
  #3 (permalink)  
Old 07-01-2006
Xavier Serrand
 
Posts: n/a
Default Re: La classe Entity qui simulerait les accesseurs...

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+
>
>



Reply With Quote
  #4 (permalink)  
Old 07-01-2006
Jahjah92
 
Posts: n/a
Default Re: La classe Entity qui simulerait les accesseurs...

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+


Reply With Quote
Reply


Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are Off
[IMG] code is Off
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On



All times are GMT +1. The time now is 11:11 AM.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO 3.0.0