2010-08-03 146 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魔術方法的建議 – 2010-08-03 08:05:26

+0

您理論上也可以使用反射API http://php.net/reflection,儘管它會非常冗長,我不希望性能會很好。具體來說,你需要'$ o = new ReflectionObject($$ classname); echo $ o-> getProperty($ varname);' – 2010-08-03 08:21:23

1

這是不可能做到

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

,因爲PHP必須的操作首先評估的對象或類。一個變量變量接受一個變量的值,並把它當作變量的名字。 $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調用將輸出 「我吧」。

相關問題