基本概念
參考:7.1 類的概念
訪問控制
針對對象的屬性和方法,可以使用訪問控制來限制它的作用域
public
:公開的,在類中、實例中、子類中都能訪問
protected
:受保護的,在類中、子類中可以訪問
private
:私有的,僅能在類中訪問
static
:靜態的,在哪都能用
類的屬性在定義時必須指定訪問控制級別,像下面這樣:
// 類
class Foobar{
// 我將報錯
$abc = "123";
// 我不會報錯
public $test = 456;
}
類的方法如果不指定訪問控制級別,那么默認就是 public
公開的。
屬性常量
參考:7.2 類的屬性
對象繼承
參考:7.3 對象繼承
自動加載
參考:7.4 類的自動加載
構造和析構
參考:7.5 構造和析構
范圍解析操作符
參考:7.6 范圍解析操作符
靜態屬性
一個類的屬性和方法可以使用 static
標記為靜態的,如沒有顯示指定訪問控制級別,則默認為公開的。
靜態成員需要使用 ::
范圍解析操作符 來訪問。
靜態成員可以不用實例化對象而直接訪問,但靜態屬性不能使用實例化對象來訪問,而靜態方法可以。
抽象類
參考:7.7 抽象類
對象接口
參考:7.8 對象接口
Trait
參考:7.9 Trait
匿名類
參考:7.10 匿名類
重載
參考:7.11 重載
遍歷對象
參考:7.12 遍歷對象
魔術方法
參考:7.13 魔術方法
Final 關鍵字
final
關鍵字可以應用到類或方法上
final
應用在類上時,該類無法被繼承
final
應用在方法上時,該方法無法被重寫
對象復制
對象的賦值通常是引用的,通過 clone
關鍵字可獲取一個新的拷貝,使用 clone
后, 系統會先執行該對象的 __clone
方法,可以根據需要在該魔術方法中執行一些修改屬性的操作。
// 定義類
class Example{
// 我的屬性
private $foo = 123;
private $bar = 'abc';
// clone
public function __clone(){
$this->foo = 789;
}
}
// 實例化
$exam = new Example();
// object(Example)#1 (2) { ["foo":"Example":private]=> int(123) ["bar":"Example":private]=> string(3) "abc" }
var_dump($exam);
// 執行復制
$temp = clone $exam;
// object(Example)#2 (2) { ["foo":"Example":private]=> int(789) ["bar":"Example":private]=> string(3) "abc" }
var_dump($temp);
對象比較
兩個對象的屬性和值相同,且是同一個類的實例,那么在執行 ==
比較時,相等。
兩個對象的屬性和值相同,且是同一個類的同一個實例,那么在執行 ===
比較時,相等。
判斷一個對象是否為某一個類的實例,可以使用 instanceof
關鍵字。
類型約束
函數或類的方法可以對參數進行類型約束,調用時必須傳遞指定類型的數據,否則報錯。
// 定義類
class Example{
// 給方法的參數增加類型約束
public static function fn(string $str){
echo $str;
}
}
// 給函數的參數增加類型約束
function fun(int $num){
echo $num;
}
// 調用
Example::fn('hello world');
fun(123);
后期靜態綁定
static
不在會被解析成定義當前方法所在的類了,而是根據實際運行時來計算。
當一個類的方法中使用了 static
關鍵字,那么到時候調用這個方法時,static
的指向并非是當前類,有可能指向其他父類。
static
的指向是上一個 非轉發調用
時系統自動保存下來的類,轉發調用
指的是 self::
,parent::
,static::
等。
后期靜態綁定這個概念通常會出現在繼承關系中。
$this
代表的是當前實例
self
代表的是當前類、通常用于調用當前類的靜態屬性
parent
代表父類
對象的序列化
可以使用 serialize()
將對象進行序列化成字符串,然后將字符串保存,在另外一個腳本中使用 unserialize()
將保存的字符串讀取傳遞進去,重新得到該對象。
需要注意的是,在 unserialize()
之前,記得 include
將類的定義文件引入。