2017-12-17 4 views
1

メソッドsaveToTable($ table)を持つクラスバーがありますが、$ tableのデフォルト値が必要ですが、その値は動的である必要があります。動的値は、バーが拡張されているクラスの名前にする必要があります。PHPでクラス名を取得し、文字列に変換して変数に格納する方法はありますか?

class Bar { 

    public function saveToTable($table) { 

    } 

} 



class Foo extends Bar { 

} 

$bar = new Foo; 

$bar->saveToTable(); // in which case saveToTable() would have a param of 'foo' i.e. saveToTable('foo'); 

現時点で私が使用しています解決策は、明示的にバーを拡張し、それをそれらのクラスの名前の文字列値を割り当てるすべてのクラス内の$表のプロパティを指定しているが、これは私のアプリを作るの目的を台無しにしてしまいます動的であり、それはかなり面倒でエラーになりやすいでしょう。

+1

これは本当に悪いデザインですが、削除する必要があります。クラスの名前のような実装の詳細とビジネスロジックを混在させないでください。 –

+0

大丈夫、そうです、それであなたは何をお勧めしますか? – Alex

答えて

0

代わりの名前を取得することができますメソッドのデフォルト値を持つパラメータを使用する(動的に割り当てることはできません) somethigの使用を検討してください次のようになります。

class Bar { 

    protected $classname; 

    public function __construct() { 
     $this->classname = static::class; 
    } 

    public function saveToTable() { 
     echo $this->classname; 
    } 
} 

ここでsaveTotable()内にクラス名が文字列としてあります。

class Foo extends Bar { 

} 

$bar = new Foo; 

$bar->saveToTable(); // will echo 'Foo' 
1

あなたが拡張クラスに参照するlate static bindingでそれを行うことができますすることは

はあなたのBarクラス

class Bar{ 

    public function getClassName() 
    { 
     return static::class; 
    } 
} 

をこのメソッドを追加し、今は

$bar = new Foo(); 

$bar->getClassName(); // returns Foo 
0

別の解決策は、名前空間について世話をする、多分あなたは

class Bar 
{ 
    public function saveToTable() 
    { 
     //Without namespace 
     $table = substr(static::class, strlen(__NAMESPACE__) + 1); 
     //With namespace 
     $table = static::class; 
    } 
} 

class Foo extends Bar 
{ 
} 

$bar = new Foo; 
$bar->saveToTable(); 
関連する問題