遍历php对象的所有属性

gwo2fgha  于 2023-01-12  发布在  PHP
关注(0)|答案(7)|浏览(125)

我怎样才能循环遍历对象的所有属性呢?现在我必须写一行新的代码来打印对象的每个属性

echo $obj->name;
echo $obj->age;

我可以使用foreach循环或任意循环遍历对象的所有属性吗?
就像这样

foreach ($obj as $property => $value)
cedebl8k

cedebl8k1#

如果这只是为了调试输出,您也可以使用下面的代码来查看所有类型和值。

var_dump($obj);

如果你想对输出进行更多的控制,你可以使用:

foreach ($obj as $key => $value) {
    echo "$key => $value\n";
}
nuypyhwy

nuypyhwy2#

出于测试目的,我使用以下代码:

//return assoc array when called from outside the class it will only contain public properties and values 
var_dump(get_object_vars($obj));
cclgggtu

cclgggtu3#

在通过foreach循环运行$obj之前,必须将其转换为array(请参见:cast to array)(如果您要查找属性而不考虑可见性)。
HTML输出示例(PHP 8.1):

foreach ((array)$obj as $key => $val) {
    printf(
        "%s: %s<br>\n", 
        htmlspecialchars("$key"), 
        htmlspecialchars("$val"),
    );
}
rjzwgtxy

rjzwgtxy4#

有时候,你需要列出一个对象的变量,而不是为了调试。正确的方法是使用get_object_vars($obj)。它返回一个包含所有可见类变量及其值的数组。然后你可以在foreach循环中循环它们。如果在对象本身中使用,只需执行get_object_vars($this)

svujldwt

svujldwt5#

下面是表示对象属性的另一种方法。

foreach ($obj as $key=>$value) {
    echo "$key => $obj[$key]\n";
}
vecaoik1

vecaoik16#

大卫的回答是可靠的,只要:a)你只需要访问公共属性,或者b)你正在使用stdClass对象。如果你已经在类中定义了私有或受保护属性,并且想显示所有属性,只需添加一个示例方法来迭代属性:

class MyClass {

  public $public_attr1;
  private $private_attr2;
  protected $protected_attr3;

  function iterateAttributes() {
    foreach ($this as $attr=>$value) {
      echo "$attr: $value <br/>";
    }
  }

}
wrrgggsh

wrrgggsh7#

使用get_object_vars比直接将foreach应用于对象要好,因为您的代码还将符合PHPSan,PHPSan要求foreach仅应用于可迭代对象(参见https://github.com/phpstan/phpstan/issues/1060)。
因此,最好的选择是这样走:

foreach (get_object_vars($obj) as $key => $value) {
    echo "$key => $value\n";
}

相关问题