2012-01-03 57 views
12

我在PHP中有一個類型爲MyObject的對象。PHP將所有對象屬性複製到此

$myObject instanceof MyObject 

現在,在class MyObject,有一個非靜態函數,並在那裏,我用所提到的「我」,像$this,但我也有另一個對象那裏。

是否有可能,而不是做$this = $myObject,實現或多或少相同的效果,如類似set_object_vars($this, get_object_vars($myObject))

+0

你是什麼意思「*使用'me'的引用,像'$ this' *」,你是否在方法中用'$ this'別名? – Dan 2012-01-03 13:13:55

+1

你如何發佈代碼? – 2012-01-03 13:14:32

+0

我認爲你的問題需要一點點評論。即使我們有一個set_object_vars()函數,那會是真正的效果嗎?您將複製對象,而不是引用它。有關更多信息,請參閱PHP中的複製和引用。 – Slavic 2012-01-03 13:14:38

回答

39
<?php 

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

會做你想要我猜,但你應該注意以下事項:

  1. get_object_vars只能找到非靜態特性
  2. get_object_vars只能找到可訪問屬性根據範圍

根據範圍的部分是相當重要的,可能值得多一點解釋。你知道在PHP中屬性範圍是類依賴於而不是實例依賴嗎?

這意味着在上面的示例中,如果MyObject中有private $bar屬性,則get_object_vars會看到它,因爲您處於MyObject類的實例中。如果您嘗試導入另一個類的實例,這顯然不起作用。

+0

謝謝!沒想到如果!現在,我只需要將屬性複製到實例,靜態屬性是無關緊要的^^ – arik 2012-01-03 14:58:32

0

@Geoffrey巴切萊特我們可以改善這一點:

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; 
     } 
    } 
} 

這裏的區別是,你可以通過一個普通的數組(哈希表)以及一個對象。想一想關於來自數據庫的一些數據的例子。

相關問題