TinyButStrong - the PHP Template Engine
Categories > TBS next version >

Gestion des objets qui surcharge le getter

The forum is closed. Please use Stack Overflow for submitting new questions. Use tags: tinybutstrong , opentbs

By: Magali
Date: 2009-01-27
Time: 13:29

Gestion des objets qui surcharge le getter

Bonjour,

J'utilise des objets qui simulent des propriétés en read only. Pour ce faire, les pseudos propriétés sont stockées dans un array privé sous la forme nom => valeur. Pour accéder à ces propriétés, j'ai surchargé le getter avec la fonction magique __get. Afin de pouvoir tester l'existence de ces propriétés, je surcharge aussi le isset avec la fonction magique __isset. Tout fonctionne correctement jusqu'à ce qu'un de ces objets soit utilisé par TinyButStrong.

En fait, TBS utilise la fonction property_exists pour valider l'existence d'une propriété d'un objet avant le merge (ligne 892 de la version 3.0.4 en php5). Or dans le cas que je décris plus haut, la fonction property_exists retourne toujours false, puisque la propriété n'est pas effectivement déclarée dans l'implémentation de l'objet.

Du coup, pour que ça fonctionne, j'ai modifier le code comme suit :
Avant :
if (method_exists($Value,$x)) {
    $x = call_user_func_array(array(&$Value,$x),$ArgLst);
} elseif (property_exists($Value,$x)) {
    $x =& $Value->$x;
} else {

Après :
if (method_exists($Value,$x)) {
    $x = call_user_func_array(array(&$Value,$x),$ArgLst);
} elseif (property_exists($Value,$x)) {
    $x =& $Value->$x;
} elseif (isset($Value->$x)) {
    $x =$Value->$x;
} else {

De cette manière, sans modifier le comportement original de TBS (puisque si la propriété de l'objet est déclarée de manière "normale", le second elseif n'est pas exécuté), il est possible de gérer les objets tels que je les décris plus haut, à la condition que ceux-ci, en plus d'implémenter la fonction magique __get implémente aussi la fonction magique __isset.

Je n'assure pas que cela soit la meilleure solution pour résoudre mon problème original mais en tout cas, ça fonctionne dans mon cas. Je voulais donc vous informer de cette petite modification.
By: Magali
Date: 2009-01-27
Time: 15:20

Re: Gestion des objets qui surcharge le getter

Voici d'autres petites modifications que j'ai apportées sur TBS v3.0.4 afin qu'il fonctionne pour mon projet :

Ligne 231 à 233
Avant :
} elseif (isset($Var->$x)) {
    $Var =& $Var->$x;
} else {

Après :
} elseif (property_exists(get_class($Var)$x)) {
    if 5isset($Var->$x))
        $Var =& $Var->$x;
} elseif (isset($Var->$x))
    $Var = $Var->$x;
} else {

La raison est que dans le cas que j'ai décrit dans le premier post, le =& lève une erreur "Indirect modification of overloaded property".

---

J'ai aussi observé une erreur :

Fatal error: Call to undefined method clsTbsDataSource::f_Misc_CheckArgLst() in /home/mbo/repo/Supervision/trunk/click3/php/thirdparty/tbs_class_php5.php on line xxx

En y regardant de plus près, la fonction f_Misc_CheckArgLst est définie comme une méthode de la classe clsTinyNutStrong. en dupliquant la méthode dans la classe TbsDataSource, cela résout le problème.

J'ai du mal à voir comment mes modifications précédentes peuvent avoir généré une telle erreur, cela dit il est possible que ce soit lié. Si j'ai le temps de fouiller net que je trouve des raisons plus précises, je vous tiendrai au courant.
By: Skrol29
Date: 2009-01-27
Time: 23:08

Re: Gestion des objets qui surcharge le getter

Bonjour Magali,

Merci de pour cette remontée de correctif, je vais me penchre dessus bientôt car je prépare la version suivante de TBS.

Pour ce qui est du f_Misc_CheckArgLst() , c'est une erreur déjà répertoriée. Il faut remplacer
  $this->f_Misc_CheckArgLst
par
  $this->TBS->f_Misc_CheckArgLst
en ligne 227.