我怎样才能循环遍历对象的所有属性呢?现在我必须写一行新的代码来打印对象的每个属性
echo $obj->name; echo $obj->age;
我可以使用foreach循环或任意循环遍历对象的所有属性吗?就像这样
foreach ($obj as $property => $value)
cedebl8k1#
如果这只是为了调试输出,您也可以使用下面的代码来查看所有类型和值。
var_dump($obj);
如果你想对输出进行更多的控制,你可以使用:
foreach ($obj as $key => $value) { echo "$key => $value\n"; }
nuypyhwy2#
出于测试目的,我使用以下代码:
//return assoc array when called from outside the class it will only contain public properties and values var_dump(get_object_vars($obj));
cclgggtu3#
在通过foreach循环运行$obj之前,必须将其转换为array(请参见:cast to array)(如果您要查找属性而不考虑可见性)。HTML输出示例(PHP 8.1):
foreach
$obj
array
foreach ((array)$obj as $key => $val) { printf( "%s: %s<br>\n", htmlspecialchars("$key"), htmlspecialchars("$val"), ); }
rjzwgtxy4#
有时候,你需要列出一个对象的变量,而不是为了调试。正确的方法是使用get_object_vars($obj)。它返回一个包含所有可见类变量及其值的数组。然后你可以在foreach循环中循环它们。如果在对象本身中使用,只需执行get_object_vars($this)。
get_object_vars($obj)
get_object_vars($this)
svujldwt5#
下面是表示对象属性的另一种方法。
foreach ($obj as $key=>$value) { echo "$key => $obj[$key]\n"; }
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/>"; } } }
wrrgggsh7#
使用get_object_vars比直接将foreach应用于对象要好,因为您的代码还将符合PHPSan,PHPSan要求foreach仅应用于可迭代对象(参见https://github.com/phpstan/phpstan/issues/1060)。因此,最好的选择是这样走:
get_object_vars
foreach (get_object_vars($obj) as $key => $value) { echo "$key => $value\n"; }
7条答案
按热度按时间cedebl8k1#
如果这只是为了调试输出,您也可以使用下面的代码来查看所有类型和值。
如果你想对输出进行更多的控制,你可以使用:
nuypyhwy2#
出于测试目的,我使用以下代码:
cclgggtu3#
在通过
foreach
循环运行$obj
之前,必须将其转换为array
(请参见:cast to array)(如果您要查找属性而不考虑可见性)。HTML输出示例(PHP 8.1):
rjzwgtxy4#
有时候,你需要列出一个对象的变量,而不是为了调试。正确的方法是使用
get_object_vars($obj)
。它返回一个包含所有可见类变量及其值的数组。然后你可以在foreach循环中循环它们。如果在对象本身中使用,只需执行get_object_vars($this)
。svujldwt5#
下面是表示对象属性的另一种方法。
vecaoik16#
大卫的回答是可靠的,只要:a)你只需要访问公共属性,或者b)你正在使用stdClass对象。如果你已经在类中定义了私有或受保护属性,并且想显示所有属性,只需添加一个示例方法来迭代属性:
wrrgggsh7#
使用
get_object_vars
比直接将foreach
应用于对象要好,因为您的代码还将符合PHPSan,PHPSan要求foreach
仅应用于可迭代对象(参见https://github.com/phpstan/phpstan/issues/1060)。因此,最好的选择是这样走: