4

私は両方の魔法のメソッドを使用しています_ callORM/ Activerowのようなものを自分で実装するための _callStatic。それらは主に特定の関数呼び出しをキャッチすることを目的としています: __callはゲッターとセッター、およびメソッド (例: )__callStaticを担当します。findByfindById

外部キーをマップするために、呼び出しを変換して、たとえばgetArticleの値を返すようにしていますArticle::findById()。そのために、私は my 内でこのケースを使用しています__call:

if (strstr($property, "_id")) {  
 return $foreignClass::findById($this->getId()); 
}

ここで、 setまたはget in$propertyの後の部分文字列と残りの文字列です。したがって、呼び出しの場合、$property は get であり、.__call$foreignClassgetArticle$foreignClassArticle

値が正しいことを確認するために、いくつかのエコーを配置しました。ただし、私の__callメソッドは my の代わりに呼び出されます__callStatic。暗黙的な静的メソッドを作成するfindByIdと、呼び出されます(したがって、静的呼び出しとして認識されます)。私が具体的に呼び出すとArticle::findById()__callそれもキャッチします。

これは比較的新しい のエラー__callStaticですか、それとも何か間違っていますか?

編集:問題はこの部分にあるようです:

_call() は、オブジェクト コンテキストでアクセスできないメソッドを呼び出すときにトリガーされます。
__callStatic() は、静的コンテキストでアクセスできないメソッドを呼び出すときにトリガーされます。

クラスで呼び出していますが、オブジェクト コンテキストから呼び出しています。この場合、静的コンテキストに入る方法はありますか?

4

2 に答える 2

3

Activity指定したコードはオブジェクトのコンテキストで実行され、の値$foreignClasArticleの祖先である is であるため、PHP はメソッドの祖先の実装を呼び出すActivityつもりであると想定します。

オブジェクトコンテキストから抜け出すには、この絶対に恐ろしいテクニック以外にオプションはありません。

$id = $this->getById();
return call_user_func(
    function() use($foreignClass, $id) { 
        return call_user_func("$foreignClass::findById", $id);
    }
);
于 2012-11-05T15:40:13.327 に答える
0

__callStaticマジック メソッドは、PHP 5.3 でのみ導入されました。それ以前は、静的呼び出しは__call通常のメソッド呼び出しと同じようにルーティングされていたと思います。私の推測では、5.3 未満の PHP バージョンを使用していると思われます。php -vコマンドラインでの出力は何ですか?

于 2012-11-05T13:17:15.520 に答える