PHP物件導向技術(全面講解)____PHP

來源:互聯網
上載者:User

PHP物件導向技術(全面講解)(高洛峰)

本部分一共包括以下一些技術點:

1.面象對象的概念

2.什麼是類, 什麼是對象, 類和對象這間的關係

3.什麼是物件導向編程呢。

4.如何抽象出一個類。

5.如何執行個體化對象

6.如何去使用對象中的成員

7.特殊的引用“$this“的使用

8.構造方法與析構方法

9.封裝性

10.__set() __get() __isset() __unset()四個方法的應用

11.類的繼函

13.重載新的方法

14.訪問類型

15.靜態成員以及類中常量的使用

16.final關鍵字的應用

17.__toString()方法

18.複製對象

19.__call處理調用錯誤

20.自動載入類

21.把對象序列化

22.抽象方法和抽象類別

23.php5介面技術

12.多態的應用

  1.面象對象的概念

    物件導向編程(Object Oriented Programming, OOP, 物件導向程式設計)是一種電腦編程架構,OOP的一條基本原則是電腦程式是由單個能夠起到子程式作用的單元或對象組合而成,OOP達到了軟體工程的三個目標:重用性、靈活性和擴充性。為了實現整體運算,每個對象都能夠接收資訊、處理資料和向其它對象發送資訊。物件導向一直是軟體開發領域內比較熱門的話題,首先,物件導向符合人類看待事物的一般規律。其次,採用物件導向方法可以使系統各部分各司其職、各盡所能。為編程人員敞開了一扇大門,使其編程的代碼更簡潔、更易於維護,並且具有更強的可重用性。有人說PHP不是一個真正的物件導向的語言,這是事實。PHP 是一個混合型語言,你可以使用OOP,也可以使用傳統的過程化編程。然而,對於大型項目,你可能需要在PHP 中使用純的OOP去聲明類,而且在你的項目裡只用對象和類。這個概念我先不多說了,因為有很多人朋友遠離物件導向編程的主要原因就是一接觸物件導向概念的時候就理解不上去, 所以就不想去學下去了. 等讀者看完整體內容後再去把概念搞明白吧。 2.什麼是類, 什麼是對象, 類和對象這間的關係

 

類的概念:類是具有相同屬性和服務的一組對象的集合。它為屬於該類的所有對象提供了統一的抽象描述,其內部包括屬性和服務兩個主要部分。在物件導向的程式設計語言中,類是一個獨立的程式單位,它應該有一個類名並包括屬性說明和服務說明兩個主要部分。

對象的概念:對象是系統中用來描述客觀事物的一個實體,它是構成系統的一個基本單位。一個對象由一組屬性和對這組屬性進行操作的一組服務組成。從更抽象的角度來說,對象是問題域或實現域中某些事物的一個抽象,它反映該事物在系統中需要儲存的資訊和發揮的作用;它是一組屬性和有權對這些屬性進行操作的一組服務的封裝體。客觀世界是由對象和對象之間的聯絡組成的。

類與對象的關係就如模具和鑄件的關係,類的執行個體化結果就是對象,而對一類對象的抽象就是類.類描述了一組有相同特性(屬性)和相同行為(方法)的對象。

 

上面大概就是它們的定義吧, 也許你是剛接觸面象對象的朋友, 不要被概念的東西搞暈了, 給你舉個列子吧,如果你去中關村想買幾台組裝的PC機,到了那裡你第一步要幹什麼, 是不是裝機的工程師和你坐在一起,按你提供的資訊和你一起完成一個裝機的配置單呀, 這個配置單就可以想像成是類,它就是一張紙,但是它上面記錄了你要買的PC機的資訊,如果用這個配置單買10台機器,那麼這10台機子,都是按這個配置單組成的,所以說這10台機子是一個類型的,也可以說是一類的。那麼什麼是對象呢,類的執行個體化結果就是對象, 用這個配置單配置出來(執行個體化出來)的機子就是對象, 是我們可以操作的實體, 10台機子, 10個對象。 每台機子都是獨立的,只能說明他們是同一類的,對其中一個機做任何動作都不會影響其它9台機器,但是我對類修改, 也就是在這個配置單上加一個或少一個配件, 那麼裝出來的9個機子都改變了, 這是類和對象的關係(類的執行個體化結果就是對象).

  3.什麼是物件導向編程呢。

 

就不說他的概念,如果你想建立一個電腦教室,首先要有一個房間, 房間裡面要有N台電腦,有N個桌子, N個椅子, 白板, 投影機等等,這些是什麼,剛才咱們說了, 這就是對象,能看到的一個個的實體,可以說這個電腦教室的單位就是這一個個的實體物件, 它們共同組成了這個電腦教室,那麼我們是做程式,這和物件導向有什麼關係呢。開發一個系統程式和建一個電腦教室類似,你把每個獨立的功能模組抽象成類形成對象,由多個對象組成這個系統,這些對象之間都能夠接收資訊、處理資料和向其它對象發送資訊等等相互作用。就構成了物件導向的程式。

  4.如何抽象出一個類。

    上面已經介紹過了, 物件導向程式的單位就是對象,但對象又是通過類的執行個體化出來的,所以我們首先要做的就是如何來聲明類, 做出來一個類很容易,只要掌握基本的程式文法定義規則就可以做的出來,那麼痛點在那裡呢。 一個項目要用到多少個類,用多少個對象, 在那要定義類,定義一個什麼樣的類,這個類執行個體化出多少個對象, 類裡面有多少個屬性, 有多少個方法等等,這就需要讀者通過在實際的開發中就實際問題分析設計和總結了。

 

類的定義:

class 類名{

}

使用一個關鍵字class和後面加上一個你想要的類名以及加上一對大括弧, 這樣一個類的結構就定義出來了,只要在裡面寫代碼就可以了, 但是裡面寫什麼。 能寫什麼。怎樣寫才是一個完整的類呢。上面講過來,使用類是為了讓它執行個體出對象來給我們用, 這就要知道你想要的是什麼樣的對象了,像上面我們講的一個裝機配置單上寫什麼,你裝出來的機子就有什麼。比如說,一個人就是一個對象,你怎麼把一個你看好的人推薦給你們領導呢。當然是越詳細越好了:

 首先, 你會介紹這個人姓名、性別、年齡、身高、體重、電話、家庭住址等等。

 然後,你要介紹這個人能做什麼, 可以開車, 會說英語, 可以使用電腦等等。

 

    只要你介紹多一點, 別人對這個人就多一點瞭解, 這就是我們對一個人的描述, 現在我們總結一下,所有的對象我們用類去描述都是類似的, 從上面人的描述可以看到, 做出一個類來, 從定義的角度分兩部分, 第一是從靜態上描述, 第二是從動態上描述, 靜態上的描述就是我們所說的屬性, 像上面我們看到的,人的姓名、性別、年齡、身高、體重、電話、家庭住址等等。 動態上也就是人的這個對象的功能,比如這個人可以開車, 會說英語, 可以使用電腦等等,抽象成程式時,我們把動態寫成函數或者說是方法,函數和方法是一樣的。所以,所有類都是從屬性和方法這兩方面去寫, 屬性又叫做這個類的成員屬性,方法叫做這個類的成員方法。

 

class 人{

   成員屬性:姓名、性別、年齡、身高、體重、電話、家庭住址

   成員方法:可以開車, 會說英語, 可以使用電腦

}

屬性:

通過在類定義中使用關鍵字" var  "來聲明變數,即建立了類的屬性,雖然在聲明成員屬性的時候可以給定初值, 但是在聲明類的時候給成員屬性初使值是沒有必要的,比如說要是把人的姓名賦上“張三”,那麼用這個類執行個體出幾十個人,這幾十個人都叫張三了,所以沒有必要, 我們在執行個體出對象後給成員屬性初使值就可以了。

如: var  $somevar;

方法(成員函數):

通過在類定義中聲明函數,即建立了類的方法。

如: function  somefun(參數列表)

{      ... ...     }

 

<?php

     class Person

     {

         //下面是人的成員屬性

         var $name;  //人的名子

         var $sex;    //人的性別

         var $age;    //人的年齡

 

         //下面是人的成員方法

         function say()  //這個人可以說話的方法

         {

              echo "這個人在說話";

         }       

 

         function run()  //這個人可以走路的方法

         {

              echo "這個人在走路";

         }       

     }

?>

上面就是一個類的聲明, 從屬性和方法上聲明出來的一個類, 但是成員屬性最好在聲明的時候不要給初使的值, 因為我們做的人這個類是一個描述資訊, 將來用它執行個體化對象, 比如執行個體化出來10個人對象, 那麼這10個人, 每一個人的名子, 性別, 年齡都是不一樣的, 所以最好不要在這個地方給成員屬性賦初值, 而是對每個對象分別賦值的。

用同樣的辦法可以做出你想要的類了, 只要你能用屬性和方法能描述出來的實體都可以定義成類, 去執行個體化對象。

為了加強你對類的理解, 我們再做一個類, 做一個形狀的類, 形狀的範圍廣了點, 我們就做個矩形吧, 先分析一下, 想一想從兩方面分析,矩形的屬性都有什麼。 矩形的功能都有什麼。

class 矩形

{

     //矩形的屬性

     矩形的長;

     矩形的寬;

    

//矩形的方法

     矩形的周長;

     矩形的面積;

}

 

<?php

    class Rect

    {

        var $kuan;

        var $gao;

 

        function zhouChang()

        {

            計算矩形的周長;

        }

 

        function mianJi()

        {

            計算矩形的面積;   

        }

    }

 

?>

如果用這個類來建立出多個矩形對象,每個矩形對象都有自己的長和寬, 都可以求出自己的周長和面積了。

 類的聲明我們就到這裡吧。。

  5.如何執行個體化對象

我們上面說過物件導向程式的單位就是對象,但對象又是通過類的執行個體化出來的,既然我們類會聲明了,下一步就是執行個體化對象了。

當定義好類後,我們使用new關鍵字來產生一個對象。

     $對象名稱 = new  類名稱();

<?php

     class Person

     {

         //下面是人的成員屬性

         var $name;  //人的名子

         var $sex;    //人的性別

         var $age;    //人的年齡

 

         //下面是人的成員方法

         function say()  //這個人可以說話的方法

         {

              echo "這個人在說話";

         }       

 

         function run()  //這個人可以走路的方法

         {

              echo "這個人在走路";

         }       

     }

 

     $p1=new Person();

     $p2=new Person();

     $p3=new Person();

?>

$p1=new Person();

這條代碼就是通過類產生執行個體對象的過程,$p1就是我們執行個體出來的對象名稱, 同理,$p2, $p3也是我們執行個體出來的對象名稱,一個類可以執行個體出多個對象,每個對象都是獨立的,上面的代碼相當於執行個體出來3個人來, 每個人之間是沒有聯絡的, 只能說明他們都是人類, 每個人都有自己的姓名, 性別和年齡的屬性,每個人都有說話和走路的方法,只要是類裡面體現出來的成員屬性和成員方法,執行個體化出來的對象裡面就包含了這些屬性和方法。

對像在PHP裡面和整型、浮點型一樣,也是一種資料類,都是儲存不同類型資料用的,在啟動並執行時候都要載入到記憶體中去用, 那麼對象在記憶體裡面是怎麼體現的呢。記憶體從羅輯上說大體上是分為4段, 棧空間段, 堆空間段,程式碼片段, 初使化靜態段,程式裡面不同的聲明放在不同的記憶體段裡面,棧空間段是儲存佔用相同空間長度並且佔用空間小的資料類型的地方,比如說整型1, 10, 100, 1000, 10000, 100000等等,在記憶體裡面佔用空間是等長的,都是64位4個位元組。 那麼資料長度不定長,而且佔有空間很大的資料類型的資料放在那記憶體的那個段裡面呢。這樣的資料是放在堆記憶體裡面的。棧記憶體是可以直接存取的,而堆記憶體是不可以直接存取的記憶體。對於我們的對象來數就是一種大的資料類型而且是佔用空間不定長的類型,所以說對象是放在堆裡面的,但對象名稱是放在棧裡面的,這樣通過對象名稱就可以使用對象了。 

 

$p1=new Person();

 

對於這個條代碼, $p1是對象名稱在棧記憶體裡面,new Person()是真正的對象是在堆記憶體裡面的,具體的請看下圖:

從上圖可以看出$p1=new Person();等號右邊是真正的對象執行個體, 在堆記憶體裡面的實體,上圖一共有3次new Person(),所以會在堆裡面開闢3個空間,產生3個執行個體對象,每個對象之間都是相互獨立的,使用自己的空間,在PHP裡面,只要有一個new這個關鍵字出現就會執行個體化出來一個對象,在堆裡面開闢一塊自己的空間.

每個在堆裡面的執行個體對象是儲存屬性的,比如說,現在堆裡面的執行個體對象裡面都存有姓名、性別和年齡。每個屬性又都有一個地址。

$p1=new Person();等號的右邊$p1是一個引用變數,通過賦值運算子“=”把對象的首地址賦給“$p1“這個引用變數, 所以$p1是儲存物件首地址的變數,$p1放在棧記憶體裡邊,$p1相當於一個指標指向堆裡面的對象, 所以我們可以通過$p1這個引用變數來操作對象, 通常我們也稱對象引用為對象。

  6.如何去使用對象中的成員

上面看到PHP對象中的成員有兩種一種是成員屬性, 一種是成員方法。對象我們以經可以聲明了,$p1=new Person();  怎麼去使用對象的成員呢。要想訪問對象中的成員就要使用一個特殊的操作符”->”來完成對象成員的訪問:

              對象->屬性    $p1->name;        $p2->age;      $p3->sex;

              對象->方法      $p1->say();        $p2->run();
如下面執行個體:

<?php

     class Person

     {

         //下面是人的成員屬性

         var $name;  //人的名子

         var $sex;    //人的性別

         var $age;    //人的年齡

 

         //下面是人的成員方法

         function say()  //這個人可以說話的方法

         {

              echo "這個人在說話";

         }       

 

         function run()  //這個人可以走路的方法

         {

              echo "這個人在走路";

         }       

     }

 

     $p1=new Person();  //建立執行個體對象$p1

     $p2=new Person();  //建立執行個體對象$p2

     $p3=new Person();  //建立執行個體對象$p3

 

    

     //下面三行是給$p1對象屬性賦值

     $p1->name=”張三”;  

     $p1->sex=”男”;

     $p1->age=20;

    

     //下面三行是訪問$p1對象的屬性

     echo “p1對象的名子是:”.$p1->name.”<br>”;

     echo “p1對象的性別是:”.$p1->sex.”<br>”; 

     echo “p1對象的年齡是:”.$p1->age.”<br>”; 

 

     //下面兩行訪問$p1對象中的方法

     $p1->say();

     $p1->run();

 

//下面三行是給$p2對象屬性賦值

     $p2->name=”李四”;

     $p2->sex=”女”;

     $p2->age=30;

 

//下面三行是訪問$p2對象的屬性

     echo “p2對象的名子是:”.$p2->name.”<br>”;

     echo “p2對象的性別是:”.$p2->sex.”<br>”; 

     echo “p2對象的年齡是:”.$p2->age.”<br>”; 

 

//下面兩行訪問$p2對象中的方法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.