PHP 面向對象基礎
本文主要闡述面向對象的基本概念,如有問題,還請斧正。
首先說明,涉及的一些知識點,算是提綱吧 。
1 類的基本概念;2 對象的基本概念;3 訪問控制;4 構造函數,析構函數;5魔術方法;6 接口;7 多態;8 封裝;9繼承;10 static與final
一,類的基本概念
1 什麽是類? 類即擁有相同屬性和行為的一個集合體。舉個例子 ,我們日常生活中的車 是一個類,車擁有相同的屬性(顏色,大小,重量)和行為(行駛);又如動物也是一個類,動物擁有相同的屬性(大小)和行為(吃,喝);我們將這些擁有相同的屬性和行為的一些事物叫做一個類。
2 在程序中如何申明一個類,用關鍵字 class 例
class Person{ // 屬性; // 行為; }
在這裏我們申明了一個人類
二 ,對象的基本概念
1 什麽是對象? 對象即是一個具體的事物,也或者是一個抽象的事物,對象時從類實例化而來。例: 上面我們說車是一個類,那麽寶馬,奔馳等就是對象,總結一句,對象就是將類具體化了。
2 對象的兩個部分
(1)對象的組成元素,是對象的數據模型,用於描述對象的數據,又別稱為屬性;
(2)對象的行為,對象的行為模型,用於描述對象具體能做什麽事情,又被稱為方法;
3 對象的兩個特征
(1)高內聚, 即在對象的內部屬性和方法對內是可見,在對象的內部屬性和方法都是可以被修改和訪問的;
(2)低耦合 , 在對象的外部,我們只能看見一部分的方法和屬性;涉及到訪問控制,後文在述。
4 如何實例化一個對象,用關鍵字 new 上面我們申明了一個人類,現在我們將這個人類 實例化。
實例化一個張三的對象
$zhangsan = new Person();
三 , 訪問控制 :主要用修飾符public protected private 來控制訪問的權限; 例
class Person{public $name; //公有的,可以被任何訪問 protected $sex; // 受保護的,可以被自身和子類訪問 private $age; // 私有的,只能被自己訪問 }
四, 構造函數,和析構函數
1 構造函數 ,構造函數為類中的一個方法,當我們實例化這個類的時候 自動調用,構造函數的目的是為了完成一些初始化的工作。用__construct 例
class Person{ public $name; //公有的,可以被任何訪問 protected $sex; // 受保護的,可以被自身和子類訪問 private $age; // 私有的,只能被自己訪問 //當我們new這個類時 自動調用 public function __construct(){ echo "你好"; } }
2 析構函數 ,當對象被銷毀的時候自動調用,我們常用析構函數來銷毀變量,以達到釋放內存的 目的。 用 __desturct 寫法同上。
五, 魔術方法,原理和構造函數差不多,在特定的情況下自動調用。
- __tostring 當對象被作為字符串使用時,自動調用,返回字符串;
- __invote 當對象被作為方法使用時,自動調用;
- __call 當對象訪問不存在的方法或者未公開的方法是,自動調用,返回被調用的函數名,和參數數組;
- __callStatic 當對象訪問不存在的靜態方法,或者未公開的時候自動調用,返回調用函數名,和參數數組;
- __get 對象訪問不可訪問的屬性時候,自動調用,返回不可訪問的屬性名;
- __set 給不可訪問的屬性賦值時,自動調用,返回屬性名,和賦值參數;
- __isset 用isset()/empty()檢測不可訪問的屬性時,自動調用,返回檢測的屬性名;
- __unset 用unset()刪除不可訪問的屬性時,自動調用,返回刪除屬性名;
- __clone 使用clone關鍵字克隆對象時,自動調用,作用是為新的克隆對象賦初始值;
- __sleep 對象序列化時,自動調用,返回一個數組,數組中的值就是可以序列化的屬性;
- __wakeup 對象反序列化時,自動調用,為反序列化新產生的對象,賦初始值;
- __autoload 需要在內外部聲明函數。當實例一個未申明的類時,自動調用,傳遞實例化的類名,可以使用類名自動加載對應的類文件;
六,接口
1 什麽是接口? 接口提供了一組實現接口的類 必須實現的方法組合 ,接口裏面的方法沒有方法體(具體的執行代碼)接口裏面的方法都是抽象方法。
2 如何聲明一個接口 例:
interface Inter { public function eat(); //沒有具體的方法體 public function run(); }
3 當一個類去實現一個接口的時候 必須實現接口裏面的方法,除非這個類時抽象類 例
// 申明一個接口 interface Inter { public funtion eat(); public funtion run(); } //一個類去實現接口 class Person implements Inter{ //這個類必須去實現接口中的方法 public function eat(){ //具體的方法 } public function run (){ //具體的方法 } }
4 接口可以被繼承,用關鍵字extends 寫法 interface inter1 extends Inter { } inter1接口繼承了Inter接口,接口的繼承可以是一對多,即一個接口可以繼承多個父接口。註意:當一個類去實現了一個子接口的時候,它也必須實現父接口裏面的抽象方法。
七 ,多態
1 多態是一種現象,當一個類被多個子類所繼承,如果這個類中的方法在子類中表現出了不同的功能,我們稱這種現象為多態;
八 ,封裝
1 封裝 通過訪問修飾符 將類中不需要外部訪問的屬性和方法進行私有化處理,實現訪問控制,讓使用者只能通過我們提供的方法對屬性和方法進行訪問。
2 封裝的好處,可以重復調用避免了代碼的冗余。
九 ,繼承 類可以被繼承,子類擁有父類的屬性和方法,子類可以修改父類的成員,我們稱之為重寫,當子類 重寫父類的方法後,按照子類的方法運行 通過關鍵字extends 實現繼承
例子
//聲明一個類 class Person{ $name; public function say(){ echo $this->name."今天天氣不錯哦"//$this php中的偽變量,代表自身對象我們在類內部訪問屬性時一般用$this } } //繼承一個類 class Man extends Person{ //將父類的say方法重寫 public function say(){ echo "晚飯吃什麽?" }
}
十, 關鍵字 final 和static
1 final php5中引入關鍵字final 當用final 修飾類的時候這個類可以理解為最終類,這個類不能被繼承;當用final修飾方法時,這個方法可以就理解為最終方法,不能夠被重寫。
2 static 靜態成員 //用static 修飾的屬性和方法被稱為靜態屬性和靜態方法
(1)靜態屬性保存了公有的數據;
(2)靜態方法只能訪問靜態屬性;
(3)靜態成員不要要實例化就可以訪問,
(4)靜態方法不能夠去調用非靜態成員,然而非靜態方法則可以調用靜態成員,因為靜態成員在加載的時候已經產生,而非靜態成員此時沒有實例化誕生。
(5)如何訪問? 在類內部訪問 用 self 或者static訪問 格式 : self/static::$屬性名 ; parent::$屬性名訪問父類屬性 在類外部調用 : 類名::$屬性。
結束語 :以上是關於面向對象編程的一些基本概念,以後閑的時候在弄些其他東西,話說這是在下的第一篇博客,
2018-09-02 21:39:26
PHP 面向對象基礎