2012-08-30 19 views
10

Duplicar posible:
Convert Array to Object PHPPHP - matriz asociativa como un objeto

Estoy creando una aplicación PHP simple y me gustaría utilizar YAML archivos como un almacenamiento de datos. Voy a obtener los datos como una matriz asociativa, con esta estructura, por ejemplo:

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

Sin embargo, me gustaría ampliar la matriz asociativa con algunas funciones y utilizar el operador ->, por lo que puedo escribir algo como esto:

$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 

¿Hay una buena manera de hacer esto sin una definición de clase?

Básicamente, me gustaría tener objetos de estilo JavaScript en PHP :)

+4

En caso use al menos sha1 en estos días. – wesside

+2

+ actualización de wesside 2016: BCrypt a través de password_hash o PBKDF2 con SHA512. – mjsa

+0

@mjsa manera de cuidar! – wesside

Respuesta

4

Literalmente simplemente hacer una $class = new stdClass; e iterar y reasignar. Tenga en cuenta que solo tiene un nivel de profundidad, al igual que el encasillado. Tendría que escribir un iterador recursivo para obtenerlo todo. Por lo que recuerdo Kohana 2/3 tiene to_object() probablemente puedas usar.

Encontrado:

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

Tenga en cuenta que esto también convertirá las matrices secuenciales (no asociativas) a los objetos también. Es posible que desee combinar con esta respuesta: http://stackoverflow.com/a/4254008/1074400 –

27

Sólo echarlo:

$user = (object)$user; 

Por supuesto, hay otras soluciones más flexibles como la creación de una clase que implementa ArrayAccess:

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

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

Tenga en cuenta que si $ usuario es 'nulo', convertirlo en' (objeto) 'lo hará no nulo (lo hará ser un objeto vacío). Para evitar esto, puede hacer esto: '$ usuario = $ usuario? (objeto) $ usuario: null' –

Cuestiones relacionadas