2009-03-23 4 views
25

可変クラス名を使用して、クラス内の静的変数にアクセスしようとしています。私は、クラス内機能にアクセスするためにあなたがcall_user_func()を使用することを承知している:

class foo { 
    function bar() { echo 'hi'; } 
} 
$class = 'foo'; 
call_user_func(array($class, 'bar')); // prints hi 

しかし、これは動作しませんクラス内の静的変数にアクセスしようとすると:

class foo { 
    public static $bar = 'hi'; 
} 
$class = "foo"; 
call_user_func(array($class, 'bar')); // nothing 
echo $foo::$bar; // invalid 

この変数はどうやって取得できますか?それも可能ですか?私はこれがPHP 5.3でのみ利用可能であり、PHP 5.2.6を実行しているという悪い考えを持っています。

+0

@Krinkle、大胆なテキストを追加する習慣を身に付けてはいけません。多くの人のことをほぼ助けません。ありがとう! – sarnold

答えて

24

reflectionこれをする。クラス名を指定してReflectionClassオブジェクトを作成し、getStaticPropertyValueメソッドを使用して静的変数値を取得します。

class Demo 
{ 
    public static $foo = 42; 
} 

$class = new ReflectionClass('Demo'); 
$value=$class->getStaticPropertyValue('foo'); 
var_dump($value); 
+0

私は、$ propが "public static"以外のものであれば、getStaticPropertyValue($ prop)が動作していないことに気付きました。 $ propがクラス内で「private static」または「protected static」と宣言されている場合は、borkになります。私は確かに理由は分かっていない。 – brianjcohen

+10

これは意味があります。なぜなら、公開されていなければ、クラス外からアクセスするべきではないからです。 – adudley

21

静的メンバを呼び出すために、あなたは、このようなコードを使用することができます:

call_user_func("MyClass::my_static_method"); 
// or 
call_user_func(array("MyClass", "my_static_method")); 

残念ながらオブジェクトから静的メンバを取得する唯一の方法は、get_class_vars()のようだ:あなたが使用することができます

$vars = get_class_vars("MyClass"); 
$vars['my_static_attribute']; 
24

ReflectionClassインスタンスを作成する方がずっと良い(よりエレガントな)方法があると思います。いくつかのコメントの後、このコード(と私の答え)も編集しました。私は保護された変数の例を追加しました(もちろん、クラスの外からそれらにアクセスすることはできませんので、静的ゲッターを作成し、可変パターンを使用して呼び出します)。あなたは、いくつかの異なる方法でそれを使用することができます。

class Demo 
{ 
    public static $foo = 42; 
    protected static $boo = 43; 
    public static function getProtected($name) { 
     return self::$$name; 
    } 
} 

$var1 = 'foo'; 
$var2 = 'boo'; 
$class = 'Demo'; 
$func = 'getProtected'; 
var_dump(Demo::$$var1); 
var_dump($class::$foo); 
var_dump($class::$$var1); 
//var_dump(Demo::$$var2); // Fatal error: Cannot access protected property Demo::$boo 
var_dump(Demo::getProtected($var2)); 
var_dump($class::getProtected($var2)); 
var_dump($class::$func($var2)); 

ドキュメントはこちらです:

http://php.net/manual/en/language.variables.variable.php

+1

'Demo'が変数であればこれはうまくいかないと思っていましたが、それはあります:' $ class :: $$ field' – mpen

+0

そうです。私はそれを書くことを忘れました - ありがとう! – Karol

+1

'$ class :: $$ field'はPHP 5.3以上を使用している場合にのみ動作します。 – jamietelin

2

あなたはこれを試してみますか?

class foo { 
    static public $bar = "Hi"; 

    static public function bar() { 
     echo "Hi"; 
    } 
} 

echo foo::$bar; // Output: Hi 
foo::bar(); // Output: Hi 

$class = "foo"; 
echo $class::$bar; // Output: Hi 
$class::bar(); // Output: Hi 
call_user_func($class, 'bar'); // Output: Hi 
+2

質問は4歳です。明示的に古いPHPバージョンを参照しています。 '$ class: :$ bar'はまだできませんでした。 –

関連する問題