2009-03-23 8 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

@ 주름, 텍스트에 과감한 추가 습관을 가지지 마세요. 많은 사람들의 것만큼이나 도움이되지 않습니다. 감사! – 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 인스턴스를 만드는 것이 훨씬 더 (더 우아한) 방법이라고 생각합니다. 몇 가지 의견을 남긴 후에도이 코드 (및 제 대답)를 편집했습니다. 보호 된 변수에 대한 예제를 추가했습니다. 물론 클래스 외부에서 액세스 할 수는 없으므로 정적 getter를 만들고 변수 패턴을 사용하여 호출합니다. 당신은 몇 가지 다른 방법으로 사용할 수 있습니다 :

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

당신이 시도 적이 있습니까?

+2

질문은 4 살이며 명시 적으로 구 버전의 PHP를 참조합니다. 여기서'$ class : : $ bar' 아직 가능하지 않았습니다. –

관련 문제