2017-09-01 26 views
2

現在のクラスと拡張クラスを拡張するクラスの名前を取得:PHP:動的に私は抽象クラスを持っている

abstract class MyAbstract { 
    public function getName(){echo static::class;} 
} 

class MyExtends extends MyAbstract {} 
getName()が呼び出されたときに、私は動的に任意の拡張クラスの名前を取得したいと思い

$c = new MyExtends(); 
echo $c->getName(); // expect: "MyExtends" 

これはPHP 5.6+(demo)でうまく動作しますが、私が働いているプロジェクトは、PHP 5.3に制限されていると私はそれを変更するレバレッジを持っていません。そのバージョンでは、パースエラーがスローされます。

Parse error: syntax error, unexpected T_CLASS, expecting T_STRING or T_VARIABLE or '$'

は、だから私はに機能を変更:もちろん

public function getName(){echo __CLASS__;} 

、これはただの親の名前エコー - MyAbstractを、それは動作しません。 。私が考えたのはgetName()をそれぞれの拡張クラスの新しい実装でオーバーライドすることですが、それはうまく拡張されません。継承の全ポイントは、親に共通のコードベースを集中することです(もちろん、実際の関数は1ライナー)。

PHP 5.3で抽象親クラスのコンテキストからどのように拡張クラス名を動的に取得できるか考えてみましょうか?

答えて

2

あなたは、クラスの名前を取得するためにget_classを使用することができます。

<?php 
abstract class MyAbstract 
{ 
    public function getName() 
    { 
     echo get_class($this); 
    } 
} 

class MyExtends extends MyAbstract 
{ 
} 

$c = new MyExtends(); 
echo $c->getName(); // expect: "MyExtends" 

demo:https://ideone.com/TtMtZ7

上記のコードは、(5.0.4以降)すべてのバージョンで動作するはずです。たぶん

+1

ありがとうございます。はい、期待どおりに動作します。回答を改善するために、ドキュメントへのリンクを追加してください:http://php.net/manual/en/function.get-class.php – BeetleJuice

+0

@BeetleJuice - リンクは利用できましたが、ドイツ語:P-は英語に変更されました。どうも。 –

+0

クールサイト(ideone.com);私はそれについて知らなかった。 – BeetleJuice

2

public function getName(){get_class($this);} 

は、しかし、それをテストしていません。

+1

あなたの本能は正しいです。それは – BeetleJuice

+0

優れています。がんばろう – ASOlivieri

関連する問題