Как получить класс, который создал текущий объект? - PullRequest
2 голосов
/ 02 августа 2010

Я хотел бы предотвратить выполнение foo () любым другим классом, кроме B. Как я могу проверить, какой класс создал объект A?

<?php
class A
{
    public function foo()
    {
        if (.... B )    // what should be on the dotts?
           echo 'I\'m created by class B, which is fine';
        else
           echo 'Execution of foo() is not allowed';
    }
}

class B
{
    public function go()
    {
        $a = new A;
        $a->foo();
    }
}

class C
{
    public function go()
    {
        $a = new A;
        $a->foo();
    }
}

$b = new B;
$b->go();  // result: I\'m created by class B, which is fine

$c = New C;
$c->go();  // result: 'Execution of foo() is not allowed'

Ответы [ 2 ]

3 голосов
/ 02 августа 2010

Часто задаваемый вопрос (например, Как получить имя вызываемой функции в __construct без debug_backtrace ), но в хорошо спроектированном приложении классу не обязательно знать, откуда он вызывается или для предотвращения создания экземпляра при запросе.

Если вам нужен этот тип ограничений, то сделайте свой класс закрытым атрибутом основного класса, которому разрешен доступ к нему.

Если вам абсолютно необходимо это сделать, передайте вызывающую функцию в качестве аргумента методу, а не ужасающе неэффективному методу debug_backtrace.

0 голосов
/ 02 августа 2010

Вместо этого объявите foo в классе B и сделайте его закрытым и, необязательно, окончательным. Зачем хотеть определить в A метод, который может быть вызван только B?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...