PHP的面向对象 — 封装、继承、多态
? ? ? K在上一次的基礎(chǔ)篇中給大家介紹了一下關(guān)于PHP中數(shù)組和字符串的使用方法等,這一次,K決定一次性大放送,給大家分享一下PHP中面向?qū)ο蟮娜筇匦?#xff1a;封裝、繼承、多態(tài)三個方面的知識。
一、封裝
在PHP中,封裝可以用三個子來概括:私有化。具體來說,是通過訪問修飾符,將類中不需要外部訪問的屬性和方法進行私有化處理,來實現(xiàn)訪問控制。
那么封裝的作用是什么?封裝的作用主要有兩點,一是方法封裝,即將使用者關(guān)注的功能暴露,而隱藏其他使用者用不到的功能;二是屬性封裝,即對用戶的數(shù)據(jù)進行控制,防止不合法的數(shù)據(jù)傳輸設(shè)置。
那么封裝操作是如何實現(xiàn)的?
對于方法的封裝,我們通過對方法前加private關(guān)鍵字來進行設(shè)置,即進行私有化處理。demo如下:
private function formatName(){} // 這個方法僅僅能在類內(nèi)部使用$this調(diào)用function showName(){$this -> formatName();}對于屬性的封裝,我們可以有兩種方法來進行實現(xiàn)。
一是通過自己提供的set/get方法來對私有化的屬性進行設(shè)置/讀取。demo如下:
private $age;function setAge($age){$this -> age = $age;}function getAge(){return $this -> age;}二是通過魔術(shù)方法來進行實現(xiàn)。demo如下:
private $age; function __get($key){return $this -> $key; } function __set($key,$value){$this -> $key = $value; } $對象 -> age; >>> 訪問對象私有屬性時,自動調(diào)用__get()魔術(shù)方法,并且將訪問的屬性名傳給__get()方法; $對象 -> age = "11"; >>> 設(shè)置對象的私有屬性時,自動調(diào)用__set()魔術(shù)方法,并且將設(shè)置的屬性名以及屬性值傳給__set()方法;此外,有關(guān)封裝的魔術(shù)方法主要有以下幾種:
① __set():給類私有屬性賦值時自動調(diào)用,調(diào)用時給對象傳遞兩個參數(shù),需要設(shè)置的屬性名、屬性值
② __get():讀取類私有屬性時自動調(diào)用,調(diào)用時給方法傳遞一個參數(shù),需要讀取的屬性名
? ③ __isset():外部使用isset()函數(shù)檢測私有屬性時,自動調(diào)用。
? >>>類外部使用isset()檢測私有屬性,默認是檢測不到的。即false
? >>>所以,我們可以使用__isset()函數(shù),在自動調(diào)用時,返回內(nèi)部檢測結(jié)果。
function __isset($key){
? return isset($this->$key);
? }
當(dāng)外部使用isset($對象名->私有屬性)檢測時,將自動調(diào)用上述__isset()返回的結(jié)果!
④ __unset():外部使用unset()函數(shù)刪除私有屬性時,自動調(diào)用。
function __unset($key){
unset($this->$key);
? }
當(dāng)外部使用unset($對象名->私有屬性)刪除屬性時,自動將屬性名傳給__unset(),并交由這個魔術(shù)方法處理。
二、繼承
在PHP中,繼承也可以用單詞extends來概括。extends在子類上使用,可以讓子類繼承父類中的非私有屬性和方法。demo如下:
class Student extends Person{}但是,在使用繼承時,需要注意以下幾點:
① 子類只能繼承父類的非私有屬性。
② 子類繼承父類后,相當(dāng)于將父類的屬性和方法copy到子類,可以直接使用$this調(diào)用。
③ PHP只能單繼承,不支持一個類繼承多個類,但是一個類可以進行多層繼承。
>>> class Person{}
class Chengnian extends Person{}
class Student extends Chengnian{}
Student類就同時具有了Chengnian類和Person類的屬性和方法
下面給大家介紹一下關(guān)于方法重寫(方法覆蓋)的一些知識。
方法覆蓋是指子類對繼承父類中重名方法的重寫或覆蓋,而它的實現(xiàn)需要滿足兩個條件,一是子類繼承父類;二是子類重寫父類已有方法。
那么如果我想要在調(diào)用父類中的方法,應(yīng)該怎么做?我們可以通過如下代碼實現(xiàn):
parent::方法名();同理,在子類繼承父類時,首先也要調(diào)用父類的構(gòu)造函數(shù)來賦值,實現(xiàn)代碼如下:
function __construct($name,$age,$school){parent::__construct($name,$age);$this -> school = $school; } // 其中name、age屬性繼承自父類,school屬于子類三、多態(tài)
在PHP中,多態(tài)是最常用到的一種特性。所謂多態(tài),是指同一個東西不同形態(tài)的展示。在PHP中,我們這樣定義多態(tài),一個類被多個子類繼承,如果這個類的某個方法在多個子類中表現(xiàn)不同的功能,那么這種行為我們就稱其為多態(tài)的實現(xiàn)。
多態(tài)的實現(xiàn)必須要滿足三個條件:一是子類繼承父類,二是子類重寫父類的方法,三是父類引用指向子類對象。
多態(tài)的實現(xiàn)K用一個小小的demo來給大家進行演示,demo如下:
abstract class Person{abstract function say();}class Chinese extends Person{ // 條件一:子類繼承父類function say(){ // 條件二:子類重寫父類方法echo "我說中文!<br>";}}class English extends Person{ //條件一:子類繼承父類function say(){ // 條件二:子類重寫父類方法echo "I speak English!<br>"; }}// Person $c = new Chinese(); // 父類引用指向子類對象,PHP中此形式行不通 // Person $e = new English();function func(Person $p){ //PHP中的類型約束只存在與函數(shù)的形參$p -> say();}func(new Chinese()); // 條件三:父類引用指向子類對象func(new English()); // 條件三:父類引用指向子類對象?
好了,以上就是K給大家?guī)淼年P(guān)于PHP面向?qū)ο笾蟹庋b、繼承、多態(tài)這三個特性的初步理解,如果對你有幫助的話,可不要忘了給K點個贊喲~
?
轉(zhuǎn)載于:https://www.cnblogs.com/wk1102/p/6986483.html
總結(jié)
以上是生活随笔為你收集整理的PHP的面向对象 — 封装、继承、多态的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Bootatrap中的表单(2)
- 下一篇: PHP基础入门(五)---PHP面向对象