PHP物件導向詳解:繼承、封裝與多態

來源:互聯網
上載者:User

標籤:變數   操作   間接   重要   多態   調用   私人化   copy   new   

首先,在解釋物件導向之前先解釋下什麼是物件導向?

[物件導向]
1、什麼是類?
 具有相同屬性(特徵)和方法(行為)的一系列個體的集合,類是一個抽象的概念
2、什麼是對象?
從類中拿到的具有具體屬性值得個體,稱為對象,對象是一個具體的個體

所以,物件導向即我們專註對象來處理問題,通過從一個個具有屬性和功能的類中拿到對象來處理問題。

下面我們再來細說下物件導向的三大特徵:繼承/封裝/多態

一、繼承

在PHP中我們主要通關Extends關鍵字來實現繼承   ->class Student extends Person{}

下面是幾個比較重要的注意事項:

①子類只能繼承父類的非私人屬性。
②子類繼承父類後,相當於將父類的屬性和方法copy到子類,可以直接使用$this調用該屬性;
③PHP只能單繼承,不支援一個類繼承多個類。但是一個類可以進行多層繼承(即A繼承於B,而C又繼承於A,C通過A間接繼承了B)

二、封裝

類實現封裝是為了不讓外面的類隨意的修改一個類的成員變數,所以在定義一個類的成員的時候,我們使用private關鍵字設定這個成員的存取權限

只能被這個類的其他成員方法調用,而不能被其他類中的方法調用,即通過本類中提供的方法來訪問本類中的私人屬性。

①所以在該類中我們會提供一個訪問私人屬性的方法

②然後我們一般會定義兩個方法來實現對一個變數的操作,即:get()與set()方法。

程式碼範例如下:

class Person{        private $name;        private $age;                public function __construct($name,$age){            $this->name = $name;            $this->age = $age;        }        function setAge($age){            if($age>=0&&$age<=120){                $this->age = $age;            }else{                error_log("年齡設定有誤!");            }        }                function getAge(){            return $this->age;        }        public function say(){            echo "我叫{$this->name},我今年{$this->age}歲了";        }                function __get($name){            switch ($name) {                case ‘name‘:                    return $this ->$name."這是讀取時加的文字";                                    case ‘age‘:                    return "0".$this ->$name;                default:                    return $this ->$name;                                }                    }        function __set($key,$value){                        if($key=="name"){                $this->$key = $value."這是設定時加的文字<br>";            }else{                $this->$key = $value;            }        }        function __isset($name){            return isset($this->$name);        }                function __unset($name){            if($name=="age"){                return;            }             unset($this->$name);        }    } $zhangsan = new Person("zhangsan",14);$zhangsan->setAge(12);echo $zhangsan->getAge()."<br>";var_dump(isset($zhangsan->name));unset($zhangsan->age);echo $zhangsan->age;

三、多態

什麼是多態?

一個類,被多個子類繼承,如果這個類的某個方法,在多個子類中,表現出不同的功能,我們稱這種行為為多態。(同一個類的不同子類表現出不同的形態)

那麼我們如何來實現多態呢?

子類繼承父類 ->子類重寫父類方法 ->父類引用指向子類對象

abstract class Person{        註:父類使用abstract關鍵字修飾
abstract function say();
}

class Chinese extends Person{    註:子類重寫父類方法
function say(){
echo "我是中國人<br>";
}
}
class English extends Person{    註:子類重寫父類方法
function say(){
echo "我是英國人";
}
}

$zhangsan = new Chinese();
$zhangsan->say();
$z = new English();
$z->say();
Person $p = new Chinese();   註:父類引用指向子類對象

上述代碼中,兩個子類都是繼承自同一父類,但因為都重寫了父類的方法,表現出了不同的形態

 

 

* 四、單例設計模式


單例模式也叫單態模式
可以保證一個類只能有一個對象執行個體
實現要點:
①建構函式私人化,不允許使用new關鍵字建立對象。
②對外提供擷取對象的方法,在方法中判斷對象是否為空白,如果為空白則建立對象並返回,如果不為空白則直接返回
③執行個體對象的屬性以及擷取對象的方法必須都是靜態。
④之後,建立對象只能使用我們提供的靜態方法。

範例程式碼如下:

class Singleton{static public $Single = null;private function __construct(){}static function getSingle(){if(!self::$Single){self::$Single = new Singleton();//self代指類名 new Singleton()和newself()是完全一樣的}return self::$Single;}function __destruct(){echo "我被銷毀了<br>";}} $s1 = Singleton::getSingle();$s1 = Singleton::getSingle();$s1 = Singleton::getSingle();

 

PHP物件導向詳解:繼承、封裝與多態

聯繫我們

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