2012-11-16 7 views
7

Im cominciando ad allontanarmi dall'utilizzo di matrici in PHP poiché gli oggetti sono molto più ordinativi e in php 5 non si verificano picchi di rendimento quando si usano gli oggetti.Oggetti di scrittura PHP in linea

Attualmente il modo in cui lo faccio è:

$object = (object) array('this' => 'that', 'foo' => (object) array('bar' => 123));

Tuttavia, lo trovo così noioso dover typecast ogni volta come typecasting isnt ricorsiva ...

Esiste un modo in php (o ci sarà) per fare così o qualcosa di simile:

$object = { 
    'this' => 'that', 
    'foo' => { 
     'bar' => 123 
    } 
}; 
+5

Perché si desidera utilizzare un oggetto quando lo si crea come un array in ogni modo? – Peon

+0

Non riesco a capire la tua necessità di lanciarlo in quel modo. – NappingRabbit

+1

è possibile eseguire l'aggiornamento a php 5.4 e utilizzare la sintassi dell'array breve; questo renderà il tuo codice più ordinato. Sono con @DainisAbols però; Non sono sicuro di cosa stia cercando di ottenere con il casting del tipo. Che vantaggio vedi di usare gli oggetti rispetto agli array in questo contesto? – SDC

risposta

4

vi consiglio di creare una funzione larghezza StdClass.

function arrayToObject($array) { 
    if(!is_array($array)) { 
     return $array; 
    } 

    $object = new stdClass(); 
    if (is_array($array) && count($array) > 0) { 
     foreach ($array as $name=>$value) { 
     $name = strtolower(trim($name)); 
     if (!empty($name)) { 
      $object->$name = arrayToObject($value); 
     } 
     } 
     return $object; 
    } 
    else { 
     return FALSE; 
    } 
} 
0

Purtroppo non c'è sintassi creando stdClass casi del genere. Ma potresti usare la parola chiave new e una qualsiasi delle classi spl (non ammetto molto). Se si desidera ottimizzare per le battute, si potrebbe scrivere un po 'di funzione di aiuto in questo modo:

function O($a){ 
    return new ArrayObject($a); // has -> and [] support too 
} 

e scrivere

$stuff = O(array('a' => 'tickle me elmo', 'b' => O(array('foo' => 'bar')))); 
0

Anche se onestamente non riesco a vedere il motivo per cui ci si vuole fare questo (array associativi sono in essenza di soli dati-oggetti) ma se insistete:
Invece di lanciare ogni singolo array, su ogni singolo livello per un oggetto, è possibile utilizzare il seguente "trucco/hack" :

$object = json_decode(
       json_encode(
        array('some'=>array('multi'=>'Dimensional'), 
         'array'=>'that', 
         'you' => array('want' => 'to', 
             'turn' => 'into'), 
         'an' => 'object'))); 

Converte tutti gli array in istanze dello stdClass, che credo sia quello che volevi.
Ancora una volta, devo dire: PHP è non JavaScript e gli oggetti sono molto più costosi (relativamente parlando) in lingue come PHP, quindi sono in JS. Ti consiglio vivamente di continuare ad usare gli array assoc se non hai bisogno di un oggetto.

Come gli oggetti, gli array possono essere tipo accennato: function foo (array $argument){}
Se davvero si vuole trasformarli in una particolare istanza di una classe, perché non cambiare il costruttore, a che fare con una matrice:

class My_Object extends stdClass 
{ 
    public function __construct(array $params = null) 
    { 
     if (!empty($params)) 
     { 
      foreach ($params as $name => $value) 
      { 
       $this->{$name} = $value;//set everything 
      } 
     } 
    } 
} 

E andare avanti per aggiungere qualsiasi metodo che si desidera aggiungere al lotto

2

PHP attualmente non supporta la sintassi oggetto breve. A partire da PHP 5.4 supportano la sintassi dell'array breve. Forse 5,5 includerà ciò che stai cercando.

In alternativa:

Si potrebbe creare i vostri oggetti come JSON e utilizzare json_decode():

$json = '{"this": "that", "foo": {"bar": 123}}'; 
var_dump(json_decode($json)); 

Nota: sto mostrando solo questo come dimostrazione di un modo per risolvere la tua domanda. Non sto sostenendo una tale pratica.

+1

codice corretto sarebbe $ json = '{"questo": "che", "foo": {"bar": 123}}'; –

+0

Grazie. Mista una piccola sintassi di array in là :) –

+0

bella risposta, vorrei cambiarlo in un messaggio simile a <<< JSON JSON; solo per evitare di citare l'inferno –

16

A partire da PHP 5.4 è disponibile una breve sintassi di array. Ciò consente di inizializzare array come questo:

$myArray = ["propertyA" => 1, "propertyB" => 2]; 

Attualmente non esiste alcuna sintassi di oggetti breve in PHP a partire da PHP7. Ma si può lanciare la sintassi di matrice breve per creare oggetti come questo:

$myObject = (object) ["propertyA" => 1, "propertyB" => 2]; 

sembra molto più bello e più corto con il seguente comando:

$myObject = new \StdClass(); 
$myObject->propertyA = 1; 
$myObject->propertyB = 2; 
0

devo una soluzione alternativa per quando si riceve un già costruito array. Supponiamo che il tuo array abbia n array nidificati in modo da non avere la possibilità di lanciarli in modo semplice. Questo sarebbe fare il trucco:

$object = json_decode(json_encode($unknownArray)); 

Non vorrei usare questo in un ciclo di grandi dimensioni o qualcosa di simile, in quanto è il modo più lento di appena attaccare con la sintassi array e convivere con essa. Inoltre, se un elemento dell'array è una funzione o qualche altra cosa divertente questo lo spezzerebbe.

Esempio utilizzo:

$unknownArray = array(
    'a' => '1', 
    'b' => '2', 
    'c' => '3', 
    'd' => array(
     'x' => '7', 
     'y' => '8', 
     'z' => '9', 
    ), 
); 
$object = json_decode(json_encode($unknownArray)); 
echo $object->d->x;