foreach on all object properties

时间:2013-03-29 09:08:34

标签: php loops

如何在一个类的所有字段中执行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;
    }

}

foreach()方法中的showAll()如何引用$a$b$c$d属性?

就此而言,可以从课外获得所有公共财产吗?

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

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

6 个答案:

答案 0 :(得分: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";
}

答案 1 :(得分:2)

使用Reflection类: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);

?>

答案 2 :(得分:2)

从对象外部获取所有属性及其值(包括私有属性)并且不依赖于未记录的行为或实现细节的唯一方法是Reflection

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

答案 3 :(得分: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

答案 4 :(得分: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

答案 5 :(得分:1)

虽然您可以使用get_object_vars迭代公共对象属性,但必须这样做可能是一个糟糕的设计,并且有理由再次考虑您的实现。您想要对对象的属性做的事情很可能是以编程方式属于类/对象本身。