PHP: классы друзей и функция / класс неадекватного вызывающего - PullRequest
2 голосов
/ 27 марта 2010

Есть ли способ получить функцию вызывающего абонента с помощью чего-то еще, кроме debug_backtrace ()?

Я ищу менее жадный способ моделирования областей, например друг или внутренний .

Допустим, у меня есть класс A и класс B.

До сих пор я использовал debug_backtrace(), что слишком жадно (ИМХО).

Я думал о чем-то вроде этого:

<?php

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

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

Может быть, вы захотите ограничить его одним конкретным классом, но, скажем, у меня есть 300 классов, и я хочу ограничить его 25 из них?

Одним из способов может быть использование интерфейса для агрегирования:

public function __construct(CallerInterface $callerObj)

Но это все-таки некрасивый код .

Более того, вы не можете использовать этот трюк с статическими классами.

Есть идеи получше?

Ответы [ 2 ]

6 голосов
/ 27 марта 2010

PHP действительно не предоставляет вам элегантный способ справиться с этим. Не имея смысла начинать флейм языка, я собираюсь осторожно предположить, что ваши навыки и потребности в дизайне, вероятно, превысили ограничения вашего инструмента. PHP является легковесным языком сценариев, в который встроено множество функций псевдо-ООП, но по своей сути он никогда не был предназначен для элегантной корпоративной архитектуры.

2 голосов
/ 27 марта 2010

Вы можете вызвать debug_backtrace(FALSE), что не приведет к заполнению индекса объекта. Это немного ускорит его, но, как правило, в производственном коде следует избегать debug_backtrace, если только ваше приложение не является программным средством, где скорость не является проблемой, или при использовании его для обработки ошибок.

Из того, что я понимаю, вы хотите

  • имеет неявную ссылку на вызывающего абонента, доступную в вызываемом, и
  • внешний доступ к закрытым и защищенным свойствам для выбранных классов.

И то, и другое не существует в PHP ( и нарушает инкапсуляцию imho ). Для обсуждения, пожалуйста, см

...