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つの関数は2つの異なることを行いますが、たまたま同じ名前を使用し、別の関数または文字通り「SomeFunction」の内部で使用します、次に、「NewFunctionName」で呼び出すことにより、トレイトから「SomeFunction」を使用します。

上記のシナリオでの私の質問は次のとおりです。\Name\Space\SomeTrait\SomeFunction() 内で、この特性関数も割り当てられた "NewFunctionName" を取得するにはどうすればよいでしょうか? __ FUNCTION __、または__ METHOD __、または__ TRAIT __などの魔法のメソッドを使用すると考える人もいるでしょうが、これらのいずれも期待される結果をもたらさない場合を除きます。パラメータとして機能し、ハッキーなコードになりますか? PHP 5.6 では、新しい Magic Constant __ AS __を追加するか、 __ TRAITの結果を調整する必要があるかもしれません。__ 、 __ TRAIT ____ FUNCTION _が同じ情報 (またはほぼ同じ情報) を返す必要がある理由がわかりません。それが型にはまらないハッキーな方法である場合、どんな助けも素晴らしいでしょう。これに関する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 に答える