1. 程式人生 > >PHP簡明教程-面向物件基礎 2

PHP簡明教程-面向物件基礎 2

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

  1. 抽象類不能例項化物件
  2. 抽象類的目的就是讓子類繼承並實現其規定的抽象方法
  3. 子類中必須實現抽象類中規定的抽象方法
  4. 如果抽象方法中有引數並且引數有預設值,子類實現的時候也要有引數和預設值
  5. 抽象方法必須是public或者protected(要讓子類繼承)
  6. 抽象類可以繼承抽象類 但是子類必須實現繼承的抽象方法

介面

介面關鍵字 interface

  1. 介面中的方法都是抽象方法,並且是public
  2. 實現介面用implements
interface A {

}
class B implements A {
    //B類實現A類
}
  1. 可以同時實現多個介面,中間使用逗號隔開
interface AA {

}
class M implements A,AA {
    //M類同時實現A類和AA類
}
  1. 繼承父類在實現介面之前
class C {

}
class D extends C implements A {
    //D類繼承C類並實現A類
}
  1. 介面同樣可以繼承介面,但是子類必須實現所有方法
interface E extends A {
    //介面E繼承介面A,E中必須實現A中所定義的方法
}
  1. 介面中不能新增成員變數

多型

重寫是一種多型,相同的介面給不同的物件,得到的響應不同,也是多型

trait(特性)

  • php沒有多繼承 使用trait可以模擬實現多繼承
  • traitclass的寫法一樣,只是把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  //namespace2namespace1的子空間

遍歷物件

物件可以被當成陣列來遍歷,遍歷的時候,鍵就是屬性名,值就是屬性值
類外:
只能遍歷public屬性
類內:
所有屬性都能遍歷出來

$a = new A();
foreach($a as $key => $v)

匿名類

$obj = new class {
    public $name;
    public $height;
    function say()
    {
        echo '100';
    }
};