php 對象和類

面向對象程序設計的來源得自於人們看待電話、汽車這些物體的想法。不少程序設計者在討論面向對象程序設計的時候喜歡用「包裝」或者「繼承」這些讓通常人疑惑不解的詞語。咱們能夠把面向對象這個概念和天然物體聯繫起來去理解它的原理。讓咱們拿交通工具來作個比方。 設計圖 爲了構建交通工具咱們須要一份設計圖。這份設計圖能夠定義交通工具的車輪的數量、顏色等等。一種交通工具經過必定的屬性和行爲來定義。在PHP中這些屬性和行爲就叫作變量和方法(函數)。描述一個對象的一組變量和方法就構成了一個「類」。 擴展的設計圖 由於有各類不一樣類型的交通工具,好比汽車、自行車和摩托車。咱們須要一種方法,它可讓咱們爲各類交通工具增長新功能的同時也可使用交通工具的通常性的方法,換句話說,由於「履帶」要用在全部類型的交通工具上面,咱們不須要再從新編寫這種方法。咱們可以「繼承」來完成這個功能。假如咱們建立一個從「交通工具」繼承過來的「汽車」的類,全部在「交通工具」類中的方法將被「汽車」類繼承。 抽象 抽象的目的只關注於一個複雜對象的部分性質,爲了解決你的問題須要你去構建一個考究的對象。你能夠很容易的獲得一輛汽車成千上萬的屬性,可是若是你須要設計一個程序去保存一個汽車經銷商的目錄,那麼你應該只須要一個包含10多個屬性的子集。這樣一輛汽車被抽象成一個適合編程使用的汽車對象. 包裝 包裝能夠隱藏一組方法的內容工具機制而只提供給用戶一個定義良好的藉口。在面向對象程序編程中,包裝使得對象的數據結構和方法組合在一塊兒。最容易理解「包裝」的方式能夠參考電話機。當今消費者能夠購買各式各樣的電話機,雖然這些電話機的內部設計方法可能不一樣,可是全部這些電話機器都可以經過一個標準的公共接口通信。這就是包裝的思想. 一個類能夠定義新數據類型。PHP自己具備變量類型,好比字符串變量和浮點類型變量。可是經過類你能夠設計本身的數據類型好比船、用戶參考手冊和數據庫等等。一個類定義這種數據類型的屬性和行爲(成員變量和方法)。下面的例子顯示如何定義一個包含屬性和方法的類。 讓咱們看一下咱們的交通工具的實際的例子 <?php /* ** 如何定義一個類 */ class Class_Name { [var 變量定義] [Function 方法定義] } ?> ----------交通工具類------------ <?php class vehicle { /* ** 屬性 */ var $property1; var $property2; var $property3; /* ** 方法 */ function setTires($type) { if ($type == \"Firestone\") { $this->property1 = \"Must be a Ford SUV\"; } } function color($col) { $this->property2 = $col; } } ?> 如何使用定義好的類 類定義好之後,咱們就能夠創建它的實例。爲了使用剛纔的例子,咱們在下面建立一個「交通工具」類的實例。 <?php $myCar = new vehicle(); $myCar->setTires(\"Firestone\"); ?> 使用類中的變量 最大的不一樣點在於使用一個對象和對象擁有的值的種類。一個字符串變量卻是很容易理解,由於它擁有一個值。 $myStr = \"PHP stands for... uh.. i forget\"; 然而一個對象能夠擁有任何種類的值 $myCar->year = 1988; $myCar->value = 813.77; $myCar->hasAirbag = false; $myCar->color = \"periwinkle\"; 在PHP中,一個對象的全部成員變量默認是公有的。沒有辦法能夠強迫一個對象的訪問屬性,可是若是但願一個變量是私有變量的話,咱們能夠用一種強調的方式來實現。 $this pointer 若是你想調用一個對象的方法,你可使用 \'$this\'來調用此對象指定實例的成員變量。剛開始,你可能對這個有點不理解,讓咱們來看個例子。首先,假設你有兩輛汽車。 $myCar = new vehicle(); $spousesCar = new vehicle(); 如今你有了同一個類的兩個對象。你可能也聽過這樣的說法,「如今你有了同一個用戶定義變量類型的兩個綜合變量」。 These are just different ways of talking about the same OOP concepts. 每一個變量,$myCar 和 $spousesCar, 擁有這個類的獨立的一套屬性。 $myCar->property1; //這兩個是不一樣的 $spousesCar->property1; //即便property1只在類定義中出現一次。你必須清楚,它僅僅是爲了構成一個新數據類型而設計的。 可是在這個類內只有一個setTires()函數。當咱們使用下面的語句的時候,它如何瞭解是誰調用了它呢? $myCar->setTires(\"Firestone\"); 呵呵,如今這個$this就起做用了。在一個指定對象調用類內部的函數時候,這個對象就自動做爲一個參數傳遞。用$this是出於方便的須要。看看下面的例子你應該能夠理解。 $myCar->setTires(\"Firestone\"); /* ** 方法 */ function setTires($type) { if ($type == \"Firestone\") { $this->property1 = \"Must be a Ford SUV\"; } } //$this 表明 $myCar 變量 $spousesCar->setTires(\"Goodyear\"); /* ** 方法 */ function setTires($type) { if ($type == \"Firestone\") { $this->property1 = \"Must be a Ford SUV\"; } } //如今它就表明 $spousesCar. 建立一個構造器 在一個類的實例被建立之後,若是開發者但願能有一個「默認」的函數能夠調用,該怎麼辦呢?這就是要用到「構造器」 其實你只須要簡單的將構造器的名字定義爲類的名字就能夠實現。如今你每次建立這個類的對象的時候,這個構造器方法將被調用。 類的繼承 咱們之前說過,一個類能夠繼承另外一個類;可是咱們如何利用這種功能呢?在一個系統中,許多變量起相同的做用,僅僅一些的做用有些不一樣,繼承是很是有用的。繼承是一種方法,經過這種方法,一個類能夠用另一個類做爲模板來創建自身。繼承類將把在被繼承類中定義的成員變量和方法繼承過來。經過延伸或者繼承過來的類叫作子類。被繼承類的叫作超類或父類。這樣可使類之間的做用不一樣而且不會影響現存的代碼.如今讓咱們看個例子。 class Airplane { var $tirePressure; var $fuelLevel; var $passengerLimit; function takeOff() { ... } function land() { ... } function preFlightCheck() {} } class sevenFortySeven extends Airplane { function preFlightCheck() { //747飛機起飛預備工做 } } class biplane extends Airplane { function preFlightCheck() { //雙翼飛機起飛預備工做 } } $planeArray[] = new biplane(); $planeArray[] = new sevenFortySeven(); $planeArray[] = new sevenFortySeven(); $planeArray[] = new biplane(); for ($x = 0; $x < count($planeArray); $x++) { $currentPlane = $planeArray[$x]; if ($currentPlane->preFlightCheck() ) { $currentPlane->takeOff(); //不論是什麼型號的飛機,它都會知道它要起飛了 } else { print \"飛機出了點問題.\"; } } 類的靜態方法 當處理一個類的對象的時候,你可能放一個對這個對象有用的函數在這個類中,而不是再另寫一個特殊類。這樣的函數叫作靜態方法。一個良好 類應該包含全部有用的(utility)函數。 class Money { function addTax($amount,$percent){ return $amount + ($amount * $percent); } function convertCurrency ($amount, $from, $to) { //在數據庫中查找一個從$from變換到$to的轉換率 return $amount * $rate; } } $total = Money::addTax($subtotal,6.5); $yen = Money::convertCurrency ($usd, \"america\", \"japan\"); 方法工廠(Factory Methods) 有時候將代碼分紅一個一個的塊去建立對象頗有好處。你可使用大量的類,也可使用一個類來決定對象使用工廠類(factory methods)。 工廠類能夠幫助你有效的組織你的代碼。通常狀況下,工廠類包含一個比較大的轉換聲明而且返回一個合適的對象的實例。讓咱們看個有關C掃描 儀的例子。有一個Item基本類, 可是也有不少子類,這些子類能夠爲各類各樣的產品調用(好比電子類的, 服裝類的...)。 Class Item { var $price; var $isTaxable; var $properties; function getNewItem($upc) { //鏈接到數據庫 //查找$upc的類型並將其放入$type變量中 //查找$upc的屬性並將其放如$attrib變量中; return new $type($attrib); } } class produce extends Item { function produce ($a) { $this->properties = $a; } function requiresScale() { return true; } } class hardlines extends Item { function hardlines ($a) { $this->properties = $a; } function requiresSclae() { return false; } } while ( $upc = $scanner->next_code() ) { //假設有一個掃描儀的類 $z = Item::getNewItem($upc); if ($z->requiresScale() ) { echo \"須要尺寸!\"; } $subtotal += $z->properties[\"price\"]; }
相關文章
相關標籤/搜索