PHP簡明教程-面向物件基礎 2
阿新 • • 發佈:2019-01-28
PHP簡明教程
面向物件基礎 2
其他的幾個魔術方法
方法名 | 觸發時機 | 引數1 | 引數2 | 備註 |
---|---|---|---|---|
__callStatic | 當呼叫不存在的靜態方法的時候自動執行這個方法 | 函式名 | 引數(陣列) | 該方法必須是static |
__sleep | 當序列化一個物件的時候呼叫這個方法 | 無 | 無 | 有返回值,返回要序列化的屬性,組成一個數組 |
__wakeup | 當反序列一個物件的時候呼叫 | 無 | 無 | 可以做一些初始化的工作 |
__clone | 當clone一個物件的時候會自動呼叫 | 無 | 無 | 可以修改一些屬性 |
一些其他函式的應用
serialize
:序列化
將程式中的一個物件進行序列化,然後儲存起來
unserialize
:反序列化
將序列化的字串還原,恢復原來的物件
call_user_func
call_user_func([$xiang, 'eat'], 1000); == $xiang->eat(1000);
call_user_func_array
call_user_func_array([$xiang, 'eat'], [1000, 2000, 3000]); == $xiang->eat(1000,2000,3000);
var_export
輸出或返回一個變數的字串表示
$str = var_export($arr, true);
將一個數組變成生成陣列的字串儲存起來
抽象類
抽象類關鍵字 abstract
- 抽象類不能例項化物件
- 抽象類的目的就是讓子類繼承並實現其規定的抽象方法
- 子類中必須實現抽象類中規定的抽象方法
- 如果抽象方法中有引數並且引數有預設值,子類實現的時候也要有引數和預設值
- 抽象方法必須是
public
或者protected
(要讓子類繼承) - 抽象類可以繼承抽象類 但是子類必須實現繼承的抽象方法
介面
介面關鍵字 interface
- 介面中的方法都是抽象方法,並且是public
- 實現介面用
implements
interface A {
}
class B implements A {
//B類實現A類
}
- 可以同時實現多個介面,中間使用逗號隔開
interface AA {
}
class M implements A,AA {
//M類同時實現A類和AA類
}
- 繼承父類在實現介面之前
class C {
}
class D extends C implements A {
//D類繼承C類並實現A類
}
- 介面同樣可以繼承介面,但是子類必須實現所有方法
interface E extends A {
//介面E繼承介面A,E中必須實現A中所定義的方法
}
- 介面中不能新增成員變數
多型
重寫是一種多型,相同的介面給不同的物件,得到的響應不同,也是多型
trait
(特性)
- php沒有多繼承 使用trait可以模擬實現多繼承
trait
和class
的寫法一樣,只是把class變成了trait
trait A{
}
- trait中可以新增成員變數,一般只新增成員方法
- trait中的方法如果想要子類使用,必須是
public
- trait不能被例項化
- trait可以巢狀trait
trait B{
use A;
}
- 解決多個trait中方法名衝突問題:(瞭解)
use Dun, Sword{
Dun::blood insteadof Sword;
Dun::blood as blood1;
Sword::blood as blood2;
}
型別約束
類C語言(嚴格型別)
function buy(Girl $girl)
名稱空間 namespace
名稱空間要結合自動載入實現MVC框架
- 名稱空間可以解決同一檔案中不能有相同的類名問題
- 名稱空間一般都小寫
- 第一個名稱空間的前面不能有任何的程式碼
- 名稱空間的範圍是一直向下,直到下一個名稱空間的開始
- :根空間,沒有寫名稱空間的都在根空間下
use hello\Person; //使用名稱空間下的類
use baby\Person as SeLang; //給名稱空間下的類起別名
use namespace1\namespace2\Person //namespace2是namespace1的子空間
遍歷物件
物件可以被當成陣列來遍歷,遍歷的時候,鍵就是屬性名,值就是屬性值
類外:
只能遍歷public屬性
類內:
所有屬性都能遍歷出來
$a = new A();
foreach($a as $key => $v)
匿名類
$obj = new class {
public $name;
public $height;
function say()
{
echo '100';
}
};