PHP基礎教程九之類與對象

來源:互聯網
上載者:User

本節講解的內容

  • 類與對象

  • 類的構成

  • 對象的建立

  • PHP記憶體回收機制

  • $this講解

前言

PHP是一個物件導向的程式設計語言,那麼什麼是物件導向呢?我們為什麼要物件導向呢?在我們的生活中有很多事物都是對象,比如一個杯子,一個盒子等,它們都有自己特有的特徵,它們都是對象。而我們在開發中的開發也是物件導向編程的。對象是人們要進行研究的任何事物,從最簡單的整數到複雜的飛機等均可看作對象。我們使用物件導向編程可以使我們看問題能夠看得全面,同時也有利於與資料的管理和維護,在PHP中物件導向可以分文兩類,一類是模子,創造對象使用,一類是對象,使用模子建立的起來的,那麼它們兩個有什麼關係呢?

類與對象

類與對象:具有相同特性(資料元素)和行為(功能)的對象的抽象就是類。因此,對象的抽象是類,類的具體化就是對象,也可以說類的執行個體是對象,類實際上就是一種資料類型。

也就是說把對象的功能和特徵抽取出來,組成一個類,就好比把一個杯子的模型抽取出來,而我們可以根據這個模型(也就是類)去建立各種杯子(也就是對象)。
那麼類是怎麼定義的呢?對象又是怎麼建立的?

類的組成

<?php    class Cat{ //定義一個貓類        public $name; //貓的名字        public $age;//貓的名字        public $color;//貓的顏色        //貓的構造方法        public function __construct(){        }        public function sleep(){            echo '貓睡覺';        }        public function eat(){            echo '貓吃飯';        }    }

上面的就是一個類的基本結構,下面我們詳細的講解每個部分的意義。

  • class 是一個關鍵字,不能修改,表示這是一個類。

  • Cat是類名, 類名寫法是大寫字母開頭,駝峰命名。

類的屬性

屬性: 成員屬性是類的一個組成部分,一般是基礎資料型別 (Elementary Data Type)(整數,字串等),也可是複合類型(對象、數組) , 資源類型。比如我們前面定義貓類的public $age 就是成員屬性。

可以說每個類都有屬性,類的屬性是一類的特徵,比如說貓可以有名字,年齡,顏色等,這些貓類共有的特徵。在類中這種特徵我們稱之為屬性,當然我們也可以不定義屬性。這個看自己的需求。

屬性前面的public是一個許可權修飾符,在後面會有講解。

成員方法(函數)

在上面的代碼中可以看到在類中還有幾個函數,它們和前面的函數是一樣的,不過是前面多了一個許可權控制符。也可以叫做成員方法,這些成員方法就是類中的行為動作,比如上面的貓類,有睡覺這個行為,也有吃飯這個行為,當然你可以自己寫它有什麼行為。

成員方法的文法:

存取修飾詞  function  函數名(形式參數){    //函數體;    //return 傳回值;}
  • 存取修飾詞 , 有三種(public, protected, privte), 預設為public, 後面我們會詳解

  • 其它部就和我們學的函數一樣了,包括調用機制

  • 參數列表可以有多個,可以是任意類型

  • 對於方法的傳回值,這個可以看具體需求。

  • 成員方法是定義在類中的,如果定義在類外就不是這個類的行為了。

建構函式

上面的貓類中有一個方法,方法名是—__construct(),這是個建構函式,那麼什麼是建構函式?建構函式就是在建立對象的時候,進行初始化資料的方法,比如我們想在建立貓類對象的時候,直接把貓的名字、年齡和顏色給它,就可以使用到建構函式。

public function __construct($name,$age,$color){            $this-> name = $name;            $this-> age = $age;            $this-> color = $color;}

建構函式的文法是:

public  function  __construct(形式參數){      //函數體}

對於建構函式的方法名__construct(),這個是一個魔術方法,在後面有介紹,其實建構函式還有一種寫法,建構函式的方法名是類的名字:

public function Cat($name,$age,$color){}

上面的構造方法定義方式也是正確的,但是推薦使用魔術方法的那一種(__construct()),以為這樣當我們的類名發生改變的時候,不用修改。

注意PHP中類的名字不區分大小寫,但是我們還是要按大小寫來寫。同時建構函式是沒有傳回值的。

建構函式需要注意的是:

  • 在一個類中,只能有一個建構函式, 這個是強制要求

  • 建構函式是系統自動調用的,我們不用自己調。

  • 如果我們沒有定義一個建構函式,系統會使用一個預設的建構函式,形式如下:public function

  • __construct(){},所以不管我們有沒有定義建構函式,它都是有建構函式的。

上面的三種情況就是類中大致的內容,在後續我們還會降類中的其他情況。

對象的建立

在上面建立對象的類已經有了,那麼怎麼建立對象呢?

對象建立方法

$cat = new Cat();

建立對象的文法是:

$對象名 = new 類名(參數1,參數2);

類名後面的括弧裡的參數是傳遞給類的建構函式的,如果建構函式沒有參數,可以不寫。

  • 對象的命名規範和普通變數一樣,使用駝峰法或者底線法均可

  • new也是一個關鍵字,不能修改,表示新建立對象

我們建立對象的目的就是需要操作對象,而操作對象,就是操作對象裡面的屬性和方法。

在上面的類下面寫如下代碼:

//建立對象,傳遞三個參數到建構函式。$cat = new Cat('小花',12,'black');//通過對象來訪問對象的屬性echo $cat -> name;echo '<br>';echo $cat -> age;echo '<br>';echo $cat -> color;echo '<br>';$cat-> sleep();$cat-> eat();.....結果......小花12black貓睡覺貓吃飯

上面的對象通過->訪問屬性和方法。注意屬性的前面沒有$符號

$對象名->屬性名稱= 值;echo  $對象名->屬性名稱;'-> ' 稱為對象運算子.

上面的就是對象的建立和最基本的應用

對象的傳遞類型

當我們把對象的值賦給另外一個變數是,是值傳遞還是引用傳遞?

    //建立一個對象    $cat = new Cat('小花',12,'black');    $cat1 = $cat; // 把$cat這個對象賦給$cat1;    $cat1 -> name = '小白';//利用$cat1這個對象修改對象的名字。    echo $cat1 -> name; //輸出$cat1對象的名字。    echo '<br>';    echo $cat -> name; //輸出$cat對象的名字。.....結果......小白小白

看到這裡可能有點蒙,不是值傳遞嗎?怎麼修改一個對象的屬性,另外一也變了?,

上面的代碼當中 $cat1=$cat也是值傳遞,但是這個值是對象的引用(可以理解物件識別碼),即每個包含對象的變數都持有對象的引(reference),而不是整個對象的拷貝。

在上面的圖中可以看到,當$cat賦值給$cat1時,也就是物件識別碼(#1)複製了一份,賦給$cat1,其實他們還是指向同一塊資料區,所以只要其中一個修改了值,另外一個也會變。

對象的銷毀

我們使用完對象後,已經確定在以後不會使用這個對象了,這個時候我們可以手動的銷毀對象,那麼我們怎麼讓對象銷毀呢?

  1. 當沒有任何變數指向對象時,會銷毀,因此我們可以把對象引用置為null

  2. 使用unset()函數來銷毀對象。

    //建立一個對象$cat = new Cat('小花',12,'black');$cat -> sleep();unset($cat);$cat -> sleep();.....結果.....貓睡覺Notice: Undefined variable: cat in D:\mywamp\Apache24\htdocs\zendstudio\yunsuanfu\object.php on line 27Fatal error: Call to a member function sleep() on null in D:\mywamp\Apache24\htdocs\zendstudio\yunsuanfu\object.php on line 27

    其實在一個檔案運行完的時候,PHP會啟動記憶體回收機制,自動的進行記憶體回收。這時候在裡面建立的對象就自動銷毀了,那麼什麼是PHP的記憶體回收機制?

PHP記憶體回收機制

記憶體回收,顧名思義,回收垃圾的,在程式中啟動記憶體回收機制的時機:

  • 在php中,當一個對象沒有任何引用指向它的時候,就會成為一個垃圾對象,php將啟動記憶體回收行程將對象銷毀。

  • 當程式退出前,php也將啟用記憶體回收行程,銷毀對象。

那麼什麼是記憶體回收機制?

記憶體回收機制是php5之後才有的,php5.3之前使用的記憶體回收機制是單純的“引用計數”,也就是每個記憶體對象都分配一個計數器,當記憶體對象被變數引用時,計數器+1;當變數引用撤掉後,計數器-1;當計數器=0時,表明記憶體對象沒有被使用,該記憶體對象則進行銷毀,記憶體回收完成。但是PHP5.3開始,使用了新的記憶體回收機制,在引用計數基礎上,實現了一種複雜的演算法,來檢測記憶體對象中引用環的存在(對象的相互引用),以避免記憶體流失。

$this說明

在上面寫類的建構函式的時候,可以看到在函數中使用到了$this,那麼在物件導向中$this是什嗎?

$this是在類中使用的訪問自身的一種機制。系統會給每個對象分配$this,代表當前對象。通俗的說就是在當前環境下,誰調用,$this就代表哪個對象。

<?php    class Cat{ //定義一個貓類        public $name; //貓的名字        public $age;//貓的名字        public $color;//貓的顏色        //貓的定義方法        public function Cat($name,$age,$color){            $this-> name = $name;            $this-> age = $age;            $this-> color = $color;        }        public function sleep(){            echo '貓睡覺<br>';        }        public function eat(){            echo '貓吃飯<br>';        }        //輸出貓的資訊        public function info(){            echo '貓的名字是' . $this -> name . ' 年齡是' . $this-> age . ' 顏色是' . $this-> color;        }    }    //建立一個對象    $cat = new Cat('小花',12,'black');    $cat -> info();    echo '<br>';    //建立另一個對象,傳進不同的屬性    $cat1 = new Cat('小白',6,'white');    $cat1 -> info();    .....結果.....貓的名字是小花 年齡是12 顏色是black貓的名字是小白 年齡是6 顏色是white

在上面的類中的info()函數中使用$this,不同的對象輸出不同的結果,因為在不同的環境下,誰調用,$this就代表哪個對象。

類的解構函式

在上面我們提到過,對象的銷毀,其實在類中有一個方法,就是在對象銷毀的時候由系統自動執行的。我們稱之為解構函式。

public function __destruct(){        echo $this->name . '被銷毀了<br>';}

在PHP5中引入了解構函式的概念,解構函式會在某個對象的所有引用被刪除(沒有變數指向對象,要被銷毀了),對象銷毀前執行。

解構函式的主要作用是去釋放對象分配的相關資源,比如資料庫連接或開啟的檔案等。

它的文法是:

function  __destruct(){    //函數體[釋放資源,比如資料庫連接,或者開啟檔案等等]}

解構函式也是系統自動調用的,我們不用自己調。但是當我們沒有寫解構函式的時候,系統不會執行解構函式。

<?phpclass Cat{ //定義一個貓類    public $name; //貓的名字    public $age;//貓的名字    public $color;//貓的顏色    //貓的定義方法    public function Cat($name,$age,$color){        $this-> name = $name;        $this-> age = $age;        $this-> color = $color;    }    public function sleep(){        echo '貓睡覺<br>';    }    public function eat(){        echo '貓吃飯<br>';    }    //輸出貓的資訊    public function info(){        echo '貓的名字是' . $this -> name . ' 年齡是' . $this-> age . ' 顏色是' . $this-> color;    }    public function __destruct(){        echo $this->name . '被銷毀了<br>';    }}//建立一個對象$cat = new Cat('小花',12,'black');echo $cat -> name; //輸出對象的名字echo '<br>';unset($cat); //銷毀對象,系統自動調用解構函式。.....結果......小花小花被銷毀了

當我們銷毀對象$cat時,解構函式自動執行。

  • 解構函式是在對象銷毀前自動執行的,它沒有傳回值。切一個類中只能有一個解構函式。

  • 解構函式是銷毀對象建立的資源,不是銷毀對象本身,對象本身是由記憶體回收機制銷毀的。

當我們一個檔案中建立了多個對象,在檔案執行完畢,銷毀對象的時候,是先建立的對象後銷毀,後建立的對象,先銷毀,這個原理和棧的原理很想,先進後出,後進先出。

總結

通過上面對類和對象的講解,我們可以知道類和對象的區別和聯絡。類是抽象的,代表著一類事物,如貓類。對象時具體的,代表一個具體事物。類是對象的模板,對象是類的一個個執行個體。同時類的基本構成要掌握。

以上就是PHP基礎教程九之類與對象的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!

  • 聯繫我們

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