2010-10-01 8 views
19

sé que en C# se puede hacer hoy en día:¿Hay un constructo de inicializador de objeto especial en PHP como ahora hay en C#?

var a = new MyObject 
{ 
    Property1 = 1, 
    Property2 = 2 
}; 

¿Hay algo por el estilo en PHP también? ¿O debería hacerlo a través de un constructor o a través de múltiples declaraciones?

$a = new MyObject(1, 2); 

$a = new MyObject(); 
$a->property1 = 1; 
$a->property2 = 2; 

Si es posible, pero todos piensan que es una idea terrible, también me gustaría saber.

PD: el objeto no es más que un conjunto de propiedades.

+0

relacionado: http://stackoverflow.com/questions/1738865/initialize-objects-like-arrays-in-php – nawfal

Respuesta

14

A partir de PHP7, tenemos Anonymous Classes que permiten ampliar una clase en tiempo de ejecución, incluyendo el establecimiento de propiedades adicionales:

$a = new class() extends MyObject { 
    public $property1 = 1; 
    public $property2 = 2; 
}; 

echo $a->property1; // prints 1 

Antes PHP7, no hay tal cosa. Si la idea es crear una instancia del objeto con propiedades arbitrarias, puede hacer

public function __construct(array $properties) 
{ 
    foreach ($properties as $property => $value) 
    { 
     $this->$property = $value 
    } 
} 

$foo = new Foo(array('prop1' => 1, 'prop2' => 2)); 

Agregue las variaciones que considere adecuadas. Por ejemplo, agregue cheques al property_exists para permitir solo la configuración de miembros definidos. Me parece que arrojar propiedades al azar en los objetos es un defecto de diseño.

Si usted no necesita una instancia de clase específica, pero lo que desea es una bolsa de objetos al azar, también se puede hacer

$a = (object) [ 
    'property1' => 1, 
    'property2' => 2 
]; 

que luego le daría una instancia de StdClass y que se podía acceder como

echo $a->property1; // prints 1 
+2

Gracias. La idea no era instigar propiedades aritméticas. Gracias de todos modos por la idea. Usaré mi primera alternativa: un constructor. –

+0

Simple y brillante, gracias por la inspiración. En cuanto a que se trata de un "defecto de diseño": si un programa funciona, así como otros programadores lo pueden entender rápida y fácilmente, entonces el diseño es bueno, sin importar lo que digan los libros de programación. – mojuba

+0

@mojuba - Gordon es correcto en mi opinión. Lanzar propiedades aleatorias a los objetos * es * un defecto de diseño. Una gran cantidad de PHP tiene fallas: francamente es un lenguaje horrible que hace que sea fácil para los errores sutiles infiltrarse en sus programas (que tardan años en rastrear y corregir). El objetivo de usar clases con propiedades definidas es que * no * es posible equivocarse al escribir erróneamente un nombre de propiedad en el código (un IDE lo detectará de inmediato, o se producirá un gran error de tiempo de ejecución). Contraste eso con el acceso a un elemento de matriz que no existe: PHP trata en silencio el valor como nulo/vacío/lo que sea. –

2

Te sugiero que uses un constructor y establezcas las variables que deseas al inicializar el objeto.

+1

Gracias por su respuesta, lo haré. –

Cuestiones relacionadas