How do I dynamically write a PHP object property name?

Php

Php Problem Overview


I have object properties in my code that look like this:

$obj ->field_name_cars[0];
$obj ->field_name_clothes[0];

The problem is I have 100s of field names and need to write the property name dynamically. Otherwise, the object name and the keys for the property will always be the same. So I tried:

$obj -> $field[0];

Hoping that the name of the property would dynamically be changed and access the correct values. But, I keep getting 'undefined property $field in stdClass::$field;

More or less I am trying dynamically write the php before it executes so that it can output the proper values. Thoughts on how to approach this?

Php Solutions


Solution 1 - Php

Update for PHP 7.0

PHP 7 introduced changes to how indirect variables and properties are handled at the parser level (see the corresponding RFC for more details). This brings actual behavior closer to expected, and means that in this case $obj->$field[0] will produce the expected result.

In cases where the (now improved) default behavior is undesired, curly braces can still be used to override it as shown below.

Original answer

Write the access like this:

$obj->{$field}[0]

This "enclose with braces" trick is useful in PHP whenever there is ambiguity due to variable variables.

Consider the initial code $obj->$field[0] -- does this mean "access the property whose name is given in $field[0]", or "access the element with key 0 of the property whose name is given in $field"? The braces allow you to be explicit.

Solution 2 - Php

I think you are looking for variable-variable type notation which, when accessing values from other arrays/objects, is best achieved using curly bracket syntax like this:

$obj->{field[0]}

Solution 3 - Php

The magic method __get is you friend:

class MyClass
{
   private $field = array();

   public function __get($name)
   {
      if(isset($this->field[$name]))
        return $this->field[$name];
      else
        throw new Exception("$name dow not exists");
   }
}

Usage:

$myobj = new MyClass();
echo $myobj->myprop;

Explanation: All your field data is stored in a array. As you access $myobj->myprop that property obviously does not exists in the class. That is where __get is called. __get looks up the name in the field array and returns the correct value.

Solution 4 - Php

today i face that challenge. I ended up with that style of development

$countTickets = new \stdClass;

foreach ($tickets as $key => $value) {

	if(!isset($countTickets->total)){
		$countTickets->total = 0;
	}

	if(!isset($countTickets->{$value['categoryname']})){
		$countTickets->{$value['categoryname']} = 0;
	}

	$countTickets->total += $value['number'];
	$countTickets->{$value['categoryname']} += $value['number']; 
}

Solution 5 - Php

I worked on some code that used dynamically created object properties. I thought that using dynamically created object properties was pretty cool (true, in my opinion). However, my program took 7 seconds to run. I removed the dynamic object properties and replaced them object properties declared as part of each class (public in this case). CPU time went from over 7 seconds to 0.177 seconds. That's pretty substantial.

It is possible that I was doing something wrong in the way I was using dynamic object properties. It is also possible that my configuration is broken in some way. Of course, I should say that I have a very plain vanilla PHP configuration on my machine.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser658182View Question on Stackoverflow
Solution 1 - PhpJonView Answer on Stackoverflow
Solution 2 - PhpMike BrantView Answer on Stackoverflow
Solution 3 - PhpJvdBergView Answer on Stackoverflow
Solution 4 - PhpJordan GeorgiadisView Answer on Stackoverflow
Solution 5 - PhpPeter SchaefferView Answer on Stackoverflow