具備相同屬性(特徵)和方法(行爲)的一系列個體的集合,類是一個抽象的概念。php
從類中,拿到的具備具體屬性值的個體,稱爲對象。對象是一個具體的個體。
eg:人類;張三數組
class 類名{ 訪問修飾符 $屬性[=默認值]; [訪問修飾符] function 方法(){} }
class SimpleClass { // property declaration public $var = 'a default value'; // method declaration public function displayVar() { echo $this->var; } }
class
修飾,類名後面必定不能有();$對象名 = new 類名(); //()能夠不帶
函數
$對象名 -> $屬性名; //使用->調用屬性時,屬性名不能帶$符號
this
$this -> $屬性名;
spa
構造函數是類中的一個特殊函數,當咱們使用new關鍵字實例化對象時,至關於調用了類的構造函數。code
實例化對象時,自動調用,用於給對象的屬性賦初值!orm
[public] function Person($name){ $this -> name = $name; }
__construct
[public] function __construct($name){ $this -> name = $name; }
new Person()
;new Person()
;Person
後面的()
中的參數列表,必須符合構造函數的要求!!!!__construct
。__destruct()
:PHP中,給咱們提供一系列用__
開頭的函數,這些函數無需本身手動調用,
會在合適的時機自動調用,這類函數稱爲魔術稱爲魔術函數。
eg:function __construct(){}
在類new一個對象時自動調用
function __destruct(){}
在對象被銷燬時自動調用,咱們要求,除了魔術方法以外,自定義的函數與方法不能使用__
開頭。最後,通常對於功能比較複雜的類,咱們會單獨的寫到一個類文件中。類文件的命名,同一小寫,使用"類名小寫.class.php"
的方式命名。在其餘文件中使用這個類時,可使用include導入這個".class.php"
文件。對象
經過訪問修飾符,將類中不須要外部訪問的屬性和方法進行私有化處理,以實現訪問控制。繼承
注意:是實現訪問控制,而不是拒絕訪問。也就是說,咱們私有化屬性後,須要提供對應的方法,讓用戶經過咱們提供的方法處理屬性。接口
set/get
方法)對於一些只在類內部使用的方法,而不像對外部提供使用,那麼,這樣的方法咱們可使用private進行私有化處理。
private function formatName(){} //這個方法僅僅能在類內部使用$this調用 function showName(){ $this->formatName(); }
set/get
方法爲了控制屬性的設置以及讀取,能夠將屬性進行私有化處理,並要求用戶經過咱們提供的set/get
方法進行設置
private $age; //set方法 function setAge($age){ $this->age=$age; } //get方法 function getAge(){ return $this->age; } $對象->getAge(); $對象->setAge(12);
__get( -> __set(, ->= } $對象->age; //訪問對象私有屬性時,自動調用__get()魔術方法,而且將訪問的屬性名傳給__get()方法; $對象->age=12; //設置對象私有屬性時,自動調用__set()魔術方法,而且將設置的屬性名以及屬性值傳給__set()方法;
注意:在魔術方法中,可使用分支結構,判斷$key的不一樣,進行不一樣操做。
__set($key,$value)
:給類私有屬性賦值時自動調用,調用時給方法傳遞兩個參數:須要設置的屬性名,屬性值。__get($key,$value)
:讀取類私有屬性時自動調用,調用時給方法傳遞一個參數,須要讀取的屬性名;__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(),並交由這個魔術方法處理。
給子類使用extends
關鍵字,讓子類繼承父類;
class Student extends Person{}
class Person{} class Adult extends Person{} class Student extends Adult{} //Student 類就同時具備了Adult類和Person類的屬性和方法
子類重寫父類已有方法
符合上述兩個條件,稱爲方法覆蓋。覆蓋以後,子類調用方法,將調用子類本身的方法。
一樣,除了方法覆蓋,子類也能夠具備與父類同名的屬性,進行屬性覆蓋。
若是,子類重寫了父類方法,如何在子類中調用父類同名方法?
partent::方法名();
因此,當子類繼承父類時,需在子類的構造中的第一步,首先調用父類構造進行復制。
function __construct($name,$sex,$school){ partent::__construct($name,$sex); $this -> school = $school; }
final
修飾類,此類爲最終類,不能被繼承!final
修飾方法,此方法爲最終方法,不能被重寫!final
不能修飾屬性。靜態屬性,靜態方法,只能使用類名直接調用。
使用"類名::\(靜態屬性" , "類名::靜態方法()" `Person::\)sex; Person::say();`
靜態方法中,不能調用非靜態屬性或方法;
非靜態方法,能夠調用靜態屬性和方法。 (由於靜態屬性和方法在類裝載時已經產生,而非靜態的屬性方法,此時尚未實例化誕生)
self
關鍵字,代指本類名。class Person{ static $sex = "nan"; function say(){ echo self::$sex; } }
在類中聲明常量,不能是define()
函數!必須使用const
關鍵字。與define()
聲明類似,const
關鍵字聲明常量不能帶$
,必須所有大寫!
常量一旦聲明,不能改變。調用時與static
同樣,使用類名調用Person::常量
。
檢測一個對象,是不是某一個類的實例。(包括爹輩,爺爺輩,太爺爺輩……)
$zhangsan instanceof Person;
【小總結】幾種特殊操做符:
.
只能鏈接字符串; "".""
=>
聲明數組時,關聯鍵與值["key"=>"value"]
->
對象($this new
出的對象)調用成員屬性,成員方法;::
使用parent
關鍵字,調用父類中的同名方法:parent::say();
,使用類名(和self
)調用類中的靜態屬性,靜態方法,以及常量。__construct()
:構造函數,new一個對象時,自動調用。__destruct()
:析構函數,當一個對象被銷燬前,自動調用。__get()
:訪問類中私有屬性時,自動調用。傳遞讀取的屬性名,返回$this->屬性名
__set()
:給類的私有屬性賦值時,自動調用。傳遞須要設置的屬性名和屬性值;__isset()
:使用isset()
檢測對象私有屬性時,自動調用。傳遞檢測的屬性名,返回isset($this -> 屬性名);
__unset()
:使用unset()
刪除對象私有屬性時,自動調用。傳遞刪除的屬性名,方法中執行unset($this -> 屬性名);
__toString(
):使用echo
打印對象時,自動調用。返回想要在打印對象時,顯示的內容;返回必須是字符串;__call()
:調用一個類中未定義或未公開的方法時,自動調用。傳遞被調用的函數名,和參數列表數組;__clone()
:當使用clone
關鍵字,克隆一個對象時,自動調用。做用是爲新克隆的對象進行初始化賦值;__sleep()
:對象序列化時,自動調用。返回一個數組,數組中的值就是能夠序列化的屬性;__wakeup()
:對象反序列化時,自動調用。爲反序列化新產生的對象,進行初始化賦值;__autoload()
:須要在類外部聲明函數。當實例化一個未聲明的類時,自動調用。傳遞實例化的類名,可使用類名自動加載對應的類文件。{}
的方法,必須使用abstract
關鍵字修飾。這樣的方法,咱們稱爲抽象方法。abstract function say(); //抽象方法
使用abstract
關鍵字修飾的類就是抽象類。
abstract class Person{}
接口是一種規範,提供了一組實現接口的類所必須實現的方法組合。
接口使用interface
關鍵字聲明;
interface Inter{}
abstract
修飾。接口使用extends繼承接口,能夠實現多繼承。
interface int1 extends Inter,Inter2{}
implements
關鍵字!類使用implements
實現接口,可同時實現多個接口,多個接口間逗號分隔;
abstract class Person implements Inter,Inter2{}
一個類實現一個或多個接口,那麼這個類,必須實現全部接口中的全部抽象方法!
除非,這個類是抽象類。
interface
關鍵字,抽象類使用abstract class
。extends
繼承抽象類,使用implements
實現接口。extends
接口)、多實現(類implements
接口)abstract
關鍵字修飾,接口中抽象方法不能帶修飾詞。若是,這個類的某個方法,在多個子類中,表現出不一樣的功能,咱們稱這種行爲爲多態。