PHP:классы друзей и функция / класс вызывающего абонента ungreedy

StackOverflow https://stackoverflow.com/questions/2528671

Вопрос

Есть ли какой-нибудь способ получить вызывающую функцию с помощью чего-то другого, кроме 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 - это легкий скриптовый язык, в который встроено множество псевдо-ООП-функций, но по своей сути он никогда не был разработан для элегантной корпоративной архитектуры.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top