3

为了简单起见,我注意到 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() 中,如何获得也分配了该特征函数的“NewFunctionName”?有人会考虑使用一种魔术方法,例如__ FUNCTION ____ METHOD __,甚至__ TRAIT __,除非这些方法都没有给出预期的结果,所以有没有人知道一种方法来获取此信息而不将其传递给函数作为参数并导致hacky代码?也许 PHP 5.6 需要添加一个新的 Magic Constant __AS __,或者调整__ TRAIT的结果__,我不明白为什么__ TRAIT ____ FUNCTION _需要返回相同的信息(或几乎相同的信息)。任何帮助都会很棒,如果它是一种非常规的hacky方法,我有兴趣看到我的选项,直到我可以用php打开一个关于这个的错误报告。(如果它真的是一个错误)

编辑:

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

 debug_backtrace()[0]['function']

虽然它有效,但我觉得获得一个简单的字符串需要做很多事情,特别是如果你经常使用这个函数。:/

4

2 回答 2

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(); 
    }

}

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

于 2015-01-10T00:10:26.807 回答
1

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

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

和那里的DEBUG_BACKTRACE_IGNORE_ARGS帧限制1将使回溯变浅,更快,并使用更少的内存。

于 2015-07-29T06:57:23.610 回答