php類和物件導向詳解

來源:互聯網
上載者:User

本文主要和大家分享php的基礎部分,php類和物件導向詳解,一共有十點,希望能協助度到大家。

一、PHP類和對象

<?php//定義一個類class Car {    var $name = '汽車';    function getName() {        return $this->name;    }}//執行個體化一個car對象$car = new Car();$car->name = '奧迪A6'; //設定對象的屬性值echo $car->getName();  //調用對象的方法 輸出對象的名字

三、類的屬性

在類中定義的變數稱之為屬性,通常屬性跟資料庫中的欄位有一定的關聯,因此也可以稱作“欄位”。屬性聲明是由關鍵字 public,protected 或者 private 開頭,後面跟一個普通的變數聲明來組成。屬性的變數可以設定初始化的預設值,預設值必須是常量。

存取控制的關鍵字代表的意義為:

public:公開的 protected:受保護的 private:私人的class Car {    //定義公用屬性    public $name = '汽車';    //定義受保護的屬性    protected $corlor = '白色';     //定義私人屬性    private $price = '100000';}預設都為public,外部可以訪問。一般通過->對象操作符來訪問對象的屬性或者方法,對於靜態屬性則使用::雙冒號進行訪問。當在類成員方法內部調用的時候,可以使用$this偽變數調用當前對象的屬性。$car = new Car();echo $car->name;   //調用對象的屬性echo $car->color;  //錯誤 受保護的屬性不允許外部調用echo $car->price;  //錯誤 私人屬性不允許外部調用受保護的屬性與私人屬性不允許外部調用,在類的成員方法內部是可以調用的。class Car{    private $price = '1000';    public function getPrice() {        return $this->price; //內部訪問私人屬性    }}

四、類的方法

方法就是在類中的function,很多時候我們分不清方法與函數有什麼差別,在面向過程的程式設計中function叫做函數,在物件導向中function則被稱之為方法。

同屬性一樣,類的方法也具有public,protected 以及 private 的存取控制。

存取控制的關鍵字代表的意義為:
public:公開的
protected:受保護的
private:私人的

我們可以這樣定義方法

class Car {    public function getName() {        return '汽車';    }}$car = new Car();echo $car->getName();使用關鍵字static修飾的,稱之為靜態方法,靜態方法不需要執行個體化對象,可以通過類名直接調用,操作符為雙冒號::。class Car {    public static function getName() {        return '汽車';    }}echo Car::getName(); //結果為“汽車”

五、建構函式和解構函式

PHP5可以在類中使用__construct()定義一個建構函式,具有建構函式的類,會在每次對象建立的時候調用該函數,因此常用來在對象建立的時候進行一些初始化工作。class Car {   function __construct() {       print "建構函式被調用\n";   }}$car = new Car(); //執行個體化的時候 會自動調用建構函式__construct,這裡會輸出一個字串在子類中如果定義了__construct則不會調用父類的__construct,如果需要同時調用父類的建構函式,需要使用parent::__construct()顯式的調用。class Car {   function __construct() {       print "父類建構函式被調用\n";   }}class Truck extends Car {   function __construct() {       print "子類建構函式被調用\n";       parent::__construct();   }}$car = new Truck();同樣,PHP5支援解構函式,使用__destruct()進行定義,解構函式指的是當某個對象的所有引用被刪除,或者對象被顯式的銷毀時會執行的函數。class Car {   function __construct() {       print "建構函式被調用 \n";   }   function __destruct() {       print "解構函式被調用 \n";   }}$car = new Car(); //執行個體化時會調用建構函式echo '使用後,準備銷毀car對象 \n';unset($car); //銷毀時會調用解構函式

當PHP代碼執行完畢以後,會自動回收與銷毀對象,因此一般情況下不需要顯式的去銷毀對象。

六、Static靜態關鍵字

靜態屬性與方法可以在不執行個體化類的情況下調用,直接使用類名::方法名的方式進行調用。靜態屬性不允許對象使用->操作符調用。

class Car {    private static $speed = 10;    public static function getSpeed() {        return self::$speed;    }}echo Car::getSpeed();  //調用靜態方法靜態方法也可以通過變數來進行動態調用$func = 'getSpeed';$className = 'Car';echo $className::$func();  //動態調用靜態方法

靜態方法中,$this偽變數不允許使用。可以使用self,parent,static在內部調用靜態方法與屬性。

class Car {    private static $speed = 10;    public static function getSpeed() {        return self::$speed;    }    public static function speedUp() {        return self::$speed+=10;    }}class BigCar extends Car {    public static function start() {        parent::speedUp();    }}BigCar::start();echo BigCar::getSpeed();

七、存取控制

前面的小節,我們已經接觸過存取控制了,存取控制通過關鍵字public,protected和private來實現。被定義為公有的類成員可以在任何地方被訪問。被定義為受保護的類成員則可以被其自身以及其子類和父類訪問。被定義為私人的類成員則只能被其定義所在的類訪問。

類屬性必須定義為公有、受保護、私人之一。為相容PHP5以前的版本,如果採用 var 定義,則被視為公有。

class Car {   $speed = 10; //錯誤 屬性必須定義存取控制   public $name;   //定義共有屬性}類中的方法可以被定義為公有、私人或受保護。如果沒有設定這些關鍵字,則該方法預設為公有class Car {   //預設為共有方法   function turnLeft() {   }}如果建構函式定義成了私人方法,則不允許直接執行個體化對象了,這時候一般通過靜態方法進行執行個體化,在設計模式中會經常使用這樣的方法來控制對象的建立,比如單例模式只允許有一個全域唯一的對象。class Car {   private function __construct() {       echo 'object create';   }    private static $_object = null;    public static function getInstance() {       if (empty(self::$_object)) {            self::$_object = new Car(); //內部方法可以調用私人方法,因此這裡可以建立對象       }        return self::$_object;   }}//$car = new Car(); //這裡不允許直接執行個體化對象$car = Car::getInstance(); //通過靜態方法來獲得一個執行個體

八、對象繼承

繼承是物件導向程式設計中常用的一個特性,汽車是一個比較大的類,我們也可以稱之為基類,除此之外,汽車還分為卡車、轎車、東風、寶馬等,因為這些子類具有很多相同的屬性和方法,可以採用繼承汽車類來共用這些屬性與方法,實現代碼的複用。

class Car {    public $speed = 0; //汽車的起始速度是0    public function speedUp() {        $this->speed += 10;        return $this->speed;    }}//定義繼承於Car的Truck類class Truck extends Car{    public function speedUp(){        $this->speed = parent::speedUp() + 50;    }}

九、重載

PHP中的重載指的是動態建立屬性與方法,是通過魔術方法來實現的。屬性的重載通過__set,__get,__isset,__unset來分別實現對不存在屬性的賦值、讀取、判斷屬性是否設定、銷毀屬性。

class Car {   private $ary = array();    public function __set($key, $val) {       $this->ary[$key] = $val;   }    public function __get($key) {       if (isset($this->ary[$key])) {            return $this->ary[$key];       }        return null;   }    public function __isset($key) {       if (isset($this->ary[$key])) {            return true;       }        return false;   }    public function __unset($key) {       unset($this->ary[$key]);   }}$car = new Car();$car->name = '汽車';  //name屬性動態建立並賦值echo $car->name;方法的重載通過__call來實現,當調用不存在的方法的時候,將會轉為參數調用__call方法,當調用不存在的靜態方法時會使用__callStatic重載。class Car {   public $speed = 0;    public function __call($name, $args) {       if ($name == 'speedUp') {            $this->speed += 10;       }   }}$car = new Car();$car->speedUp(); //調用不存在的方法會使用重載echo $car->speed;

十、對象的進階特性對象比較,當同一個類的兩個執行個體的所有屬性都相等時,可以使用比較子==進行判斷,當需要判斷兩個變數是否為同一個對象的引用時,可以使用全等運算子===進行判斷。

class Car {}$a = new Car();$b = new Car();if ($a == $b) echo '==';   //trueif ($a === $b) echo '==='; //false對象複製,在一些特殊情況下,可以通過關鍵字clone來複製一個對象,這時__clone方法會被調用,通過這個魔術方法來設定屬性的值。class Car {   public $name = 'car';    public function __clone() {       $obj = new Car();        $obj->name = $this->name;   }}$a = new Car();$a->name = 'new car';$b = clone $a;var_dump($b);對象序列化,可以通過serialize方法將對象序列化為字串,用於儲存或者傳遞資料,然後在需要的時候通過unserialize將字串還原序列化成對象進行使用class Car {   public $name = 'car';}$a = new Car();$str = serialize($a); //對象序列化成字串echo $str.'';$b = unserialize($str); //還原序列化為對象var_dump($b);

聯繫我們

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