私はこれを持っています:
$classname
)$propertyname
)そのクラスからプロパティを取得したいのですが、問題はプロパティが静的であり、その方法がわからないということです。
プロパティが静的でない場合、次のようになります。
$classname->$propertyname;
プロパティがメソッドの場合、call_user_functionを使用できた
call_user_func(array($classname, $propertyname));
しかし、私の場合、私はちょうど失われています。しかし、私はそれが可能であることを望んでいます。 PHPが持っている何千もの関数があるので、彼はこれのために何かを持っていたほうがいいでしょう。
ありがとう!
編集:
PHP 5.3.0以降を使用している場合、以下を使用できます。
_$classname::$$propertyname;
_
残念ながら、5.3.0より前のバージョンを使用している場合、 eval()
( get_class_vars()
は機能しません。値が動的な場合)。
_$value = eval($classname.'::$'.$propertyname.';');
_
EDIT:先ほど言ったように get_class_vars()
は値が動的な場合は機能しませんが、明らかに、変数の静的メンバーは "クラスのデフォルトプロパティ"の一部です。次のラッパーを使用できます。
_function get_user_prop($className, $property) {
if(!class_exists($className)) return null;
if(!property_exists($className, $property)) return null;
$vars = get_class_vars($className);
return $vars[$property];
}
class Foo { static $bar = 'Fizz'; }
echo get_user_prop('Foo', 'bar'); // echoes Fizz
Foo::$bar = 'Buzz';
echo get_user_prop('Foo', 'bar'); // echoes Buzz
_
残念ながら、変数の値を設定したい場合は、まだ eval()
を使用する必要がありますが、検証が行われているため、notとても悪。
_function set_user_prop($className, $property,$value) {
if(!class_exists($className)) return false;
if(!property_exists($className, $property)) return false;
/* Since I cannot trust the value of $value
* I am putting it in single quotes (I don't
* want its value to be evaled. Now it will
* just be parsed as a variable reference).
*/
eval($className.'::$'.$property.'=$value;');
return true;
}
class Foo { static $bar = 'Fizz'; }
echo get_user_prop('Foo', 'bar'); // echoes Fizz
set_user_prop('Foo', 'bar', 'Buzz');
echo get_user_prop('Foo', 'bar'); // echoes Buzz
_
set_user_prop()
この検証を使用すると、安全である必要があります。 _$className
_および_$property
_としてランダムなものを配置し始めると、既存のクラスまたはプロパティではないため、関数から終了します。 _$value
_の時点では、実際にコードとして解析されることはないため、そこに何を入れてもスクリプトには影響しません。
私はこれが最も簡単だと思う:
$foo = new ReflectionProperty('myClassName', 'myPropertyName');
print $foo->getValue();
呼び出す必要がある静的変数によって設定された変数値を返すには:
$static_value = constant($classname.'::'.$propertyname);
ドキュメントを確認してください:: PHP Constant Documentation
次のようなことができるはずです。
eval("echo $classname::$propertyname;");
簡単なテストを行っただけで、これが機能しました。より良い方法があるかどうかはわかりませんが、見つけることができませんでした。
「eval」は「evil」に非常に近いように見えます。私はそれを使用したり、コードで見たりするのが嫌いです。他の回答からのいくつかのアイデアを使用して、PHPが5.3以上ではない場合でも回避する方法があります。
コメントに基づくテストを反映するように変更されました。
class A {
static $foo = 'bar';
}
A::$foo = 'baz';
$a = new A;
$class = get_class($a);
$vars = get_class_vars($class);
echo $vars['foo'];
「baz」を出力します。
私が気づいたことの1つは、eval()コマンドがクラス外のスコープで実行されるため、静的クラスで保護されている変数を設定できないことです。これを回避する唯一の方法は、eval()を実行するすべてのクラス内に静的メソッドを実装することです。 call_user_func()[setterメソッドを呼び出す]もクラス内から実行されるため、このメソッドを保護できます。
get_class_vars
はget_object_vars
と同じではありません。
get_clas_vars
は元のプロパティ値を返すはずです。
eval
は問題外だと言っても、以前のPHP 5.3で最も簡単な解決策はeval
を使用することです:
eval("\$propertyval = $classname::\$propertyname;");
echo $propertyval;
関連する可能性のあるもの:PHP- いつ遅延静的バインディングを使用する必要がありますか? 。
ReflectionClassを使用できます。
class foo
{
private static $bar = "something";
}
$class = "foo";
$reflector = new ReflectionClass($class);
$static_vars = $reflector->getStaticProperties();
var_dump($static_vars["bar"]);