PHP:классы друзей и функция / класс вызывающего абонента ungreedy
-
22-09-2019 - |
Вопрос
Есть ли какой-нибудь способ получить вызывающую функцию с помощью чего-то другого, кроме 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)
Но это все еще уродливый код.
Более того, вы не могу используйте этот трюк с статический классы.
Есть какая-нибудь идея получше?
Решение
Ты можешь позвонить debug_backtrace(FALSE)
, который затем не будет заполнять индекс объекта.Это немного ускорит работу, но, как правило, в производственном коде следует избегать debug_backtrace, если только ваше приложение не является программным инструментом, где скорость не является проблемой, или при использовании его для обработки ошибок.
Насколько я понимаю, вы хотите
- иметь неявную ссылку на вызывающий объект, доступную в вызываемом объекте, и
- внешний доступ к частным и защищенным свойствам для выбранных классов.
И то, и другое не существует в PHP (и нарушает инкапсуляцию, имхо).Для обсуждения, пожалуйста, смотрите
Другие советы
PHP на самом деле не предоставляет вам элегантного способа справиться с этим.Не имея в виду запускать language flamewar, я собираюсь осторожно предположить, что ваши навыки проектирования и потребности, вероятно, превысили ограничения вашего инструмента.PHP - это легкий скриптовый язык, в который встроено множество псевдо-ООП-функций, но по своей сути он никогда не был разработан для элегантной корпоративной архитектуры.