Réflection

devlop78
Invité n'ayant pas de compte PHPfrance

19 mars 2011, 02:58

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,

ViPHP
ViPHP | 5462 Messages

19 mars 2011, 17:31

regarde du coté de debug_backtrace

devlop78
Invité n'ayant pas de compte PHPfrance

19 mars 2011, 17:50

Intéressant. Je te tiens au jus

devlop78
Invité n'ayant pas de compte PHPfrance

20 mars 2011, 03:04

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+