3

如何从该类内部或外部对一个类的所有字段执行 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()方法中的in如何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";
}
4

6 回答 6

5

从 PHP4 开始,您可以使用它get_object_vars来迭代对象的公共属性。

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

从 PHP5 开始,您可以直接遍历对象:

foreach ($foo as $f => $v) {
    echo "{$f}: {$v}\n";
}
于 2013-03-29T09:14:19.363 回答
4

使用反射类:类反射类手册(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);

?>
于 2013-03-29T09:16:35.353 回答
2

可能您正在寻找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

于 2013-03-29T09:15:48.570 回答
2

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

$ref=new ReflectionObject($object);
foreach ($ref->getProperties() as $prop)
{
    $prop->setAccessible(true);
    $name=$prop->getName();
    $value=$prop->getValue($object);
}
于 2013-03-29T09:50:15.780 回答
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

于 2013-03-29T09:12:20.617 回答
1

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

于 2013-03-29T09:22:20.650 回答