Если функция вызывается внутри

Есть ли способ определить, была ли функция вызвана из того же класса в PHP? Помимо использования чего-то вроде debug_backtrace?

Обновлять:

Это то, что я сейчас делаю:

class Alex {
  function __construct()
  {
     $this->internal = false;
  }

  function a()
  {
    $this->internal = true;
    $this->b();
  }

  function b()
  {
    if($this->internal) 
      // ...
    else
      // ...
  }
}

person Alex    schedule 07.03.2013    source источник
comment
Вы ищете общее решение или решение для одного случая? Вам нужно предоставить список функций и, если они вызывались более одного раза, или проверить его на предмет точной функции?   -  person Michael    schedule 07.03.2013
comment
возможный дубликат вызывающей функции в PHP 5?   -  person aorcsik    schedule 07.03.2013
comment
О решении дела. Мне нужно проверить, вызывается ли функция (при вызове) внутри класса (другой функцией) или извне (как метод, принадлежащий контроллеру)   -  person Alex    schedule 07.03.2013
comment
Чего именно вы хотите здесь добиться? Ваш код создает проблемы? Или вы не хотите передавать этот дополнительный параметр?   -  person Michael    schedule 07.03.2013
comment
@aorcsik все решения полагаются на debug_backtrace, о чем я уже знаю   -  person Alex    schedule 07.03.2013
comment
@ 360flowMichael Цель этого - узнать, что возвращать внутри функции. Потому что, если он вызывается извне (например, http://site.com/controller/method, мне придется возвращать что-то другое, как если бы он вызывался из класса. Но хорошо, на данный момент швы, что решение, которое я использую, на данный момент является лучшим)   -  person Alex    schedule 07.03.2013
comment
Я знаю, что вы уже упоминали debug_backtrace, но почему вы против? Если вы хотите отследить, откуда вызывается определенная функция/метод, то это единственное место, на которое вы можете посмотреть. В debug_backtrace нет ничего плохого. Что меня больше беспокоит, так это то, что вам действительно нужна такая функциональность, но это другая история.   -  person w00    schedule 07.03.2013
comment
Я не против, я просто пытался посмотреть, есть ли другие способы (помимо упомянутых 2-х). Ну, я думаю, мне придется решить, какой из них использовать, и пойти на это.   -  person Alex    schedule 07.03.2013


Ответы (3)


Я не уверен, почему вы хотите это сделать; такого рода требования подозрительны, и обычно на то есть веские причины.

Тем не менее, вы можете сделать protected клон функции public с дополнительным параметром, который сообщает вам, был ли вызывающий объект внутренним или внешним, и сделать версию public зависимой от реализации protected.

class Before
{
    public foo() { /* code here */ }
}

class After
{
    public foo() { $this->fooCore(false); }
    protected fooCore($calledFromInside = true) { /* code here */ }

    // At this point you should make sure that you never call $this->foo()
    // directly from inside class After
}
person Jon    schedule 07.03.2013
comment
интересный обходной путь, но нет... это только усложнит ситуацию. Tnx в любом случае - person Alex; 07.03.2013
comment
К сожалению, это не сработает, если вам нужно знать, был ли __call вызван самим классом или извне. - person Nick; 28.02.2017

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

ХТХ :)

person splash21    schedule 07.03.2013

Можно отлаживать PHP, например, в NetBeans так же, как вы можете увидеть при отладке в NetBeans. Кроме того, вы можете найти полезные инструменты вполезных инструментах PHP, например Webgrind или Xdebug.

person Mihai8    schedule 07.03.2013
comment
debug_backtrace я упомянул об этом... и на рабочем сервере у меня нет NetBeans... - person Alex; 07.03.2013