如何在一个类的所有字段中执行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";
}
答案 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";
}
答案 5 :(得分:1)
虽然您可以使用get_object_vars迭代公共对象属性,但必须这样做可能是一个糟糕的设计,并且有理由再次考虑您的实现。您想要对对象的属性做的事情很可能是以编程方式属于类/对象本身。