115

How can I loop through all the properties of object?. Right now I have to write a new code line to print each property of object

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

Can I loop through all the properties of an object using foreach loop or any loop?

Something like this

foreach ($obj as $property => $value)  
Daric
  • 16,229
  • 11
  • 41
  • 58

7 Answers7

176

If this is just for debugging output, you can use the following to see all the types and values as well.

var_dump($obj);

If you want more control over the output you can use this:

foreach ($obj as $key => $value) {
    echo "$key => $value\n";
}
David Harkness
  • 35,992
  • 10
  • 112
  • 134
  • 12
    "Object of class stdClass could not be converted to string" could well be a resulting error if the object is not an array. – landed Jul 22 '16 at 12:03
  • print_r($obj); can also help. Prints given object's fields recursively. – fandasson Aug 04 '17 at 18:48
14

For testing purposes I use the following:

//return assoc array when called from outside the class it will only contain public properties and values 
var_dump(get_object_vars($obj)); 
Dimi
  • 249
  • 3
  • 4
  • If the class of `$obj` is written/controlled by once own, there is also `__debugInfo()` magic method to control what `var_dump()` shows - very handy! Otherwise this answer reduces verbosity, which can also be useful in a step debugger session for E_TOO_MUCH_INFORMATION. – hakre Aug 12 '22 at 23:40
9

Before you run the $obj through a foreach loop you have to convert it to an array (see: cast to array) if you're looking for properties regardless of visibility.

Example with HTML output (PHP 8.1):

foreach ((array)$obj as $key => $val) {
    printf(
        "%s: %s<br>\n", 
        htmlspecialchars("$key"), 
        htmlspecialchars("$val"),
    );
}
hakre
  • 193,403
  • 52
  • 435
  • 836
Rex
  • 357
  • 3
  • 5
3

Sometimes, you need to list the variables of an object and not for debugging purposes. The right way to do it is using get_object_vars($obj). It returns an array that has all the visible class variables and their value. You can then loop through them in a foreach-loop. If used within the object itself, simply do get_object_vars($this).

hakre
  • 193,403
  • 52
  • 435
  • 836
JG Estiot
  • 969
  • 1
  • 10
  • 8
2

Using get_object_vars is better than applying a foreach directly to the object since your code will be also compliant with PHPStan which requires that foreach is applied only to iterables (see https://github.com/phpstan/phpstan/issues/1060).

Thus, the best choice is go like this:

foreach (get_object_vars($obj) as $key => $value) {
    echo "$key => $value\n";
}
Luigi C.
  • 990
  • 12
  • 22
1

Here is another way to express the object property.

foreach ($obj as $key=>$value) {
    echo "$key => $obj[$key]\n";
}
Budove
  • 403
  • 2
  • 8
  • 19
  • 5
    This only works if the object implements `\ArrayAccess` or is an `array`, otherwise the following is thrown: `FATAL ERROR Uncaught Error: Cannot use object of type SomeType as array` – rolling_codes Nov 02 '18 at 16:46
  • You already have the value so just do `echo "$key => $value\n";` – Jacob Aug 30 '22 at 20:59
0

David's answer is solid as long as either: a) you only need access to public attributes, or b) you are working with the stdClass object. If you have defined private or protected attributes in a class and want to display all attributes, simply add an instance method that iterates the properties:

class MyClass {

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

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

}
GraceRg
  • 23
  • 4