2010-04-08 1 views
0

Ceci est difficile. Je suis "émulant" ZF Bootstrapping (apparence de surface). Ne me demandez pas pourquoi, appelez ça un intérêt académique. J'ai donc un Bootstrap Abstract avec une méthode "run" qui se répète sur lui-même pour localiser les méthodes préfixées avec "init".Empêche l'invocation de la méthode d'instance X à partir du contexte! = Y

L'application recherche une classe définie par l'utilisateur qui étend cette classe, dans laquelle l'utilisateur peut définir n'importe quel nombre de méthodes de cette manière. Cependant, je veux empêcher l'utilisateur d'être capable d'exécuter la commande "run" de sa classe parente, tout en exposant la même commande pour le code client.

class Bootstrap_Abstract{ 
    protected final function run(){ 
    // if method exists that starts 'init' - execute the method 
    } 

} 

class Bootstrap extends Bootstrap_Abstract(){ 
    public function initSomething(){ 
    //do something 
    } 

    //PREVENT THIS 
    public function initRun(){ 
     $this->run(); 
    } 

} 

//application code, not exposed to user - changes in behaviour require changes in this code directly 
class Application(){ 
    $Bootstrap = new Bootstrap();//load user bootstrap 
    $Bootstrap->run(); 
} 
+0

Pouvez-vous élaborer un peu sur cette phrase: "Je veux empêcher l'utilisateur d'être en mesure d'exécuter la commande" run "de sa classe parente, tout en exposant le même commande pour le code client "? Je ne comprends pas très bien. – thetaiko

+0

Connexe: [équivalent PHP d'ami ou interne] (http://stackoverflow.com/q/317835/212218) –

Répondre

1

Pour déterminer « ce » appelle une méthode particulière, regarder dans debug_backtrace

+0

L'OP illustre un exemple de [le problème XY] (http://meta.stackexchange.com/q/66377/164291). Bien que ce soit techniquement la réponse à la question, ce n'est pas vraiment la bonne solution au problème du PO. –

0

Post Script: le problème avec mon code d'origine était une erreur dans la conception. La responsabilité de l'itération via les méthodes Bootstrap doit avoir été attribuée à la classe invoquante, pas à la classe cible elle-même. J'ai résolu ce problème en déplaçant la fonction sur l'invocateur. Drôle comment le refactoring évident/simple est en recul ...

Questions connexes