2009-07-24 12 views
4

メソッドコールの連鎖を反省して、どのような時点でコールの連鎖にあるのかを判断できますか? 少なくとも、メソッドがチェーン内の最後の呼び出しであるかどうかを判別することは可能ですか?PHPメソッドチェーン - リフレクション?

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

オブジェクトのインスタンスを返すプロパティを使用して同じことを実行できますか?最初の質問については

$instances->property1->property2->property3->property4 
+1

興味のある方は、これをやりたい理由を説明できますか?クラスが外部からどのように呼び出されるかをクラスが知りたいと思うのは少し奇妙なようです。 –

答えて

0
$instances->property1->property2->property3->property4->method(); 

OR

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

:ないあなたがチェーンのどこにいるかを追跡するためにいくつかのコードを追加せずに。

1

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

チェーンされたプロパティを追跡する必要はありませんが、これを主張する場合は、クラスの__getオーバーロードメソッドを使用して目的の機能を追加することができます。

上記の提案の使い方を理解できなかった場合は教えてください。

+0

これはこれまでのところ最良のアプローチだと思われますが、チェーン化されたメソッド/プロパティ呼び出しの位置を追跡する必要がある理由はまだ分かりません。 –

1

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

+1

あなたは正しいです。答えを修正しました。これを指摘していただきありがとうございます。 –

0

最後のメソッドコールがいつ行われたかをクラスが知ることができる方法はないと思います。私はあなたが何らかの種類の - > execute();が必要だと思います。チェーンの終わりにある関数呼び出し。

私の意見では、このような機能を有効にするとコードが魔法になりすぎてユーザーが驚き、バグが発生する可能性があります。

+0

これは私の意図です。 ORMを書いている間、魔法は間違いなくメニューにあります! –

2

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

例:

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

よう

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

その後の連鎖のコールのようなコールスタックのままになります 配列( 'F1'、 'F2'、 'F1を');

+0

これは私が考えたアプローチの1つですが、データの一部が返されたオブジェクトから離れてしまい、それほど密着していません。 主な問題は、私がチェーンの終わりにいるときをまだ判断できないということです。だから私は "$ a-> f1() - > f2() - > f1() - > go();"鎖の終わりを引き起こす。 –

+1

そうですね、「チェーンの終わり」を自動的に検出する方法はないと思います。 SQLクエリを作成しようとしている場合(私の推測では、他のコメントがあります)、クラス内に__toStringマジックメソッドを実装すると、コールスタックを調べて最終的なSQL文字列を生成できます。これは、Zend Frameworkの多くのビューヘルパーが実装されている方法です。 echo $ a-> f1() - > f2() - > f1();を実行します。 (または他の関数が文字列を列にする)__toString()メソッドを暗黙的に呼び出すと、go()メソッドの処理を行います。 –

関連する問題