2008-09-23 43 views

Trả lời

6

Bạn có thể có của bạn các lớp được khởi tạo rỗng và sau đó được nạp bởi bất kỳ số phương thức nào. Một trong những phương thức này có thể chấp nhận một cá thể của lớp cha làm đối số và sau đó sao chép dữ liệu của nó từ đó

class childClass extends parentClass 
{ 
    function childClass() 
    { 
     //do nothing 
    } 

    function loadFromParentObj($parentObj) 
    { 
     $this->a = $parentObj->a; 
     $this->b = $parentObj->b; 
     $this->c = $parentObj->c; 
    } 
}; 

$myParent = new parentClass(); 
$myChild = new childClass(); 
$myChild->loadFromParentObj($myParent); 
+0

Đây là giải pháp ít hơn hiện tại của tôi. Tôi cho rằng tôi không thể mong đợi bất kỳ phép thuật nào khác để làm điều này. –

1

tôi sẽ tưởng tượng bạn sẽ phải phát minh ra một số loại "nhà xây dựng bản sao". Sau đó, bạn chỉ cần tạo một đối tượng lớp con mới trong khi truyền trong đối tượng gốc.

2

Phương pháp tốt nhất là để tạo ra một phương pháp nhân bản trên Subclass để bạn có thể làm:

$myvar = $subclass->clone($originalObject) 

Ngoài ra nó có vẻ như bạn có thể nhìn vào Decorator Pattern php example

+0

không dùng cho PHP4, trừ khi tôi thực hiện sao chép bản thân mình –

3

Một đối tượng php không khác biệt nhiều với mảng và vì tất cả đối tượng PHP 4 biến là công khai, bạn có thể làm một số công cụ lộn xộn như thế này:

function clone($object, $class) 
{ 
    $new = new $class(); 
    foreach ($object as $key => $value) 
    { 
      $new->$key = $value; 
    } 
    return $new; 
} 
$mySubclassObject = clone($myObject, 'mySubclass'); 

của nó không đẹp, và certianly của nó không phải là điều tôi muốn xem xét để được thực hành tốt, nhưng nó tái sử dụng, và nó là khá gọn gàng .

5

Bạn có thể làm điều đó với một số ma thuật đen, mặc dù tôi sẽ nghiêm túc đặt câu hỏi lý do tại sao bạn có yêu cầu này ngay từ đầu. Nó cho thấy rằng có cái gì đó nghiêm trọng sai với thiết kế của bạn.

Tuy nhiên:

function change_class($object, $new_class) { 
    preg_match('~^O:[0-9]+:"[^"]+":(.+)$~', serialize($object), $matches); 
    return unserialize(sprintf('O:%s:"%s":%s', strlen($new_class), $new_class, $matches[1])); 
} 

này là tùy thuộc vào những hạn chế tương tự như serialize nói chung, có nghĩa là tài liệu tham khảo để các đối tượng hoặc các nguồn lực khác bị mất.

+0

Nghiêm túc, nó hoạt động. Nhưng bằng cách nào?! – Alfa

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