Tengo propiedades de objeto en mi código que se ven así:
$obj ->field_name_cars[0];
$obj ->field_name_clothes[0];
El problema es que tengo cientos de nombres de campo y necesito escribir el nombre de la propiedad de forma dinámica. De lo contrario, el nombre del objeto y las claves de la propiedad siempre serán los mismos. Así que intenté:
$obj -> $field[0];
Esperando que el nombre de la propiedad se cambie dinámicamente y acceda a los valores correctos. Pero, sigo obteniendo 'propiedad indefinida $ campo en stdClass :: $ campo;
Más o menos, estoy intentando escribir dinámicamente el php antes de que se ejecute para que pueda generar los valores adecuados. ¿Pensamientos sobre cómo abordar esto?
Creo que está buscando una notación de tipo variable-variable que, al acceder a valores de otras matrices / objetos, se logra mejor utilizando una sintaxis de corchetes como esta:
$obj->{field[0]}
fuente
El método mágico __get is your 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"); } }
Uso:
$myobj = new MyClass(); echo $myobj->myprop;
Explicación: Todos los datos de su campo se almacenan en una matriz. Al acceder,
$myobj->myprop
esa propiedad obviamente no existe en la clase. Ahí es donde__get
se llama.__get
busca el nombre en lafield
matriz y devuelve el valor correcto.fuente
aboulfazl, ya que los métodos PHP 5.3.3 con el mismo nombre que la clase no serán tratados como constructores.
YourClass { public $any = false; public function __construct($any = null) { $this->any = (is_null($any) ? $this->any : $any); } }
Esto funciona, pero el propietario del tema no lo preguntó, ¡Jon da la bienvenida!
fuente
Trabajé en un código que usaba propiedades de objeto creadas dinámicamente. Pensé que usar propiedades de objetos creadas dinámicamente era bastante bueno (cierto, en mi opinión). Sin embargo, mi programa tardó 7 segundos en ejecutarse. Eliminé las propiedades del objeto dinámico y las reemplacé por las propiedades del objeto declaradas como parte de cada clase (pública en este caso). El tiempo de CPU pasó de más de 7 segundos a 0,177 segundos. Eso es bastante sustancial.
Es posible que estuviera haciendo algo mal en la forma en que estaba usando las propiedades dinámicas de los objetos. También es posible que mi configuración esté rota de alguna manera. Por supuesto, debería decir que tengo una configuración PHP básica muy simple en mi máquina.
fuente
hoy me enfrento a ese desafío. Terminé con ese estilo de desarrollo
$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']; }
fuente
La mejor manera de usar la instancia de objeto de clase predeterminada de PHP para asignarle propiedades dinámicamente
$inst=new \StdClass; $inst->any_property = '';
fuente
Con herencia. por ejemplo:
YourClass extends stdClass { public function YourClass() { $this->AnyProperty="any"; } }
Ahora AnyProperty se declara dinámicamente.
fuente