2012-01-03 35 views
12

Tôi có một đối tượng trong PHP, thuộc loại MyObject.PHP sao chép tất cả các thuộc tính đối tượng này

$myObject instanceof MyObject 

Bây giờ, trong class MyObject, có một chức năng không tĩnh, và trong đó, tôi sử dụng các tài liệu tham khảo để "tôi", như $this, nhưng tôi cũng có một đối tượng khác ở đó.

Có thể, không thực hiện $this = $myObject, để đạt được nhiều hơn hoặc ít hơn tác dụng tương tự, chẳng hạn như một loại sắp xếp set_object_vars($this, get_object_vars($myObject))?

+0

Ý bạn là gì "* sử dụng tham chiếu đến 'tôi', như' $ this' * ", bạn có đang bí danh' $ this' trong phương thức này không? – Dan

+1

Bạn đăng mã như thế nào? –

+0

Tôi nghĩ câu hỏi của bạn cần một đánh giá nhỏ. Thậm chí nếu chúng ta có một hàm set_object_vars() có thực sự là tác dụng tương tự không? Bạn sẽ sao chép đối tượng, không tham chiếu nó. Xem sao chép và tham chiếu trong PHP để biết thêm. – Slavic

Trả lời

39
<?php 

class MyObject 
{ 
    public function import(MyObject $object) 
    { 
     foreach (get_object_vars($object) as $key => $value) { 
      $this->$key = $value; 
     } 
    } 
} 

sẽ làm những gì bạn muốn tôi đoán, nhưng bạn nên lưu ý những điều sau đây:

  1. get_object_vars sẽ chỉ tìm thấy tính chất không tĩnh
  2. get_object_vars sẽ chỉ tìm thấy thuộc tính truy cập theo phạm vi

theo phạm vi là một phần khá quan trọng và có thể xứng đáng được giải thích thêm một chút. Bạn có biết rằng phạm vi thuộc tính là phụ thuộc vào lớp thay vì thể hiện phụ thuộc trong PHP?

Điều đó có nghĩa là trong ví dụ trên, nếu bạn có thuộc tính private $bar trong MyObject, get_object_vars sẽ thấy nó, vì bạn đang ở trong một phiên bản của lớp MyObject. Điều này rõ ràng sẽ không hoạt động nếu bạn đang cố gắng nhập nhập phiên bản của một lớp khác.

+0

Cảm ơn! Đã không nghĩ rằng nếu điều đó! Bây giờ, tôi chỉ cần sao chép các thuộc tính vào thể hiện, các thuộc tính tĩnh là không liên quan ^^ – arik

0

@Geoffrey Bachelet chúng ta có thể cải thiện điều này:

class MyObject 
{ 
    //object or array as parameter 
    public function import($object) 
    { 
     $vars=is_object($object)?get_object_vars($object):$object; 
     if(!is_array($vars)) throw Exception('no props to import into the object!'); 
     foreach ($vars as $key => $value) { 
      $this->$key = $value; 
     } 
    } 
} 

Sự khác biệt là ở đây mà bạn có thể vượt qua một mảng bình thường (Hashtable) cũng như một đối tượng. Hãy suy nghĩ trong ví dụ về một số dữ liệu đến từ cơ sở dữ liệu.

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