Appel privé de méthodes et de propriétés privées à partir de l'extérieur d'une classe en PHP

Je veux un accès privé à des méthodes et des variables à partir de l'extérieur de l'classes dans de très rares cas particuliers.

J'ai vu que ce n'est pas être possible, bien que l'introspection est utilisé.

Le cas spécifique est la suivante:

Je voudrais avoir quelque chose comme ceci:

class Console
{
    final public static function run() {

        while (TRUE != FALSE) {
            echo "\n> ";
            $command = trim(fgets(STDIN));

            switch ($command) {
                case 'exit':
                case 'q':
                case 'quit':
                    echo "OK+\n";
                    return;
                default:
                    ob_start();
                    eval($command);
                    $out = ob_get_contents();
                    ob_end_clean();

                    print("Command: $command");
                    print("Output:\n$out");         

                    break;
            }
        }
    }
}

Cette méthode doit pouvoir être injecté dans le code comme ceci:

Class Demo
{
    private $a;

    final public function myMethod()
    {
        //some code
        Console::run();
        //some other code
    }

    final public function myPublicMethod()
    {
        return "I can run through eval()";
    }

    private function myPrivateMethod()
    {
        return "I cannot run through eval()";
    }
}

(c'est juste une simplification. le réel passe par un support et mettre en œuvre un tas de choses...)

Donc...

Si vous instancier la classe Démo et que vous appelez $demo->myMethod(), vous aurez une console: la console peuvent accéder à la première méthode d'écriture d'une commande comme:

> $this->myPublicMethod();

Mais vous ne pouvez pas exécuter avec succès la seconde:

> $this->myPrivateMethod();

Faire l'un de vous à une idée, ou s'il existe une bibliothèque PHP qui vous permet de le faire?

Merci beaucoup!

Erm... Qui voulez-vous faire des méthodes tagged privé accessible au public? Je veux dire... si vous avez besoin d'y accéder de l'extérieur, il suffit d'utiliser du public. Aussi: Votre console de classe ne fait pas de sens de la façon dont vous l'avez ajouté ici. Il fait pas un usage unique de la programmation orientée objet et est fondamentalement juste une fonction forcé dans une classe.
Pour info while(true) ou for(;;) sont légèrement plus succincte et des méthodes communes de la boucle jusqu'à ce qu'un explicite break ou returnest rencontré.
Comme je l'ai dit précédemment, j'ai fait ça plus comme un POC que d'un exemple réel. La Console réelle de classe a, plus ou moins environ 1k lignes et s'étend de quelques autres par la composition. La maintenabilité du code n'est pas un problème car il sera utilisé comme un composant isolé à l'extérieur du principal projet sur lequel nous travaillons, donc ce n'est pas seulement "une fonction forcé dans une classe", mais un extrait d'une classe qui ne sera pas posté ici, pour éviter que les gens s'énerve. 🙂 @meagar: héhé, j'ai fait le while(TRUE != FALSE) comme une blague, depuis PHP valide FALSE != 0 comme FAUX. merci quand même 😉
et, j'ai oublié de commenter, je n'ai jamais écrit un retour, ni de continuer à l'intérieur d'une fonction, sauf si un PoC. Je pense n'est pas une bonne pratique et des choses comme cela pourrait perturber la lisibilité du code.

OriginalL'auteur Pablo López Torres | 2010-04-29