2017-01-31 15 views
0

如何在RedBean中存儲從$bean->box()返回的模型?不能在RedBean中存儲盒裝模型?

例如,下面的代碼無法正常工作(它只是插入一個空行):

class Model_Comment extends RedBean_SimpleModel { 
    public $message; 
} 

$bean = R::dispense('comment'); 
$model = $bean->box(); 
$model->message = "Testing"; 
R::store($model); 

它的工作原理,如果我使用$model->unbox()->message = "Testing",但是這可能會招人煩真正的快...

很明顯,上面的代碼只是一個例子,我可以在$bean這裏設置屬性message,但我希望能夠將一個bean框起來並將它傳遞給其他方法。

這是它應該如何工作,或者我在這裏錯過了什麼?

回答

0

事實證明,當處理PHP的「魔術」吸氣和設置方法__get()__set()時,結果是由「疑難雜症」造成的。

查看RedBean_SimpleModel的源代碼,實際上它使用魔術__set()方法在設置屬性時更新其bean。

這裏來了疑難雜症,直接從PHP documentation:寫入數據時不能訪問性能

__set()運行。

__get()用於從不可訪問的屬性中讀取數據。

__isset()通過在不可訪問的屬性上調用isset()或empty()來觸發。

當在不可訪問的屬性上使用unset()時,__unset()被調用。

所以事實證明,__set()絕不會爲現有的(訪問)類的成員,即public $message。所以我可以從類中刪除所有的公共字段,這樣可以解決問題,但是我會在IDE中失去所有自動完成功能和lint檢查。

所以我想出了這個解決方案,而不是:

class MyBaseModel extends RedBeanPHP\SimpleModel { 


    public function __construct(){ 
     foreach(get_object_vars($this) as $property => $value){ 
      if($property != 'bean') 
       unset($this->$property); 
     } 
    } 


} 


class Model_Comment extends MyBaseModel { 
    public $message; 
} 

這將有效消除從類MyBaseModel時,它的實例,除了$bean,這當然是RedBeanPHP_SimpleModel一個重要組成部分,所有成員變量。

現在我可以很容易地繼承MyBaseModel,並擁有我在我的子類模型中需要的所有公共字段,並且原始問題中的代碼將起作用。