2010-10-01 6 views
19

So che in C# è possibile al giorno d'oggi fare:Esiste un costrutto di inizializzatore di oggetti speciale in PHP come avviene ora in C#?

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

C'è qualcosa di simile in PHP troppo? O dovrei farlo solo attraverso un costruttore o attraverso più affermazioni;

$a = new MyObject(1, 2); 

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

Se è possibile, ma tutti pensano che sia una pessima idea, mi piacerebbe anche sapere.

PS: l'oggetto non è altro che un mucchio di proprietà.

+0

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

risposta

14

A partire dal PHP7, abbiamo Anonymous Classes che permetterebbe di estendere una classe in fase di runtime, compresa l'impostazione delle proprietà aggiuntive:

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

echo $a->property1; // prints 1 

Prima PHP7, non v'è nulla di simile. Se l'idea è di creare un'istanza dell'oggetto con proprietà arbitrarie, puoi fare

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

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

Aggiungi le varianti come meglio credi. Ad esempio, aggiungi assegni a property_exists per consentire solo l'impostazione di membri definiti. Trovo che lanciare proprietà casuali sugli oggetti un difetto di progettazione.

Se non avete bisogno di un'istanza di classe specifica, ma si vuole solo un sacchetto oggetto a caso, si può anche fare

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

che sarebbe poi dare un esempio di stdClass, e che si poteva accedere come

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

Grazie. L'idea non era di instillare proprietà alternative. Grazie comunque per l'idea. Userò la mia prima alternativa: un costruttore. –

+0

Semplice e geniale, grazie per l'ispirazione. Per quanto riguarda un 'difetto di progettazione': se un programma funziona, così come può essere facilmente e rapidamente compreso da altri programmatori, il design è buono, indipendentemente da ciò che dicono i libri di programmazione. – mojuba

+0

@mojuba - Gordon ha ragione a mio avviso. Il lancio di proprietà casuali sugli oggetti * è * un difetto di progettazione. Un sacco di PHP è imperfetto: francamente è un linguaggio orribile che rende facile insinuarsi insidiosi bug nei tuoi programmi (che impiegano anni per rintracciare e correggere). L'intero punto dell'utilizzo di classi con proprietà definite è che * non * è possibile rovinare digitando erroneamente un nome di proprietà nel codice (un IDE lo catturerà immediatamente o si verificherà un errore di runtime di grandi dimensioni). Contrariamente a ciò con l'accesso a un elemento dell'array che non esiste: PHP considera silenziosamente il valore come null/empty/qualunque. –

2

Ti suggerisco di utilizzare un costruttore e impostare le variabili che desideri durante l'inizializzazione dell'oggetto.

+1

Grazie per la tua risposta, lo farò. –

Problemi correlati