拡張 PHP クラスの静的呼び出しからクラス名の取得
オブジェクト指向プログラミングでは、クラスは基本クラスを拡張してその機能を継承および拡張することがよくあります。 。一般的なシナリオでは、CLASS が常に定義クラスの名前を返すにもかかわらず、拡張クラスの静的メソッド呼び出しからクラス名を取得する必要があります。
問題: 親静的メソッドのクラス名にアクセスできない
2 つのクラス Action と を持つシナリオを考えてみましょう。 MyAction。MyAction は Action を拡張します。 Action は静的メソッド n() を定義しますが、親静的メソッド内の CLASS 定数からはアクセスできず、結果として CLASS
が生成されます。呼び出しに関係なく、値が「Action」に設定されるclass.解決策:
1.後期静的バインディング (PHP 5.3 ):
後期静的バインディングを使用すると、メソッドの定義時ではなく、実行時に静的メソッド呼び出しのターゲット クラスを決定できます。これは、get_called_class()
関数を使用して実現されます。この関数は、静的メソッドが呼び出されたクラスの名前を返します。例:class Action {
public static function n() {
return get_called_class();
}
}
class MyAction extends Action {
}
echo MyAction::n(); // Outputs "MyAction"
classアクション {
パブリック静的関数 n() {
get_called_class() を返します。
}
}
class MyAction extends Action {
}
echo MyAction::n(); // "MyAction"2 を出力します。 get_class($this) の使用 (非静的メソッドのみ):
問題のメソッドが静的でない場合は、get_class($this)
を使用してクラスを取得できます。メソッドの呼び出し元の名前。例:class Action {
public static function n() {
return get_called_class();
}
}
class MyAction extends Action {
}
echo MyAction::n(); // Outputs "MyAction"
class Action {
パブリック関数 n() {
エコー get_class($this);
}
}
class MyAction extends Action {
}
$foo = 新しい MyAction;
$foo->n(); // Outputs "MyAction"結論:
遅延静的バインディングと get_class($this) の両方が、静的メソッド呼び出しからクラス名を取得するソリューションを提供します。拡張クラス。静的メソッドには遅い静的バインディングが推奨されますが、非静的メソッドには get_class($this) が役立ちます。免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3