LMSLogin
Position: Web system design > Wiki > Documents List > Document
PHP Class文件整理
by 賴羿陵, 2011-05-02 09:15, Views(5803)

Php class

大綱

¨  PHP

¨  物件的基本觀念

¨  類別class

¨  類別Example

¨  物件object

¨  物件Example

¨  作用域scope

¨  物件導向語言三大特色

¨  資料封裝encaosulation

¨  封裝Example

¨  繼承inheritance

¨  繼承Example

¨  多型polymorphism

¨  多型Example

¨  介面

¨  介面Example

¨  參考資料

一、               php

php 5是一種真正支援物件導向程式設計「OOP」(Object-oriented Programming)的程式語言,物件導向程式設計是一種更符合人性化的程式設計的方法,因為我們本來就是生活在一個物件的世界,思考模式也遵循著物件導向的模式。

二、物件的基本觀念

「物件」(Object)是物件導向技術的關鍵,以程式的角度來說,物件是資料與相關函數結合在一起的組合體。

三、               定義類別

PHP的類別是物件的原型或藍圖,可以用來建立物件,屬於使用者自行定義的資料型態。類別的組成元素有兩種,如下所示:

    成員資料(Data Member):物件的資料部分,也就是PHP變數、常數或其他物件的「成員變數」(Member Variables),這是物件「屬性」(Properties)的狀態值。

    成員函數(Member Functions)物件處理資料的PHP函數,稱為「方法」(Methods),這是物件的行為。

    PHP程式中使用類別建立的每一個物件稱為「實例」(Instances),同一個類別能夠建立多個物件,每一個物件是類別的一個物件實例,所以每一個實例都可以存取自己的成員變數,或是呼叫成員方法。

定義一個類別包括類別名稱、類別特性(屬性)以及類別方法。類別名稱屬於PHP識別字,沒有限制英文大小寫,但習慣上第一個字母使用大寫。

Php類別定義語法:

class 類別名稱

{

 [

  Var $特性變數名稱[=];

  ]

[

Function 方法名稱(參數)

{

}

]

}

例子:

class Person

{

 var $name ;

function setName($name)

{$this->name=$name;}//將參數$name設定給特性變數

function getName($name)

{$return $this->name;}//傳回特性變數值

}

 

四、建立物件

   PHP程式可以將類別視為資料型態,使用new運算子來建立物件。

建立一個物件,要使用保留字new

 New語法

$物件變數=new 類別名稱;

建立物件以後,可以透過物件呼叫它的方法

$物件變數->物件方法(引數);

例子:

$p1=new Person;//建立Person物件$p1

$p1->setName(‘Jay’);//呼叫$p1物件的方法

$p1->Name=$p1->getName();//呼叫$p1物件的方法

Echo $p1->name;//存取$p1物件特性變數

PHP程式中使用類別建立的每一個物件稱為「實例」(Instances),同一個類別能夠建立多個物件,每一個物件是類別的一個物件實例,所以每一個實例都可以存取自己的成員變數,或是呼叫成員方法。

五、作用域

成員變數與方法的存取-三種修飾子

n private修飾子:成員變數或方法只能在類別本身呼叫或存取。

n public修飾子:成員變數或方法是此類別建立物件對外的使用介面,可以讓PHP程式碼呼叫物件的成員方法或存取成員變數。如果沒有使用修飾子,預設是public。例如:上一節BookView類別使用var宣告的成員變數或方法,都是public

n protected修飾子成員變數或方法可以在類別本身和其子類別存取或呼叫,類別的子類別稱為繼承。

六、物件導向語言三大特色

l   封裝 (Encapsulation):將資料 (屬性) 與操作此資料的函數 (方法) 包在一起的特性。

l   繼承 (Inheritance):承接所有父類別 (Parent Class) 所有屬性方法,並可以加以改造的特性。

l   多型 (Polymorphism):當子類別繼承父類別中有成員的名稱相同時,則繼承類別的成員將會取代父類別的成員。

七、資料封裝(encaosulation)

資料封裝是將資料和處理資料的函數組合起來建立成物件。在PHP定義物件是使用「類別」(Class),它屬於一種抽象資料型態,換句話說,就是替程式語言定義新的資料型態。

資料封裝對物件的使用者而言,只要曉得介面的方法,以及該方法所使用    的參數就可以,並不須知道該方法的程式碼是如何設計的,物件的介面若規範的很清楚,那麼任何人都可以輕易的使用該物件。

Example:

<?php

class Person

{

   var $name;

   var $phone;

   function Person($name, $phone)

   {

      $this->name = $name;

      $this->phone = $phone;

   }

   function setName($name)//設定特性變數的值提供姓名的引數值

   {

      $this->name = $name;

   }

   function setPhone($phone) //設定特性變數的值提供電話的引數值

   {

      $this->phone = $phone;

   }

   function getName()//傳回特性變數姓名的值

   {

      return $this->name;

   }

   function getPhone()//傳回特性變數電話的值

   {

      return $this->phone;

   }

   function show()//顯示特性變數姓名及電話

   {

      echo '$name    =', $this->name, "<BR>";

      echo '$phone   =', $this->phone, "<BR>";

   }

}

$p1 = new Person('Kay', '07-7310606');

   $aname = $p1->getName();

$aphone = $p1->getPhone();

   echo '<PRE>';

      echo '$aname=', $aname, '<BR>';

   echo '$aphone=', $aphone, '<BR>';

$p1->setName('Fay');

$p1->setPhone('07-2256666');

echo '$p1->show() : <BR>';

$p1->show();

?>

 

印出結果

$aname=Kay
$aphone=07-7310606
$p1->show() :
$name    =Fay
$phone   =07-2256666

八、               繼承(inheritance)

繼承是物件的再利用,當定義好一個類別後,其他類別就可以繼承這個類別的資料和方法,新增或取代繼承物件的資料和方法。

定義時使用保留字entends 其後跟著基礎類別的名稱

Class 類別名稱   [extends 基礎類別]

例子:

class Employee extends Person

    類別如果是繼承自其他類別,我們稱此類別為繼承類別的「子類別」(Subclass)或「延伸類別」(Derived Class),繼承的類別稱為「父類別」(Superclass)或「基礎類別」(Base Class)。

    PHP的繼承並不支援多重繼承,也就是只能有一個父類別,而不能有多個父類別,繼承可以擴充現有類別的功能。例如:父類別Vehicle的宣告

    在父類別的成員方法如果並不符合需求,我們可以在子類別宣告同名的成員方法來取代父類別的成員方法,稱為「覆寫」(Override)。

     final(終結繼承):當任一個類別被宣告為final之後,其將無法被繼承。當一個方法被宣告為final之後,其將無法被覆寫。(注意:final 無法宣告給任何屬性。)

 

Example:

<?php

class Employee extends Person

{

   var $position;

   var $salary;

   function Employee($name, $phone, $position, $salary)

   {

      $this->Person($name, $phone);

      $this->position = $position;

      $this->salary = $salary;

   }

   function setPosition($position)//設定特性變數的值提供職位引數值

   {

      $this->position = $position;

   }

   function setSalary($salary)//設定特性變數的值提供薪水引數值

   {

      $this->salary = $salary;

   }

   function getPosition()//傳回特性變數職位的值

   {

      return $this->position;

   }

   function getSalary()//傳回特性變數薪水的值

   {

      return $this->salary;

   }

   function show()//顯示特性變數職位及薪水

   {

      parent::show();

      echo '$position=', $this->position, "<BR>";

      echo '$salary  =', $this->salary, "<BR>";

   }

}

include_once('person.inc');

echo "<PRE>";

$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>";

echo '$e2->show() : <BR>';

$e2->show();

?>

   印出結果:

$e2->getPosition() = manager
$e2->getSalary() = 80000
$e2->getName() = Kay
$e2->getPhone() = 07-2256666
$e2->show() :
$name    =Kay
$phone   =07-2256666
$position=manager
$salary  =80000

 

九、多型(polymorphism)

多形屬於物件導向最複雜的特性,類別如果需要處理各種不同的資料型態,此時並不需要針對不同的資料型態建立各別的類別,可以直接繼承基礎類別,繼承此類別建立同名方法處理不同的資料型態,因為方法的名稱相同,只是程式碼不同,也稱為「同名異式」。是物件導向程式設計重要且複雜的觀念,它可以讓應用程式更容易擴充,一個同名方法,就可以處理不同資料型態的物件,產生不同的操作。

    物件導向程式語言實作多形可以分成兩種方式,如下所示:

1.類別繼承的成員方法覆寫繼承基礎類別覆寫同名的成員方法來處理不同資料型態的物件,如果有新的資料型態,即物件,只需新增繼承的子類別和覆寫成員方法。

2.PHP介面的成員方法實作PHP的介面是指同一個物件擁有多種型態,換個角度,不同物件可以擁有相同的介面型態,所以一樣可以透過介面來實作多型。

多型的示意圖

十、 介面之定義及使用

定義:

     為建立這些公用方法的一個管道,在介面中可以宣告公用抽象(abstract)的方法及常數,而讓其他的類別來實作這些方法。

       介面只提供方法的宣告部分,並不提供方法的實作部分,因此可說介面為純設計用途。但類別除了提供資料欄(特性)及許多方法的宣告之外,也提供方法的實作,可以說具有設計及實作的功能。許多類別可同時安裝同一介面所宣告的公用抽象方法。

使用:

Interface AreaInterface

   {

     function area();

     function circ();

}

//定義一個介面AreaInterface,提供兩個公用的抽象方法area()&circ()

Example

<?php

interface AreaInterface              //介面名稱AreaInterface

{

   function area();                         //面積方法area()

   function circ();                         //周長方法circ()

}

class RectClass implements AreaInterface      //實作一個介面

{

   var $w, $h;

   function RectClass($ww, $hh)                     //建構子

   {

      $this->w = $ww;

      $this->h = $hh;

   }

   public function area()

   {

      return $this->w*$this->h;                   //傳回面積

   }

   public function circ()

   {

      return 2.0*($this->w+$this->h);             //傳回周長

   }

}

class CircClass implements AreaInterface      //實作一個介面

{

   var $radius;

   function CircClass($radius)                      //建構子

   {

      $this->radius = $radius;

   }

   public function area()

   {

      return $this->radius*$this->radius*3.14159; //傳回面積

   }

   public function circ()

   {

      return 2.0*3.14159*$this->radius;           //傳回周長

   }

}

$rectclass = new RectClass(3.0, 5.0);

echo("<B>實作一個介面</B><BR>");

echo("長方形<BR>");

echo("=" . $rectclass->w . "<BR>");

echo("=" . $rectclass->h . "<BR>");

echo("面積=" . $rectclass->area() . "<BR>");

echo("周長=" . $rectclass->circ() . "<BR>");

$circclass = new circclass(100.0);

echo("<B>實作一個介面</B><BR>");

echo("圓形<BR>");

echo("半徑=" . $circclass->radius . "<BR>");

echo("面積=" . $circclass->area() . "<BR>");

echo("周長=" . $circclass->circ() . "<BR>");

?>

 

印出結果:

實作一個介面
長方形
=3
=5
面積=15
周長=16
實作一個介面
圓形
半徑=100
面積=31415.9
周長=628.318

 

<補充>類別的方法

   在還沒有建立物件之前就要呼叫類別裡的方法,可以使用

類別名稱::類別方法名稱(引數);

   因為沒有牽涉到任何物件,因此你所呼叫的方法裡的程式碼不能使用代表本物件的this

<?php

class Hello

{

   function greeting($name)

   {

      echo "Hello, $name <BR>";

   }

}

Hello::greeting('Kay');

$hello = new Hello;

$hello->greeting('Fay');

?>

   在還沒建立物件之前叫就呼叫greeting()方法,類別名稱為Hello,類別方法為greeting(),引數為'Kay',將此引數值’Kay’傳給$name,因此$name的值為’Kay’,執行echo實顯示[Hello,Kay]訊息。

    在建立一個Hello類別的物件$hello,透過該物件呼叫greeting()方法,提供的引數為’Fay’,因此顯示出[Hello,Kay]的訊息

印出結果

Hello, Kay

Hello, Fay

 

 

參考資料

http://php.net/manual/en/language.oop5.php

sPHP程式語言入門 林邦杰 編著<全華>

 

Attachments