OOP 基礎知識彙總(一) |
>>>你須要瞭解如下概念
面向對象&面向過程概念:
面向過程:專一於解決一個問題的過程。面向過程的最大特色,是由一個一個的函數去解決處理這個問題的一系列過程。
面向對象:專一於由哪一個對象來處理一個問題。面向對象的最大特色,是有一個個具備屬性和功能的類,從類中拿到對象,進而處理問題。php
【面向對象】函數
一、什麼是類?
具備相同屬性(特徵)和方法(行爲)的一系列個體的集合,類是一個抽象的概念
二、什麼是對象?
從類中,拿到的具備具體屬性值的個體,稱爲對象。對象是一個具體的個體。
例如:人類,都有姓名、性別、年齡,可是這些屬性都不能有具體的值。
張三,是人類中的一個對象!姓名張3、性別男、年齡23,將類的每個屬性具體賦值後,就成了張三這個對象。
三、類和對象的關係?
類是對象的抽象化!對象是類的具體化!
類僅僅代表這類對象有哪些屬性,可是不能有具體的值,因此類是抽象的。
而對象,是將類的全部屬性賦值後,產生的具體的個體,全部對象是具體的。
類的聲明與實例化: this
一、如何聲明一個類:spa
class 類名{orm
訪問修飾符 $屬性[=默認值];
[訪問修飾符] function 方法(){}
}
二、聲明一個類的注意事項:
① 類名只能有字母數字下劃線組成、開頭不能是數字,必須符合大駝峯法則;
② 類名必須使用class修飾,類名後面必定不能有();
③ 屬性必需要帶訪問修飾符,方法能夠不帶訪問修飾符;
三、實例化對象及對象屬性方法的調用?
$對象名 = new 類名(); //()能夠不帶
類外部調用屬性和方法:
$對象名 -> 屬性名; // 使用->調用屬性時,屬性名不能帶$
類內部調用屬性和方法:
$this -> 屬性名;對象
構造函數:
一、什麼是構造函數?
構造函數是類中的一個特殊函數,當咱們使用new關鍵字實例化對象時,至關於調用了類的構造函數;
二、構造函數有什麼做用?
實例化對象時,自動調用,用於給對象的屬性賦初值!
三、構造函數的寫法?
① 構造函數名,必須與類同名
[public] function Person($name){
$this -> name = $name;
}
② 使用魔術方法__construct
[public] function __construct($name=""){
$this -> name = $name;
}資源
四、構造函數注意事項:get
① 第一種寫法,構造函數名必須與類同名!!!!!!
② 若是一個類沒有手寫構造函數,則系統默認會有一個空參構造,所以可使用new Person();
若是咱們寫了帶參數的構造函數,則將不會再有空參構造,也就是不能直接使用new Person(); Person後面的()中的參數列表,必須符合構造函數的要求!!!
③ 若是兩種構造函數同時存在,將使用__construct。
五、析構函數:__destruct():
① 析構函數在對象被銷燬釋放以前自動調用!
② 析構函數不能帶有任何的參數
③ 析構函數經常使用於對象使用完之後,釋放資源、關閉資源等!
六、魔術方法:
PHP中,給咱們提供一系列用__開頭的函數,這些函數無需本身手動調用,會在合適的時機自動調用,這類函數稱爲魔術函數。
例如:function __construct(){} 在類new一個對象時自動調用
function __destruct(){} 在對象被銷燬時自動調用
咱們要求,除了魔術方法以外,自定義的函數與方法不能使用__開頭。
最後,通常對於功能比較複雜的類,咱們會單獨的寫到一個類文件中。
類文件的命名,統一小寫,使用「類名小寫.class.php」的方式命名。
在其餘文件中使用這個類時,能夠用include導入這個.class.php文件io
封裝的基本概念
一、什麼是封裝?
經過訪問修飾符,將類中不須要外部訪問的屬性和方法進行私有化處理,以實現訪問控制。
注意:是實現訪問控制,而不是拒絕訪問。 也就是說,咱們私有化屬性以後,須要提供對應的方法,讓用戶經過咱們提供的方法處理屬性。
二、封裝的做用?
① 使用者只關心類可以提供的功能,而沒必要關心功能實現的細節!(封裝方法)
② 對用戶的數據進行控制,防止設置不合法數據,控制返回給用戶的數據(屬性封裝+set/get方法)
三、實現封裝操做?
① 方法的封裝
對於一些只在類內部使用的方法,而不像對外部提供使用。那麼,這樣的方法咱們可使用private進行私有化處理。
private function formatName(){} //這個方法僅僅能在類內部使用$this調用
function showName(){
$this -> formatName();
}
② 屬性的封裝+set/get方法 爲了控制屬性的設置以及讀取,能夠將屬性進行私有化處理,並要求用戶經過咱們提供的set/get方法進行設置table
private $age;
function setAge($age){
$this->age = $age;
}
function getAge(){
return $this->age;
}
$對象 -> getAge();
$對象 -> setAge(12);
③ 屬性的封裝+魔術方法
private $age;
function __get($key){
return $this->$key;
}
function __set($key,$value){
$this->$key=$value;
}
$對象->age; // 訪問對象私有屬性時,自動調用__get()魔術方法,而且將訪問的屬性名傳給__get()方法;
$對象->age=12; // 設置對象私有屬性時,自動調用__set()魔術方法,而且將設置的屬性名以及屬性值傳給__set()方法;
注意:在魔術方法中,可使用分支結構,判斷$key的不一樣,進行不一樣操做。
四、關於封裝的魔術方法:
① __set($key,$value):給類私有屬性賦值時自動調用,調用時給方法傳遞兩個參數:須要設置的屬性名、屬性值;
② __get($key):讀取類私有屬性時自動調用,調用時給方法傳遞一個參數:須要讀取的屬性名;
③ __isset($key):外部使用isset()函數檢測私有屬性時,自動調用。
>>> 類外部使用isset();檢測私有屬性,默認是檢測不到的。false
>>> 因此,咱們可使用__isset();函數,在自動調用時,返回內部檢測結果。
function __isset($key){
return isset($this->$key);
}
當外部使用isset($對象名->私有屬性);檢測時,將自動調用上述__isset()返回的結果!
④ __unset($key):外部使用unset()函數刪除私有屬性時,自動調用;
function __unset($key){
unset($this->$key);
}
當外部使用unset($對象名->私有屬性);刪除屬性時,自動將屬性名傳給__unset(),並交由這個魔術方法處理。
未完待續 》》》》》》