2012-08-30 41 views
10

thể trùng lặp:
Convert Array to Object PHPPHP - mảng kết hợp như một đối tượng

tôi là tạo ra một ứng dụng PHP đơn giản và tôi muốn sử dụng YAML các files dưới dạng lưu trữ dữ liệu. Tôi sẽ lấy dữ liệu như một mảng kết hợp với cấu trúc này ví dụ:

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

Tuy nhiên, tôi muốn mở rộng các mảng kết hợp với một số chức năng và sử dụng các nhà điều hành ->, vì vậy tôi có thể viết một cái gì đó như thế này:

$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ó cách nào tốt để làm điều này mà không có định nghĩa lớp học không?

Về cơ bản, tôi muốn có các đối tượng kiểu JavaScript trong PHP :)

+4

nên sử dụng ít nhất sha1 những ngày này. – wesside

+2

+ cập nhật wesside 2016: BCrypt qua password_hash hoặc PBKDF2 với SHA512. – mjsa

+0

@mjsa cách để tìm hiểu! – wesside

Trả lời

4

Nghĩa đen chỉ làm cho một $class = new stdClass; và lặp và phân công lại. Hãy nhận biết đây chỉ là một cấp độ sâu, giống như typecasting. Bạn sẽ phải viết một iterator đệ quy để có được tất cả. Từ những gì tôi nhớ Kohana 2/3 có to_object() bạn có thể sử dụng.

Tìm thấy nó:

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

Lưu ý điều này cũng sẽ chuyển đổi các dãy tuần tự (không liên kết) thành các đối tượng. Bạn có thể muốn kết hợp với câu trả lời này: http://stackoverflow.com/a/4254008/1074400 –

27

Chỉ cần cast nó:

$user = (object)$user; 

Tất nhiên, còn có những giải pháp linh hoạt hơn như tạo một lớp mà thực hiện ArrayAccess:

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

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

Lưu ý rằng nếu $ user là 'null', hãy đưa nó vào' (object) 'sẽ làm cho nó không null (nó sẽ là một đối tượng trống). Để tránh điều này, bạn có thể làm điều này: '$ user = $ user? (đối tượng) $ user: null' –

Các vấn đề liên quan