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.