Php class 組員:49726006賴羿陵 49726016林昱廷 49726024莊正暉 49726045張雅晴 49726050鄧偉勛
大綱 PHP 繼承Example 物件的基本觀念 多型polymorphism 類別class 多型Example 類別Example 介面 物件object 介面Example 物件Example 參考資料 作用域scope 物件導向語言三大特色 資料封裝encaosulation 封裝Example 繼承inheritance
PHP php 5是一種真正支援物件導向程式設計「OOP」(Object-oriented Programming)的程式語言,物件導向程式設計是一種更符合人性化的程式設計的方法,因為我們本來就是生活在一個物件的世界,思考模式也遵循著物件導向的模式。
物件的基本觀念 「物件」(Object)是物件導向技術的關鍵,以程式的角度來說,物件是資料與相關函數結合在一起的組合體。
類別 class
php class PHP的類別是物件的原型或藍圖,可以用來建立物件,屬於使用者自行定義的資料型態。類別的組成元素有兩種,如下所示: 成員資料(Data Member):物件的資料部分,也就是PHP變數、常數或其他物件的「成員變數」(Member Variables),這是物件「屬性」(Properties)的狀態值。 成員函數(Member Functions):物件處理資料的PHP函數,稱為「方法」(Methods),這是物件的行為。
定義class語法 class 類別名稱 { Var $特性變數名稱[=值]; Function 方法名稱(參數) { } }
Example class Person { var $name ; function setName($name) {$this->name=$name;}//將參數$name設定給特性變數 function getName($name) {$return $this->name;}//傳回特性變數值 }
物件 object
建立物件 在PHP程式可以將類別視為資料型態,使用new運算子來建立物件。 建立一個物件,要使用保留字new New語法 建立物件以後,可以透過物件呼叫它的方法 $物件變數->物件方法(引數);
Example $p1=new Person;//建立Person物件$p1 $p1->setName(‘Jay’);//呼叫$p1物件的方法 $p1->Name=$p1->getName();//呼叫$p1物件的方法 Echo $p1->name;//存取$p1物件特性變數
作用域 SCOPE
成員變數與方法的存取-三種修飾子 public修飾子:成員變數或方法是此類別建立物件對外的使用介面,可以讓PHP程式碼呼叫物件的成員方法或存取成員變數。如果沒有使用修飾子,預設是public。 protected修飾子:成員變數或方法可以在類別本身和其子類別存取或呼叫,類別的子類別稱為繼承。 private修飾子:成員變數或方法只能在類別本身呼叫或存取。
物件導向語言三大特色 封裝 (Encapsulation):將資料 (屬性) 與操作此資料的函數 (方法) 包在一起的特性。 繼承 (Inheritance):承接所有父類別 (Parent Class) 所有屬性方法,並可以加以改造的特性。 多型 (Polymorphism):當子類別繼承父類別中有成員的名稱相同時,則繼承類別的成員將會取代父類別的成員。
資料封裝 encaosulation
物件導向之資料封裝 將資料和處理資料的函數組合起來建立成物件。在PHP定義物件是使用「類別」(Class),它屬於一種抽象資料型態,換句話說,就是替程式語言定義新的資料型態。 對物件的使用者而言,只要曉得介面的方法,以及該方法所使用的參數就可以,並不須知道該方法的程式碼是如何設計的,物件的介面若規範的很清楚,那麼任何人都可以輕易的使用該物件。
Example <?php function getPhone()//傳回特性變數電話的值 class Person { return $this->phone; var $name; var $phone; function show()//顯示特性變數姓名及電話 function Person($name, $phone) echo '$name =', $this->name, "<BR>"; $this->name = $name; echo '$phone =', $this->phone, "<BR>"; $this->phone = $phone; } function setName($name)//設定特性變數的值提供姓名的引數值 $p1 = new Person('Kay', '07-7310606'); $aname = $p1->getName(); $aphone = $p1->getPhone(); echo '$aname=', $aname, '<BR>'; echo '$aphone=', $aphone, '<BR>'; function setPhone($phone) //設定特性變數的值提供電話的引數值 $p1->setName('Fay'); $p1->setPhone('07-2256666'); echo '$p1->show() : <BR>'; $p1->show(); ?> function getName()//傳回特性變數姓名的值 http://localhost/phpMyAdmin/encaosulation.php return $this->name;
繼承 inheritance
物件導向之繼承 繼承是物件的再利用,當定義好一個類別後,其他類別就可以繼承這個類別的資料和方法,新增或取代繼承物件的資料和方法。 定義時使用保留字entends 其後跟著基礎類別的名稱 Class 類別名稱 [extends 基礎類別] 例: class Employee extends Person 類別如果是繼承自其他類別,我們稱此類別為繼承類別的「子類別」(Subclass)或「延伸類別」(Derived Class),繼承的類別稱為「父類別」(Superclass)或「基礎類別」(Base Class)。 PHP的繼承並不支援多重繼承,也就是只能有一個父類別,而不能有多個父類別,繼承可以擴充現有類別的功能。 在父類別的成員方法如果並不符合需求,我們可以在子類別宣告同名的成員方法來取代父類別的成員方法,稱為「覆寫」(Override)。 final(終結繼承):當任一個類別被宣告為final之後,其將無法被繼承。當一個方法被宣告為final之後,其將無法被覆寫。(注意:final 無法宣告給任何屬性。)
Example <?php class Employee extends Person return $this->salary; { var $position; function show()//顯示特性變數職位及薪水 var $salary; function Employee($name, $phone, $position, $salary) parent::show(); echo '$position=', $this->position, "<BR>"; $this->Person($name, $phone); echo '$salary =', $this->salary, "<BR>"; $this->position = $position; $this->salary = $salary; } include_once(‘person.inc’); function setPosition($position)//設定特性變數的值提供職位引數值 $e2 = new Employee('Kay', '07-2256666', 'manager', 80000); echo '$e2->getPosition() = ', $e2->getPosition(), "<BR>"; echo '$e2->getSalary() = ', $e2->getSalary(), "<BR>"; echo '$e2->getName() = ', $e2->getName(), "<BR>"; echo '$e2->getPhone() = ', $e2->getPhone(), "<BR>"; function setSalary($salary)//設定特性變數的值提供薪水引數值 echo '$e2->show() : <BR>'; $e2->show(); ?> function getPosition()//傳回特性變數職位的值 http://localhost/phpMyAdmin/inheritance.php return $this->position; function getSalary()//傳回特性變數薪水的值
多型 polymorphism
物件導向之多型 多形屬於物件導向最複雜的特性,類別如果需要處理各種不同的資料型態,此時並不需要針對不同的資料型態建立各別的類別,可以直接繼承基礎類別,繼承此類別建立同名方法處理不同的資料型態,因為方法的名稱相同,只是程式碼不同,也稱為「同名異式」。是物件導向程式設計重要且複雜的觀念,它可以讓應用程式更容易擴充,一個同名方法,就可以處理不同資料型態的物件,產生不同的操作。
物件導向之多型 物件導向程式語言實作多形可以分成兩種方式,如下所示: 1.類別繼承的成員方法覆寫:繼承基礎類別覆寫同名的成員方法來處理不同資料型態的物件,如果有新的資料型態,即物件,只需新增繼承的子類別和覆寫成員方法。 2.PHP介面的成員方法實作:PHP的介面是指同一個物件擁有多種型態,換個角度,不同物件可以擁有相同的介面型態,所以一樣可以透過介面來實作多型。
多型的格式
多型的示意圖
EXAMPLE
執行結果
介面 Interface
介面之定義 為建立這些公用方法的一個管道,在介面中可以宣告公用抽象(abstract)的方法及常數,而讓其他的類別來實作這些方法。 介面只提供方法的宣告部分,並不提供方法的實作部分,因此可說介面為純設計用途。但類別除了提供資料欄(特性)及許多方法的宣告之外,也提供方法的實作,可以說具有設計及實作的功能。許多類別可同時安裝同一介面所宣告的公用抽象方法。
介面之使用 Interface AreaInterface { function area(); function circ(); } //定義一個介面AreaInterface,提供兩個公用的抽象方法area()&circ()
Example <?php interface AreaInterface //介面名稱AreaInterface { function area(); //面積方法area() return 2.0*3.14159*$this->radius; //傳回周長 function circ(); //周長方法circ() } class RectClass implements AreaInterface //實作一個介面 $rectclass = new RectClass(3.0, 5.0); var $w, $h; echo("<B>實作一個介面</B><BR>"); function RectClass($ww, $hh) //建構子 echo("長方形<BR>"); echo("寬=" . $rectclass->w . "<BR>"); $this->w = $ww; echo("高=" . $rectclass->h . "<BR>"); $this->h = $hh; echo("面積=" . $rectclass->area() . "<BR>"); echo("周長=" . $rectclass->circ() . "<BR>"); public function area() $circclass = new circclass(100.0); return $this->w*$this->h; //傳回面積 echo("圓形<BR>"); public function circ() echo("半徑=" . $circclass->radius . "<BR>"); echo("面積=" . $circclass->area() . "<BR>"); return 2.0*($this->w+$this->h); //傳回周長 echo("周長=" . $circclass->circ() . "<BR>"); ?> http://localhost/phpMyAdmin/interface.php class CircClass implements AreaInterface //實作一個介面 var $radius; function CircClass($radius) //建構子 $this->radius = $radius; return $this->radius*$this->radius*3.14159; //傳回面積
參考資料 http://php.net/manual/en/language.oop5.php PHP程式語言入門 林邦杰 編著<全華>