【问题标题】:Anyone know of a PHP Magic Constant for Trait's Redefined Name in a Class?任何人都知道类中特征重新定义名称的 PHP 魔术常量吗?
【发布时间】:2013-10-05 02:33:05
【问题描述】:

为了简单起见,我注意到 PHP 似乎没有提供任何神奇的常量来确定类中特征已更改为什么名称。由于这听起来让我感到困惑,我将举一个例子,因为它相当简单,并且希望它出现在新的 PHP 5.5 中,我看不到这样做的方法。所以这里是:

假设我们有一个类,它使用了一些与类中的某些函数冲突的特征,例如:

class SomeClass {
    use \Name\Space\SomeTrait    { SomeFunction as private NewFunctionName; }

    function SomeFunction() {
        $this->NewFunctionName();
    }
}

因为,显然这个类有“SomeFunction”函数,而且我们知道在 SomeTrait 中我们包含了一个函数,该函数在名称上与我们在这个类中的函数匹配。现在,由于“SomeFunction”通过 \Name\Space 内部的特征进入这个类,这两个函数做了 2 件不同的事情,但碰巧使用相同的名称,并且在另一个函数内部或字面上是我们的“SomeFunction” ,然后我们使用 trait 中的“SomeFunction”,通过“NewFunctionName”调用它。

所以希望我没有在这里失去任何人,因为这是我在上述情况下的问题。在 \Name\Space\SomeTrait\SomeFunction() 中,如何获得也分配了此 trait 函数的“NewFunctionName”?人们会想到使用一种神奇的方法,例如 __FUNCTION__,或 __METHOD__,甚至__TRAIT__,除了这些都没有给出预期的结果,所以有没有人知道一种方法来获取这些信息而不将其作为参数传递给函数并导致哈克代码?也许 PHP 5.6 需要添加一个新的 Magic Constant __AS__,或者调整 __TRAIT__ 的结果,我不明白为什么 __TRAIT____FUNCTION_ 需要返回相同的信息(或几乎相同的信息)。任何帮助都会很棒,如果它是一种非常规的hacky方法,我有兴趣看到我的选项,直到我可以用php打开一个关于这个的错误报告。 (如果它真的是一个错误)

编辑:

我目前的,最不老套的方法似乎是,

 debug_backtrace()[0]['function']

虽然它可以工作,但我觉得获得一个简单的字符串需要做很多事情,尤其是如果你经常使用这个函数。 :/

【问题讨论】:

  • 你找到答案了吗?我也有同样的问题。

标签: php traits magic-constants


【解决方案1】:

这是我最终使用的解决方案。这不是很好,但可能比使用 debug_backtrace 函数更好。

问题示例:

Trait ExampleTrait {
    protected function doSomethingRecursive() {
        // this is a problem because it could be renamed
        $this->doSomethingRecursive(); 
    }
}

解决方案示例:

Trait ExampleTrait {

    protected function doSomethingRecursive() {
        // this is a problem because it could be renamed
        $this->__internal_doSomethingRecursive(); 
    }

    private function __internal_doSomethingRecursive() {
        // this works because the class would have 
        // used and renamed the above function 
        // but this "internal" function *should*
        // remain available under it's original name
        $this->__internal_doSomethingRecursive(); 
    }

}

当然可以打破这一点,但在大多数情况下应该没问题。您还可以在内部函数名称中包含特征名称以进一步防止冲突。

【讨论】:

    【解决方案2】:

    您当前的解决方案将是最好的,只需进行一些调整:

    debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS,1)[0]['function']
    

    那里的DEBUG_BACKTRACE_IGNORE_ARGS1 的帧限制将使回溯更浅、更快,并且使用更少的内存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-13
      • 1970-01-01
      • 1970-01-01
      • 2014-08-13
      • 2011-06-10
      • 1970-01-01
      相关资源
      最近更新 更多