2012-08-30 12 views
10

Powiel możliwe:
Convert Array to Object PHPPHP - asocjacyjna jako obiekt

Tworzę prostą aplikację PHP i chciałbym użyć YAML plików jako magazyn danych. będę się dane w postaci tablicy asocjacyjnej, z tej struktury na przykład:

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

Jednak chciałbym przedłużyć asocjacyjną z niektórych funkcji i użyć operatora ->, więc mogę napisać coś takiego:

$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 

Czy można to zrobić bez definicji klasy?

Zasadniczo chciałbym mieć przedmioty w stylu JavaScript w PHP :)

+4

W przypadku używaj przynajmniej sha1 w tych dniach. Aktualizacja – wesside

+2

+ wesside 2016: BCrypt przez password_hash lub PBKDF2 z SHA512. – mjsa

+0

@mjsa sposób, aby wyjrzeć! – wesside

Odpowiedz

4

Dosłownie po prostu zrobić $class = new stdClass; i iteracyjne i przypisanie. Pamiętaj, że jest to tylko jeden poziom głębokości, podobnie jak w przypadku typowania. Będziesz musiał napisać iterator rekursywny, aby uzyskać wszystko. Z tego, co pamiętam, Kohana 2/3 ma to_object(), którego prawdopodobnie możesz użyć.

Znaleziono go:

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

Uwaga: spowoduje to konwersję tablic sekwencyjnych (nie asocjacyjnych) na obiekty. Możesz chcieć połączyć się z tą odpowiedzią: http://stackoverflow.com/a/4254008/1074400 –

27

Wystarczy rzucić go:

$user = (object)$user; 

Oczywiście, istnieją inne, bardziej elastyczne rozwiązania, takie jak utworzenie klasy, która implementuje ArrayAccess:

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

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

Zwróć uwagę, że jeśli $ user ma wartość 'null', rzutowanie jej na' (object) 'sprawi, że nie będzie wartości NULL (to będzie być pustym obiektem). Aby tego uniknąć, możesz to zrobić: '$ user = $ user? (obiekt) $ user: null' –