2010-08-03 3 views
0

그래서 내가 PHP에서 같은 것을 할 수 있습니다 알고PHP 동적 객체 속성이 작동하도록 만드는 방법이 있습니까?

<?php 

    $x = 'a'; 
    $a = 5; 
    echo $$x; 

어떤 출력합니다 (5);

하지만 개체/속성에는 작동하지 않습니다. 이 코드를 작동시키는 방법이 있습니까?

<?php 

class FooBar 
{ 
public $foo; 
public $bar; 

public function __construct() 
{ 
    $this->foo = 'foo'; 
    $this->bar = 'bar'; 
} 
} 

$FooBar = new FooBar(); 

$str = 'FooBar->foo'; 

echo $$str; 

답변

2

이 가까이 있습니다

class FooBar 
{ 
public $foo; 
public $bar; 

public function __construct() 
{ 
    $this->foo = 'foo'; 
    $this->bar = 'bar'; 
} 
} 

$FooBar = new FooBar(); 

$str = 'FooBar->foo'; 
list($class,$attribute) = explode('->',$str); 

echo $$class->{$attribute}; 
4
class FooBar 
{ 
public $foo; 
public $bar; 

public function __construct() 
{ 
    $this->foo = 'foo'; 
    $this->bar = 'bar'; 
} 
public function getFoo() 
{ 
    return $this->foo; 
} 
} 
$fb = new FooBar(); 
$classname = "fb"; 
$varname = "bar"; 

echo call_user_func(array($fb, "getFoo")); // output "foo" 
echo call_user_func(array($$classname, "getFoo")); // same here: "foo" 
echo $$classname->{$varname}; // "bar" 

참조 call_user_func 설명서. 또한 $ fb -> {$ property_name}과 같은 속성에 액세스 할 수 있습니다.

존재하지도 않는 속성으로 작업하는 데 사용할 수있는 마법 방법 __get도 있습니다.

+0

+1 __get 마법 방법의 제안 –

+0

이론적으로는 반사 API http://php.net/reflection을 사용할 수도 있습니다. 꽤 자세한 것이지만 성능이 우수 할 것이라고는 기대하지 않습니다. 구체적으로, 당신은'$ o = new ReflectionObject ($$ classname); echo $ o-> getProperty ($ varname);' –

1

PHP 먼저 객체 또는 클래스에 작업을 평가해야하기 때문에

$str = 'FooBar->foo'; /* or */ $str = 'FooBar::foo'; 
echo $$str; 

을 할 수 없습니다. 가변 변수는 변수의 값을 취해 변수의 이름으로 취급합니다. $FooBar->foo은 작업이 아닌 이름입니다. 이 생각을 할 수있는 :

$str = 'FooBar'; 
$prop = 'foo'; 
echo $$str->$prop; 

PHP Manual on Variable Variables에서 :

클래스 속성은 변수 속성 이름을 사용하여 액세스 할 수 있습니다. 가변 속성 이름은 호출이 이루어진 범위 내에서 확인됩니다. 예를 들어, $ foo -> $ bar와 같은 표현식이 있으면 로컬 범위가 $ bar에 대해 검사되고 그 값이 $ foo의 속성 이름으로 사용됩니다. $ bar가 배열 액세스 인 경우에도 마찬가지입니다. 수동에서

예 :

class foo { 
    var $bar = 'I am bar.'; 
} 

$foo = new foo(); 
$bar = 'bar'; 
$baz = array('foo', 'bar', 'baz', 'quux'); 
echo $foo->$bar . "\n"; 
echo $foo->$baz[1] . "\n"; 

echo 호출 출력 "나는 줄 생각"합니다.

관련 문제