PHP 5.0物件模型深度探索之起步

來源:互聯網
上載者:User

  物件導向編程被設計來為大型軟體項目提供解決方案,尤其是多人合作的項目. 當原始碼增長到一萬行甚至更多的時候,每一個更動都可能導致不希望的副作用. 這種情況發生於模組間結成秘密同盟時候,就像第一次世界大戰前的歐洲。

  //haohappy注:喻指模組間的關聯度過高,相互依賴性太強.更動一個模組導致其它模組也必須跟著更動。

  想像一下,如果有一個用來處理登入的模組允許一個信用卡處理模組來分享它的資料庫連接. 當然出發點是好的,節省了進行另一個資料庫連接的支出.然而有時,登入處理模組改變了其中一個變數的名字,就可能割斷了兩者間的協議.導致信用卡模組的處理出錯,進而導致處理髮票的模組出錯. 很快地,體系中所有無關的模組都可能由此出錯.

  因此,我覺得有點戲劇性地,絕大多數程式員都對耦合和封裝心存感激. 耦合是兩個模組間依賴程度的量度. 耦合越少越好.我們希望能夠從已有的項目中抽走一個模組並在另一個新項目中使用.

  我們也希望在某個模組內部大規模的更動而不用擔心對其他模組的影響. 封裝的原則可以提供這個解決方案.模組被看待成相對獨立,並且模組間的資料通訊通過介面來進行. 模組不通過彼此的變數名來窺探另一個模組,它們通過函數來禮貌地發送請求.

  封裝是你可以在任何程式設計語言中使用的一個原則. 在PHP和許多面向過程的語言中,可以偷懶是很有誘惑的.沒有什麼可以阻止你通過模組來構建一個假想的WEB. 物件導向編程是使程式員不會違背封裝原則的一種方法.

  在物件導向編程中,模組被組織成一個個對象. 這些對象擁有方法和屬性. 從抽象的角度來看,方法是一個對象的所做的動作,而屬性是對象的特性.從編程角度來看,方法就是函數而屬性是變數. 在一個理想化的物件導向體系中,每個部份都是一個對象. 體系由對象及對象間通過方法來形成的聯絡構成.

  一個類定義了對象的屬性. 如果你在烘烤一組甜餅對象,那麼類將會是甜餅機. 類的屬性和方法是被調用的成員. 人們可以通過說出資料成員或者方法成員來表達.

  每種語言提供了不同的途徑來訪問對象. PHP從C++中借用概念,提供一個資料類型用來在一個標識符下包含函數和變數。最初設計PHP的時候,甚至PHP3被開發出時,PHP並不打算提供開發超過10萬行代碼的大型項目的能力。隨著PHP和Zend引擎的發展,開發大型項目變得有可能,但無論你的項目規模多大,用類來書寫你的指令碼將可以讓代碼實現重用。這是一個好主意,特別當你願意與別人分享你的代碼的時候。

  有關對象的想法是電腦科學上最令人興奮的概念之一。開始很難掌握它,但我可以保證,一旦你掌握了它,用它的思維來思考將會非常自然。

  PHP5 的物件模型

  PHP5有一個單重繼承的,限制訪問的,可以重載的物件模型. 本章稍後會詳細討論的”繼承”,包含類間的父-子關係. 另外,PHP支援對屬性和方法的限制性訪問. 你可以聲明成員為private,不允許外部類訪問. 最後,PHP允許一個子類從它的父類中重載成員.

  PHP5的物件模型把對象看成與任何其它資料類型不同,通過引用來傳遞. PHP不要求你通過引用(reference)顯性傳遞和返回對象. 在本章的最後將會詳細闡述基於引用的物件模型. 它是PHP5中最重要的新特性.

  有了更直接的物件模型,就擁有了附加的優勢: 效率提高, 佔用記憶體少,並且具有更大的靈活性.

  在PHP的前幾個版本中,指令碼預設複製對象.現在PHP5隻移動控制代碼,需要更少的時間. 指令碼執行效率的提升是由於避免了不必要的複製. 在對象體系帶來複雜性的同時,也帶來了執行效率上的收益. 同時,減少複製意味著佔用更少的記憶體,可以留出更多記憶體給其它操作,這也使效率提高.

  Zand引擎2具有更大的靈活性. 一個令人高興的發展是允許析構--在對象銷毀之前執行一個類方法. 這對於利用記憶體也很有好處,讓PHP清楚地知道什麼時候沒有對象的引用,把空出的記憶體配置到其它用途.

  PHP5的記憶體管理

  對象傳遞

  PHP5使用了Zend引擎II,對象被儲存於獨立的結構Object Store中,而不像其它一般變數那樣儲存於Zval中(在PHP4中對象和一般變數一樣儲存於Zval)。在Zval中僅儲存物件的指標而不是內容(value)。當我們複製一個對象或者將一個對象當作參數傳遞給一個函數時,我們不需要複製資料。僅僅保持相同的對象指標並由另一個zval通知現在這個特定的對象指向的Object Store。由於對象本身位於Object Store,我們對它所作的任何改變將影響到所有持有該對象指標的zval結構----表現在程式中就是目標對象的任何改變都會影響到來源物件。.這使PHP對象看起來就像總是通過引用(reference)來傳遞,因此PHP中對象預設為通過“引用”傳遞,你不再需要像在PHP4中那樣使用&來聲明。

  記憶體回收機制

  某些語言,最典型的如C,需要你顯式地要求分配記憶體當你建立資料結構。一旦你分配到記憶體,就可以在變數中儲存資訊。同時你也需要在結束使用變數時釋放記憶體,這使機器可以空出記憶體給其它變數,避免耗光記憶體。

  PHP可以自動進行記憶體管理,清除不再需要的對象。PHP使用了引用計數(reference counting)這種單純的記憶體回收(garbage collection)機制。每個對象都內含一個引用計數器,每個reference串連到對象,計數器加1。當reference離開生存空間或被設為NULL,計數器減1。當某個對象的引用計數器為零時,PHP知道你將不再需要使用這個對象,釋放其所佔的記憶體空間。

  例如:

<?php
class Person{}
function sendEmailTo(){}
$haohappy = new Person( );
// 建立一個新對象: 引用計數 Reference count = 1
$haohappy2 = $haohappy;
// 通過引用複製: Reference count = 2
unset($haohappy);
// 刪除一個引用: Reference count = 1
sendEmailTo($haohappy2);
// 通過引用傳遞對象:
// 在函數執行期間:
// Reference count = 2
// 執行結束後:
// Reference count = 1
unset($haohappy2);
// 刪除引用: Reference count = 0 自動釋放記憶體空間
?>



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.