Question

Est-il possible d'obtenir la fonction de l'appelant avec quelque chose d'autre que debug_backtrace ()?

Je suis à la recherche d'une façon moins avide de simuler des étendues comme ami ou interne .

Disons que j'ai une classe A et classe B.

Jusqu'à présent, je me sers debug_backtrace(), ce qui est trop gourmand (à mon humble avis).

Je pensais à quelque chose comme ceci:

<?php

    class A
    {
        public function __construct(B $callerObj) {}
    }

    class B
    {
        public function someMethod()
        {
            $obj = new A($this);
        }
    }
?>

Il est peut-être OK si vous voulez limiter à une classe spécifique, mais disons que j'ai 300 classes, et je veux limiter à 25 d'entre eux?

Une façon pourrait être à l'aide d'une interface pour agréger:

public function __construct(CallerInterface $callerObj)

Mais il est encore un Code laid .

De plus, vous ne peut pas utiliser cette astuce avec statique classes.

Avoir une meilleure idée?

Était-ce utile?

La solution

Vous pouvez appeler debug_backtrace(FALSE), qui sera alors pas remplir l'index de l'objet. Cela accélérer un peu, mais en général, debug_backtrace doit être évitée dans le code de production, à moins que votre application est un outil logiciel où la vitesse est pas un problème ou lors de son utilisation pour le traitement des erreurs.

D'après ce que je comprends, vous voulez

  • avoir une référence implicite à l'appelant disponible dans le callee et
  • un accès extérieur aux propriétés privées et protégées aux classes sélectionnées.

Les deux n'existe pas en PHP ( encapsulation et casse IMHO ). Pour une discussion, s'il vous plaît voir

Autres conseils

PHP ne vraiment pas vous fournir une façon élégante de traiter ce sujet. Sans vouloir commencer une flamewar linguistique, je vais suggérer que précautionneusement vos compétences en conception et les besoins ont probablement dépassé les limites de votre outil. PHP est un langage de script léger qui a eu beaucoup de pseudo-POO fonctionnalités boulonné sur celui-ci, mais en son cœur, il n'a pas été jamais conçu pour l'architecture élégante de l'entreprise.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top