2013-03-29 124 views
2

如何執行一個類的所有字段的foreach,無論是從該類還是從沒有?例如,考慮以下類:關於所有對象屬性的foreach

class Foo 
{ 
    public $a; 
    public $b; 
    private $c; 
    private $d; 

    public function __construct($params) 
    { 
     foreach($params as $k=>$v){ 
      $this->$k = $v; 
     } 
    } 

    public function showAll() 
    { 
     $output = array(); 
     foreach (this as $k=>$v) { // How to refer to all the class properties? 
      $output[$k] = $v; 
     } 
     return $output; 
    } 

} 

如何可能會在showAll()方法foreach()$a$b$c$d屬性?

對於這個問題,是否可以從課外獲得所有公共財產?

$params = array(); 
$foo = new Foo($params); 

foreach ($foo->allProperties as $f=>$v) { // how to do this? 
    echo "{$f}: {$v}\n"; 
} 
+0

'SHOWALL()'返回所有的屬性,如果你用'$ this'修正錯字(缺少美元符號)。這個問題有點不清楚。 – Jon

+0

你的類沒有任何靜態屬性,所以在技術上這個類沒有值。你的意思是對象屬性?這將與反思一起工作。 –

+0

謝謝沃爾夫岡,我的意思是對象屬性。這應該包括任何存在的靜態成員。 – dotancohen

回答

1

使用反射類:Class Reflectionclass Manual(PHP 5)

<?php 
class Foo { 
    public $foo = 1; 
    protected $bar = 2; 
    private $baz = 3; 
} 

$foo = new Foo(); 

$reflect = new ReflectionClass($foo); 
$props = $reflect->getProperties(ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED); 

foreach ($props as $prop) { 
    print $prop->getName() . "\n"; 
} 

var_dump($props); 

?> 
+1

謝謝你Alireza。我傾向於接受'get_object_vars'答案中的一個,但是我發現你真的用Reflection思考了這個問題的核心。 – dotancohen

+1

所以你正在尋找最複雜的解決方案? ;) – migg

1

您可以使用get_class_vars - 獲取類的默認屬性 你可以象下面這樣:

<?php 
class myclass { 
    var $var1; // this has no default value... 
    var $var2 = "xyz"; 
    var $var3 = 100; 
    private $var4; // PHP 5  
    // constructor 
    function myclass() { 
     // change some properties 
     $this->var1 = "foo"; 
     $this->var2 = "bar"; 
     return true; 
    } 
} 
$my_class = new myclass(); 
$class_vars = get_class_vars(get_class($my_class)); 
foreach ($class_vars as $name => $value) { 
    echo "$name : $value\n"; 
} 
?> 

欲瞭解更多信息只是檢查PHP

3

由於PHP4,你可以用get_object_vars遍歷對象的公共屬性。

foreach (get_object_vars($foo) as $f => $v) { 
    echo "{$f}: {$v}\n"; 
} 

隨着PHP5的you can迭代直接在物體:

foreach ($foo as $f => $v) { 
    echo "{$f}: {$v}\n"; 
} 
+0

這和'foreach' [直接在對象上](http://php.net/manual/en/language.oop5.iterations.php)有什麼不同? – Jon

+0

@Jon,'get_object_vars'也與PHP4兼容。我也包括它。謝謝。 – Shoe

+0

Ι在問題的任何地方都沒有看到提及的PHP4。另外,自PHP5發佈以來,我們接近* 9年*。 – Jon

1

可能是你正在尋找get_object_vars()

$params = array(); 
$foo = new Foo($params); 

foreach (get_object_vars($foo) as $f=>$v) { // how to do this? 
echo "{$f}: {$v}\n"; 
} 

你也可以用簡單的對象迭代的PHP5的。它也將通過所有的公共屬性

$foo = new Foo($params); 

foreach($class as $key => $value) { 
print "$key => $value\n"; 
} 

看到迭代http://php.net/manual/en/language.oop5.iterations.php

+0

'foreach' [直接在對象上](http://php.net/manual/en/language.oop5.iterations.php)有什麼問題嗎? – Jon

+0

@Jon OOPS ..晚了幾秒..我正在編輯我的答案相同..... – alwaysLearn

1

雖然你可以在公共對象遍歷屬性使用get_object_vars,不必這樣做可能是一個糟糕的設計,也是考慮再次實施的原因。你想用對象的屬性做的事情很可能屬於類/對象本身,以編程方式。

2

獲得所有屬性和他們的價值觀,包括私營的,從對象之外,並沒有依靠無證行爲或實施細則的唯一方法,就是Reflection

$ref=new ReflectionObject($object); 
foreach ($ref->getProperties() as $prop) 
{ 
    $prop->setAccessible(true); 
    $name=$prop->getName(); 
    $value=$prop->getValue($object); 
}