1. 程式人生 > >php 中的過載技術——解決呼叫物件(或類)的未定義的屬性或方法出錯問題

php 中的過載技術——解決呼叫物件(或類)的未定義的屬性或方法出錯問題

過載的基本概念:

過載在通常的“面向物件的語言”中的含義:是指在一個類(或物件)中,有多個名字相同但是形參不同的方法的現象;

如:class A{

function f1(){}

function f2($p1){}

function f3($p1,$p2){}

}


但是,過載在“PHP語言”中的含義有些不同:

“PHP語言”中的過載:是指當一個物件(或類)使用其未定義的屬性或方法的時候,其中的一些處理機制;

如:class B{

public $p1 = 1 ;

}

$b1 = new B();

echo $b1 -> p2 ;//將會出錯,報出未定義屬性p2;

$b1 -> f1();//程式出錯,停止執行,報出未定義的方法f1;

所以,PHP中的過載技術,就是來應對上述“出錯”而阻止程式繼續執行的情況,使程式碼不出錯,而且還能優雅的處理。


PHP中的過載分為:屬性過載和方法過載;

屬性過載:就是對一個物件的不存在的屬性進行使用的時候,這個類中預先設定好的應對辦法(或處理機制);

方法過載:當對一個物件的不存在的例項方法進行“呼叫”的時候,會自動呼叫類中的__call()這個魔術方法;

    當對一個類的不存在的靜態方法進行“呼叫”的時候,會自動呼叫類中的__callstatic()這個靜態魔術方法;


針對當呼叫類的不存在的屬性或方法的過載技術(或處理機制)如下:

class BaseController {

    /*這是一個魔術方法,當一個物件或者類獲取其不存在的屬性的值時,
    *如:$obj = new BaseController ;
     * $a = $obj -> a ;
    *該方法會被自動呼叫,這樣做很友好,可以避免系統報錯
    */
    public function __get($property_name){
        echo "屬性 $property_name 不存在\n";
        //觸發錯誤
        
trigger_error("發生錯誤,$property_name 屬性不存在。",E_USER_ERROR); } /*這是一個魔術方法,當一個物件或者類給其不存在的屬性賦值時, *如:$obj = new BaseController ; * $obj -> a = 12 ; *該方法(__set(屬性名,屬性值))會被自動呼叫,這樣做很友好,可以避免系統報錯 */ public function __set($property_name,$value){ echo "屬性 $property_name 不存在\n"; //觸發錯誤 trigger_error("發生錯誤,$property_name 屬性不存在。",E_USER_ERROR); } /*這是一個魔術方法,當一個物件或者類的不存在屬性進行isset()時, *注意:isset 用於檢查一個量是否被賦值 如果為NULL會返回false *如:$obj = new BaseController ; * isset($obj -> a) ; *該方法會被自動呼叫,這樣做很友好,可以避免系統報錯 */ public function __isset($property_name){ echo "屬性 $property_name 不存在\n"; //觸發錯誤 trigger_error("發生錯誤,$property_name 屬性不存在。",E_USER_ERROR); } /*這是一個魔術方法,當一個物件或者類的不存在屬性進行unset()時, *注意:unset 用於釋放一個變數所分配的記憶體空間 *如:$obj = new BaseController ; * unset($obj -> a) ; *該方法會被自動呼叫,這樣做很友好,可以避免系統報錯 */ public function __unset($property_name){ echo "屬性 $property_name 不存在\n"; //觸發錯誤 trigger_error("發生錯誤,$property_name 屬性不存在。",E_USER_ERROR); } /*當對這個類的物件的不存在的例項方法進行“呼叫”時,會自動呼叫該方法, * 這個方法有2個引數(必須帶有的): * $methodName 表示要呼叫的不存在的方法名; * $argument 是一個數組,表示要呼叫該不存在的方法時,所使用的實引數據, * */ public function __call($methodName,$argument){ echo "例項方法 $methodName 不存在\n"; //觸發錯誤 trigger_error("發生錯誤,$methodName 方法不存在。",E_USER_ERROR); } /*當對這個類的不存在的靜態方法進行“呼叫”時,會自動呼叫該方法, * 這個方法有2個引數(必須帶有的): * $methodName 表示要呼叫的不存在的方法名; * $argument 是一個數組,表示要呼叫該不存在的方法時,所使用的實引數據, * */ public function __callstatic($methodName,$argument){ echo "靜態方法 $methodName 不存在\n"; //觸發錯誤 trigger_error("發生錯誤,$methodName 方法不存在。",E_USER_ERROR); } }