1


0

以下はクラスの階層とコードの例です。 私が探しているのは、 'ChildClass1’または 'ChildClass2’が、それぞれの子クラスでそれを再実装することなく、静的メソッドwhoAmI()が呼び出されたかどうかを判断する方法です。


5 Answer


7


私があなたが言及しているのは、既知のphpバグだと思います。 Php 5.3では、この問題を新しいLate Static Binding機能で解決することを目指しています。


2


クラス識別は、よく理解されていない多型の症状です。

ChildClass1とChildClass2のクライアントは、それらを区別する必要はありません。

どのクラスも `someObject.whoAmI()`について尋ねるべき場所はありません。

`if someObject.whoAmI()== 'ChildClass1' {do X(someObject)}`と書くことを急がなければならないときはいつでも、さまざまなChildClassのさまざまな実装で、本当に `X()`メソッドをParentClassに追加するべきです。

この種の「実行時型識別」は、ほとんど常に適切な多相クラス設計に置き換えることができます。


2


PHP 5.3が広く利用可能になったので、この質問に対する要約回答をまとめて、新しく利用可能になった手法を反映させたいと思いました。

他の答えで述べたように、PHP 5.3は新しいhttp:// phpを通してhttp://php.benscom.com/manual/en/language.oop5.late-static-bindings.php[Late Static Binding]を導入しました。 benscom.com/manual/en/language.oop5.static.php [static]キーワード。 同様に、クラスメソッド内でのみ使用できる新しいhttp://php.benscom.com/manual/en/function.get-called-class.php [get_called_class()]関数も利用可能です(インスタンス)または静的)。

この質問で尋ねられたようにクラスを決定するためには、 `get_called_class()`関数が適切です。


userには、 get_called_class()に関するメモがいくつか含まれています。 `debug_backtrace()`の使用


1


PHP 5.3以降は staticキーワードを使用することで可能になるでしょうが、今のところそれは不可能です。


0


いいえ PHP 5.3を待ちます。