7
votes

Restreindre ce qui peut créer une classe PHP

J'ai deux classes, "A" et "B". Dans la logique de l'application, personne n'est autorisé à créer un objet de classe "B", à l'exception de la classe "A". Mais, étant donné que je ne veux pas avoir les deux classes dans le même dossier, je ne peux pas restreindre la compétence "privée".

est-il possible de créer ce type de restriction? Si quelqu'un d'autre, alors "A" tente de créer un objet de classe "B", vous dites pisse off!


1 commentaires

Je suis intéressé de savoir pourquoi vous voudriez faire cela?


5 Réponses :


0
votes

Dans le constructeur de B, exigez que l'A soit transmis. Lorsque vous voulez être B de A, créez un B et passez-le dans A. Lorsque le nouveau B est appelé, il nécessitera une transmission de la transmission. < Pré> xxx


3 commentaires

En réfléchissant à ce sujet qui est correct. Permettez-moi de tester ce qui se passe si un singleton suit.


Vous pouvez également cloner une instance existante de B. et, étant donné que la classe sera instanciée par ceux qui écrivent le code de toute façon, il y a très peu de points de restreindre l'accès de cette façon. La classe A et B aura également une douleur à tester de cette façon, puisque a une dépendance codée en papier et B nécessite toujours une simule. La fabrication de B un singleton vous jettera complètement en enfer. Imo la valeur que vous obtenez pour restreindre l'accès Cela ne vaut pas la peine.


Peut-être qu'une meilleure solution serait d'utiliser des phpcs. Créer votre propre renifleur pour détecter la météo B a été appelé de A. Chaque fois que vous souhaitez déployer le code, exécutez simplement le renifleur et voyez s'il l'attrape



5
votes

Vous pouvez inspecter la backtrage: xxx


2 commentaires

Si vous allez cet itinéraire, vous devriez réfléchir à la manière dont il fonctionne. La fonction s'appelle Débogou _backTrace pour une raison.


Oh, plus que convenu Gordon, mais c'est une solution!



7
votes

Ceci est aussi hacky que possible et vous ne devriez pas l'utiliser. Je posterai seulement, parce que j'aime les choses hacky;) En outre, cela lancera une erreur si le rapport d'erreur E_STRICT CODE> E_STRICT est activé:

class B
{
    private function __construct() {}

    public function getInstance() {
        if (!isset($this) || !$this instanceof A) {
            throw new LogicException('Construction of B from a class other than A is not permitted.');
        }

        return new self;
    }
}

class A
{
    function someMethod() {
        $b = B::getInstance(); // note that I'm calling the non-static method statically!
    }
}


2 commentaires

N'oubliez pas que bien que cela fonctionne, il provoque PHP de cracher un e_strict .


Si quelqu'un vraiment veut utiliser ce piratage, il active mieux error_rporting (-1) et utiliser @ $ b = b :: geInstance (); , mais je ne suis pas sûr que le @ supprimera toutes les avertissements / erreurs générées dans la méthode getInstance



0
votes

Vous voulez peut-être utiliser quelque chose comme ceci:

class A
{
        protected function __construct ()
        {
        }
}

class B extends A
{
        public function __construct ()
        {
                $a = new A();
        }
}

$b = new B();


0 commentaires

-1
votes

Utilisez get_called_class à Découvrez quelle classe tente d'instancier un objet: xxx


1 commentaires

Cela ne fonctionnerait que si A étendrait b et b ont été construits, pas a .