Action
とMyAction
の2つのクラスがあります。後者は次のように宣言されます:
class MyAction extends Action {/* some methods here */}
必要なのはAction
クラスのメソッドだけです(継承されたクラスがたくさんあるので、このクラスのみを実装します。すべてのクラスにこのメソッドを実装する必要はありません)。静的呼び出し。私が話していることは次のとおりです。
Class Action {
function n(){/* something */}
}
そして、私がそれを呼ぶとき:
MyAction::n(); // it should return "MyAction"
ただし、親クラスの各宣言は、値「Action」を持つ親クラス__CLASS__
変数にのみアクセスできます。
これを行う方法はありますか?
__CLASS__
は常に使用されたクラスの名前を返すため、静的メソッドではあまり役に立ちません。メソッドが静的でない場合は、単に get_class ($ this)を使用できます。例えば.
class Action {
public function n(){
echo get_class($this);
}
}
class MyAction extends Action {
}
$foo=new MyAction;
$foo->n(); //displays 'MyAction'
PHP 5.3がリリースされたので、 late static bindings を使用できます。これにより、定義時ではなく実行時の静的メソッド呼び出しのターゲットクラスを解決できます。 。
この機能は、呼び出されたクラス名を通知する新しいマジック定数を導入しませんが、新しい関数 get_called_class() を提供します。これにより、静的メソッドがあったクラスの名前を通知できます以下に例を示します。
Class Action {
public static function n() {
return get_called_class();
}
}
class MyAction extends Action {
}
echo MyAction::n(); //displays MyAction
5.5以降では、 クラス名の解決にclass
キーワードを使用 を使用できます。これは、関数呼び出しを行うよりもはるかに高速です。インターフェイスでも動作します。
// C extends B extends A
static::class // MyNamespace\ClassC when run in A
self::class // MyNamespace\ClassA when run in A
parent::class // MyNamespace\ClassB when run in C
MyClass::class // MyNamespace\MyClass
これは理想的な解決策ではありませんが、PHP <5.3.0。
コードは septuro.com からコピーされました
if(!function_exists('get_called_class')) {
class class_tools {
static $i = 0;
static $fl = null;
static function get_called_class() {
$bt = debug_backtrace();
if (self::$fl == $bt[2]['file'].$bt[2]['line']) {
self::$i++;
} else {
self::$i = 0;
self::$fl = $bt[2]['file'].$bt[2]['line'];
}
$lines = file($bt[2]['file']);
preg_match_all('/([a-zA-Z0-9\_]+)::'.$bt[2]['function'].'/',
$lines[$bt[2]['line']-1],
$matches);
return $matches[1][self::$i];
}
}
function get_called_class() {
return class_tools::get_called_class();
}
}
今(5.3が到着したとき)それは非常に簡単です:
class MainSingleton {
private static $instances = array();
private static function get_called_class() {
$t = debug_backtrace();
return $t[count($t)-1]["class"];
}
public static function getInstance() {
$class = self::get_called_class();
if(!isset(self::$instances[$class]) ) {
self::$instances[$class] = new $class;
}
return self::$instances[$class];
}
}
class Singleton extends MainSingleton {
public static function getInstance()
{
return parent::getInstance();
}
protected function __construct() {
echo "A". PHP_EOL;
}
protected function __clone() {}
public function test() {
echo " * test called * ";
}
}
Singleton::getInstance()->test();
Singleton::getInstance()->test();
利用可能なPHPバージョンでは、望んでいることを行う方法はありません。PaulDixonのソリューションが唯一のソリューションです。 PHP 5.3、これはベータ版です。