2010-04-08 64 views
1

我有一個對象如何取消設置對象的繼承屬性?

(
     [id] => 1 
     [parent_id] => 0 
     [result:Database:private] => 
     [db:Database:private] => mysqli Object 
      (
       [affected_rows] => 0 
       ... 
      ) 

    ) 

顯然,對象繼承了「DB」和父數據庫類的「結果」的性質。

unset($ object-> result)或unset($ object-> result:Database)也可以取消設置($ object-> result:Database:private)的工作。

當我們不再需要這些屬性時(即當對象屬性即將輸出時),我該如何解除這些屬性?

將數據庫對象作爲其他類的繼承屬性(使用數據庫連接的所有其他類擴展一個數據庫類)是否是一個好主意?

回答

1

嘗試$object->result = null

它是一個通常有一個數據庫對象作爲其他類的繼承屬性是一個好主意(擴展一個數據庫類使用的數據庫連接的所有其他類)?

不。最好是你的班級有一個責任。將數據庫連接保存在一個或一組類中,這些類的責任是從數據庫讀取和寫入數據。您的其他域對象應該處理自己的責任,而不會被SQL和數據庫代碼擠佔 - 即使它是繼承的。

您可能還想閱讀「支持組合優於繼承」的概念。

+1

$ object-> result = null將只刪除對內存中將繼續存在的DB的引用。 unset()從內存中刪除對象,他不能使用unset(),因爲DB也是在其他類中繼承的。 – 2010-04-08 14:22:29

+0

不幸的是,$ object-> result = null和unset($ object-> result)都不起作用。 $ object-> result = null僅設置新屬性'result'。 – Blackbeard 2010-04-08 14:57:02

1

如果僅在一個對象中使用unset(),則不會取消設置該對象,因爲它存在於某處的內存中,而您的對象中只有一個引用。您持有此DB對象的所有其他對象都使用相同的參考。你可以做的唯一的事情就是把這個引用設置爲等於NULL,但是由於數據庫仍然在那裏被其他對象使用,所以你並沒有釋放任何內存。

通常我不會擔心取消設置DB對象,因爲您不會獲得任何性能提升。執行結束時,PHP將自動垃圾收集其對象。

是的,將一個靜態DB對象或繼承到正在使用數據庫的類中是一個好主意。

+0

取消設置數據庫對象繼承屬性的目的不是爲了釋放內存,而是爲了使子對象更易於處理迭代。我擴展Database類與所有其他類需要數據庫IO,因爲我發現很容易做$ this-> query($ query),而且Eclipse不喜歡$ this-> db-> query($ query ) 句法。我很高興你發現這種方法是一個好主意。 Мерсимногозапомощтаприятелю;) – Blackbeard 2010-04-08 14:48:51

+0

你是什麼意思,更易於管理?同樣,所有繼承DB的類都是隻針對數據庫操作的一個好主意。 Пакзаповядай:) – 2010-04-08 16:06:49

+0

例如:具有許多屬性的Item類擴展了Database類,所以Item類可以使用任何數據庫方法。當類Item的對象即將輸出時,我想剝離任何繼承屬性的對象,並在Item對象上使用迭代。 – Blackbeard 2010-04-08 16:34:29