4

メソッド呼び出しのチェーンを振り返って、呼び出しのチェーンのどの時点にいるかを判断することは可能ですか? 少なくとも、メソッドがチェーンの最後の呼び出しであるかどうかを識別することは可能ですか?

$instance->method1()->method2()->method3()->method4()

オブジェクトのインスタンスを返すプロパティを使用して同じことを行うことは可能ですか?

$instances->property1->property2->property3->property4
4

5 に答える 5

2

呼び出しているすべてのメソッドが同じオブジェクトを返して流暢なインターフェイスを作成している場合 (異なるオブジェクトを連鎖させるのではなく)、メソッド呼び出しをオブジェクト自体に記録するのは簡単です。

例えば:

class Eg {
    protected $_callStack = array();

    public function f1()
    {
        $this->_callStack[] = __METHOD__;
        // other work
    }

    public function f2()
    {
        $this->_callStack[] = __METHOD__;
        // other work
    }

    public function getCallStack()
    {
        return $this->_callStack;
    }
}

次に、次のように呼び出しをチェーンします

$a = new Eg;
$a->f1()->f2()->f1();

array('f1', 'f2', 'f1'); のようにコール スタックを残します。

于 2009-07-27T02:44:27.863 に答える
1

連鎖メソッドの場合、PHP5のオーバーロードメソッド(この場合は__call)を使用できます。

連鎖プロパティを追跡する理由はわかりませんが、これを行うことを主張する場合は、クラスで__getオーバーロードメソッドを使用して、必要な機能を追加できます。

上記の提案の使い方がわからない場合はお知らせください。

于 2009-07-24T15:47:38.470 に答える
1

debug_backtrace() は、次のメソッドが呼び出される前に各メソッドが戻るため、「流暢なインターフェイス」(図に示されている「連鎖」の適切な名前) の使用に関して正しくありません。

于 2009-07-24T15:58:21.980 に答える
0
$instances->property1->property2->property3->property4->method();

また

$instances->property1->property2->property3->property4=some_value

最初の質問については、チェーンのどこにいるかを追跡するためのコードを追加する必要があります。

于 2009-07-24T15:44:47.883 に答える
0

クラスが最後のメソッド呼び出しがいつ行われたかを知るための実行可能な方法はないと思います。なんらかの->execute();が必要だと思います。チェーンの最後での関数呼び出し。

その上、私の意見ではそのような機能を有効にすると、コードが魔法になりすぎてユーザーを驚かせたり、バグのある症状を示したりする可能性があります。

于 2009-07-24T23:02:44.593 に答える