Page 1 sur 1

Réflection

Posté : 19 mars 2011, 02:58
par devlop78
Bonjour,

Je cherche à déterminer l'origine de transmission d'un argument dans une méthode (connaître la classe qui a évoquée la méthode plus exactement), ou sinon, appeler une méthode privée ou protégée. J'ai trouvé ReflectionMethod::setAccessible() mais il n'est disponible qu'à partir de PHP 5.3.2

Avez-vous une idée ?

Cordialement,

Re: Réflection

Posté : 19 mars 2011, 17:31
par stealth35
regarde du coté de debug_backtrace

Re: Réflection

Posté : 19 mars 2011, 17:50
par devlop78
Intéressant. Je te tiens au jus

Re: Réflection

Posté : 20 mars 2011, 03:04
par devlop78
Nickel :

$askOrigine = debug_backtrace();
$askOrigine = $askOrigine[1]['object'];
if (!$askOrigine instanceOf EC_Global_Collection) trigger_error('Call to protected method ' . __METHOD__ . '()', E_USER_ERROR);

Je peux ainsi simuler la méthode protégée (mais qui doit pourtant rester accessible depuis des méthodes de tout objet de la classe EC_Global_Collection).

J'ai même réussi à l'utiliser afin d'économiser un argument. Le fait de savoir d'où vient la demande de la méthode est vraiment bien. Cela m'a permis de construire deux classes Collection et Item en 'arbre' infini avec gestion de parenté. Ainsi ces deux utilisations m'ont permis de définir automatiquement le père d'un item (par exemple $papa->addChild($enfant), $enfant renverra pour getParent() l'objet $papa), avec en luxe l'impossibilité d'ajouter un objet qui serait déjà père ou grand père (ou grand grand père etc) dans un objet (ce qui évite entre autres les boucles infinies d'objet....).

Donc grand merci à toi pour m'avoir aider à finaliser ces deux classes complétement inutiles dans mon application (un simple objet collection me suffisait ^^, mais ce serait le grand luxe pour la gestion des items du menu héhé la classe ->getParent() ^^).

A+