2010-03-27 2 views
2

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

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

Скажем, у меня есть класс А и класс 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)

Но это все еще некрасиво код.

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

Есть идеи?

+1

Я не могу ответить на ваш вопрос относительно части php, однако я хочу прокомментировать, что использование интерфейса - это очень надежное и надежное решение. Ничего уродливого в этом нет. По крайней мере, не в примере, который вы предоставляете. – Henri

+0

@ Хенри: Как я уже сказал в своем посте «Более того, вы * не можете использовать этот трюк со статическими классами *». – avetisk

ответ

2

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

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

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

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

+1

Спасибо за обе ссылки. Я обнаружил, что команда разработчиков PHP * «решает против деклараций друзей» *: http://bugs.php.net/bug.php?id=34044 Это действительно так плохо. В любом случае, спасибо за совет! – avetisk

6

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

+0

+1 для тонкой, но очень истинной точки! – Henri

+1

Пожалуйста, объясните, какой язык подходит для элегантной архитектуры предприятия. Также объясните, почему PHP занимает 3 место в индексе Tiobe и почему самая большая социальная сеть в мире работает на PHP? Кроме того, пожалуйста, объясните, почему аргумент.caller устарел в JavaScript1.3, когда было изящно иметь возможность неявно получить доступ к внешней области от вызываемого. – Gordon

+3

Популярность чрезвычайно слабо соотносится с качеством дизайна, если вообще. Как я сказал выше, я решил не начинать войну с языковым пламенем, и я явно избегал делать какие-либо другие предложения по платформе именно по этой причине. Если вы хотите обсудить достоинства языка, мы можем сделать это в автономном режиме, но это не место для этого аргумента. –

Смежные вопросы