【问题标题】:If function called internally如果函数在内部调用
【发布时间】:2013-03-07 15:39:43
【问题描述】:

是否有任何方法可以识别函数是否从 PHP 中的同一类中调用? 除了使用debug_backtrace 之类的东西吗?

更新:

这是我目前正在做的:

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

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

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

【问题讨论】:

  • 您是在寻找通用解决方案还是单一案例解决方案?您是否需要提供函数列表以及是否多次调用它们或检查它的确切功能?
  • Caller function in PHP 5?的可能重复
  • 案例解决方案。我需要检查函数(调用时)是在类内(由另一个函数)调用还是从外部调用(作为属于控制器的方法)
  • 你想在这里实现什么?你的代码有麻烦吗?或者你不想传递这个额外的参数?
  • @aorcsik 所有解决方案都依赖debug_backtrace,我已经知道了

标签: php class function internal


【解决方案1】:

我不确定你为什么要这样做;这种要求是可疑的,通常是有充分理由的。

也就是说,您可以使用附加参数创建public 函数的protected 克隆,该参数告诉您调用者是内部还是外部,并使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
}

【讨论】:

  • 有趣的解决方法,但不......这只会让事情变得复杂。 Tnx 反正
  • 不幸的是,如果您需要知道 __call 是由类本身调用还是在外部调用,这将不起作用。
【解决方案2】:

我不知道。我通过一个额外的可选参数解决了类似的问题,该参数在从类内部调用时传递了一个值。

HTH :)

【讨论】:

    【解决方案3】:

    可以在 NetBeans 中调试 PHP,例如您可以看到 debugging in NetBeans。此外,您可以在sseful PHP tools 上找到有用的工具,例如 Webgrind 或 Xdebug。

    【讨论】:

    • debug_backtrace 我已经提到过...而在实时服务器上,我没有 NetBeans...
    猜你喜欢
    • 2014-04-24
    • 2021-02-10
    • 1970-01-01
    • 2012-01-12
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    • 2015-04-03
    • 1970-01-01
    相关资源
    最近更新 更多