2012-08-30 19 views
10

Eventuali duplicati:
Convert Array to Object PHPPHP - array associativo come un oggetto

Sto creando una semplice applicazione PHP e vorrei utilizzare YAML file come la memorizzazione dei dati. Io ottenere i dati come array associativo, con questa struttura, ad esempio:

$user = array('username' => 'martin', 'md5password' => '5d41402abc4b2a76b9719d911017c592') 

Tuttavia, desidero estendere l'array associativo con alcune funzioni e utilizzare l'operatore ->, così posso scrivere qualcosa di simile:

$user->username = 'martin'; // sets $user['username'] 
$user->setPassword('hello'); // writes md5 of 'hello' to $user['md5password'] 
$user->save();    // saves the data back to the file 

C'è un buon modo per farlo senza una definizione di classe?

In sostanza, mi piacerebbe avere gli oggetti di stile JavaScript PHP :)

+4

Dovrebbe usare almeno sha1 in questi giorni. Aggiornamento – wesside

+2

+ wesside 2016: BCrypt tramite password_hash o PBKDF2 con SHA512. – mjsa

+0

@mjsa modo di guardare fuori! – wesside

risposta

4

Letteralmente solo fare un $class = new stdClass; e Itera e riassegnare. Tieni presente che questo è solo un livello profondo, proprio come il typecasting. Dovresti scrivere un iteratore ricorsivo per ottenere tutto. Da quello che ricordo Kohana 2/3 ha to_object() che probabilmente puoi usare.

Trovato:

class Arr extends Kohana_Arr { 

    public static function to_object(array $array, $class = 'stdClass') 
    { 
      $object = new $class; 
      foreach ($array as $key => $value) 
      { 
        if (is_array($value)) 
        { 
        // Convert the array to an object 
          $value = arr::to_object($value, $class); 
        } 
        // Add the value to the object 
        $object->{$key} = $value; 
      } 
      return $object; 
    } 
+2

Nota anche questo convertirà matrici sequenziali (non associative) in oggetti. Potresti voler unire con questa risposta: http://stackoverflow.com/a/4254008/1074400 –

27

Basta cast:

$user = (object)$user; 

Naturalmente, ci sono altre soluzioni più flessibili come la creazione di una classe che implementa ArrayAccess:

$user = new User(); // implements ArrayAccess 

echo $user['name']; 
// could be the same as... 
echo $user->name; 
+0

Nota che se $ utente è 'null', gettandolo su' (oggetto) 'lo renderà non-null (sarà essere un oggetto vuoto). Per evitare ciò puoi fare questo: '$ utente = $ utente? (oggetto) $ utente: null' –

Problemi correlati