首頁  >  文章  >  後端開發  >  PHP的初步理解--封裝、繼承、多型特性

PHP的初步理解--封裝、繼承、多型特性

零下一度
零下一度原創
2017-06-23 14:42:111595瀏覽

      K在上一次的基礎篇中給大家介紹了一下關於PHP中數組和字符串的使用方法等,這次,K決定一次性大放異彩,給大家分享一下PHP中面向對象的三大特性:封裝、繼承、多型三方面的知識。

一、封裝

#  在PHP中,封裝可以用三個子來概括:

私有化

。具體來說,是透過存取修飾符,將類別中不需要外部存取的屬性和方法進行私有化處理,來實現存取控制。

  那麼封裝的
作用

是什麼?封裝的作用主要有兩點,一是方法封裝

,即將使用者關注的功能暴露,而隱藏其他使用者用不到的功能;二是

屬性封裝,即對使用者的資料進行控制,防止不合法的資料傳輸設定。

  那麼封裝操作是如何實現的?

  對於方法的封裝,我們透過對方法前加private關鍵字來進行設置,即進行私有化處理。 demo如下:

private function formatName(){} // 这个方法仅仅能在类内部使用$this调用 function showName(){             $this -> formatName();
         }

  對於屬性的封裝,我們可以有兩種方法來實現。

  一是透過自己提供的set/get方法來設定私有化的屬性/讀取
。 demo如下:

private $age;         function setAge($age){             $this -> age = $age;
         }         function getAge(){             return $this -> age;
         }
  
二是透過魔術方法實現。 demo如下:
private $age;function __get($key){return $this -> $key;
}function __set($key,$value){$this -> $key = $value;
}$对象 -> age;  >>> 访问对象私有属性时,自动调用__get()魔术方法,并且将访问的属性名传给__get()方法;$对象 -> age = "11";  >>> 设置对象的私有属性时,自动调用__set()魔术方法,并且将设置的属性名以及属性值传给__set()方法;

  此外,有關封裝的魔術方法主要有以下幾種:

   ① __set( ):給類別私有屬性賦值時自動調用,調用時給物件傳遞兩個參數,需要設定的屬性名稱、屬性值
   ② __get():讀取類別私有屬性時自動調用,呼叫時給方法傳遞一個參數,需要讀取的屬性名稱
   ③ __isset():外部使用isset()函數偵測私有屬性時,自動呼叫。
   >>>類別外部使用isset()偵測私有屬性,預設是偵測不到的。即false
   >>>所以,我們可以使用__isset()函數,在自動呼叫時,傳回內部偵測結果。
   function __isset($key){
#     return isset($this->$key);    }

 } }##   當外部使用isset($物件名稱->私有屬性)偵測時,將自動呼叫上述__isset()傳回的結果!    ④ __unset():外部使用unset()函數刪除私有屬性時,自動呼叫。

   function __unset($key){#    unset($this->$key);

   }
##################################################################################################################################################################################################################' #####   當外部使用unset($物件名稱->私有屬性)刪除屬性時,自動將屬性名稱傳給__unset(),並交由這個魔術方法處理。 ##################二、繼承###################  在PHP中,繼承也可以用單字## ####extends######來概括。 extends在子類別上使用,可以讓子類別繼承父類別中的非私有屬性和方法。 demo如下:#########
class Student extends Person{}
###

  但是,在使用继承时,需要注意以下几点:

  ① 子类只能继承父类的非私有属性。
  ② 子类继承父类后,相当于将父类的属性和方法copy到子类,可以直接使用$this调用。
  ③ PHP只能单继承,不支持一个类继承多个类,但是一个类可以进行多层继承。
   >>> class Person{}
   class Chengnian extends Person{}
   class Student extends Chengnian{}
  Student类就同时具有了Chengnian类和Person类的属性和方法

  下面给大家介绍一下关于方法重写(方法覆盖)的一些知识。

  方法覆盖是指子类对继承父类中重名方法的重写或覆盖,而它的实现需要满足两个条件,一是子类继承父类;二是子类重写父类已有方法。

  那么如果我想要在调用父类中的方法,应该怎么做?我们可以通过如下代码实现:

parent::方法名();

  同理,在子类继承父类时,首先也要调用父类的构造函数来赋值,实现代码如下:

function __construct($name,$age,$school){
    parent::__construct($name,$age);$this -> school = $school;
}// 其中name、age属性继承自父类,school属于子类

三、多态

  在PHP中,多态是最常用到的一种特性。所谓多态,是指同一个东西不同形态的展示。在PHP中,我们这样定义多态,一个类被多个子类继承,如果这个类的某个方法在多个子类中表现不同的功能,那么这种行为我们就称其为多态的实现。

  多态的实现必须要满足三个条件:一是子类继承父类,二是子类重写父类的方法,三是父类引用指向子类对象

  多态的实现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中的类型约束只存在与函数的形参$p -> say();
    }
    func(new Chinese()); // 条件三:父类引用指向子类对象func(new English()); // 条件三:父类引用指向子类对象

 

好了,以上就是K给大家带来的关于PHP面向对象中封装、继承、多态这三个特性的初步理解,如果对你有帮助的话,可不要忘了给K点个赞哟~

 

以上是PHP的初步理解--封裝、繼承、多型特性的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn