摘錄php官網對php過載的解釋:
php所提供的"過載"(overloading)是指動態地"建立"類屬性和方法。我們是通過魔術方法(magic methods)來實現的。
當呼叫當前環境下未定義或不可見的類屬性或方法時,過載方法會被呼叫。本節後面將使用"不可訪問屬性(inaccessible properties)"和"不可訪問方法(inaccessible methods)"來稱呼這些未定義或不可見的類屬性或方法。
所有的過載方法都必須被宣告為 public。
note:
這些魔術方法的引數都不能通過引用傳遞。
note:
php中的"過載"與其它絕大多數物件導向語言不同。傳統的"過載"是用於提供多個同名的類方法,但各方法的引數型別和個數不同。
屬性過載
public __set ( string $name , mixed $value ) : void
public __get ( string $name ) : mixed
public __isset ( string $name ) : bool
public __unset ( string $name ) : void
在給不可訪問屬性賦值時,__set() 會被呼叫。
讀取不可訪問屬性的值時,__get() 會被呼叫。
當對不可訪問屬性呼叫 isset() 或 empty() 時,__isset() 會被呼叫。
當對不可訪問屬性呼叫 unset() 時,__unset() 會被呼叫。
引數 $name 是指要操作的變數名稱。__set() 方法的 $value 引數指定了 $name 變數的值。
屬性過載只能在物件中進行。在靜態方法中,這些魔術方法將不會被呼叫。所以這些方法都不能被 宣告為 static。
note:
因為 php 處理賦值運算的方式,__set() 的返回值將被忽略。類似的, 在下面這樣的鏈式賦值中,__get() 不會被呼叫:
$a = $obj->b = 8;
note:
在除 isset() 外的其它語言結構中無法使用過載的屬性,這意味著當對乙個過載的屬性使用 empty() 時,過載魔術方法將不會被呼叫。
為避開此限制,必須將過載屬性賦值到本地變數再使用 empty()。
example #1 使用 __get(),__set(),__isset() 和 __unset() 進行屬性過載
classpropertytest
public
function __get ($name
)
if (array_key_exists($name, $this->data))
//產生一條回溯跟蹤
$trace = debug_backtrace
();
//丟擲異常
trigger_error('undefined property via __get(): ' . $name . ' in ' . $trace[0]['file'] . ' on line ' . $trace[0]['line'], e_user_notice
);
return
null
; }
public
function __isset ($name
)
public
function __unset ($name
)
/** 非魔術方法
*/public
function
gethidden ()
}$obj = new
propertytest;
//輸出不存在的a變數,走到__get()中,會丟擲異常
echo
$obj->a;
//對不存在的a變數賦值為1,會走到__set()中
$obj->a = 1;
//再次輸出a變數,由於上面已經對其__set(),所以這是可以訪問到a的值為1
echo
$obj->a;
//此時使用isset()對不存在的a變數進行運算時,會走到__isset()中,由於上面已經對其__set(),所以是true
var_dump(isset($obj->a));
//對a進行unset()時,會走到__unset()中
unset($obj->a);
//再對其進行isset(),此時已經不存在了
var_dump(isset($obj->a));
//訪問private 屬性的變數,會進入__get()中
echo
$obj->hidden;
方法過載
public __call ( string $name , array $arguments ) : mixed
public static __callstatic ( string $name , array $arguments ) : mixed
在物件中呼叫乙個不可訪問方法時,__call() 會被呼叫。
在靜態上下文中呼叫乙個不可訪問方法時,__callstatic() 會被呼叫。
$name 引數是要呼叫的方法名稱。
$arguments 引數是乙個列舉陣列,包含著要傳遞給方法 $name 的引數。
example #2 使用 __call() 和 __callstatic() 對方法過載
classmethodtest
/*** php 5.3.0之後版本
* 呼叫不存在的靜態方法時,進入此處
*/public
static
function __callstatic ($name, $arguments
)
}$arguments = ['a', 'b', 'c'];
$obj = new
methodtest;
$obj->test(...$arguments
);methodtest::test(...$arguments); //
php 5.3.0之後版本
/** 以上兩個都輸出:
* array
([name] => test
[arguments] => array
([0] => a
[1] => b
[2] => c))
*/
PHP魔術方法使用
php魔術方法的使用 php魔術方法的使用 1 get 和 set 2 call 和 callstatic 3 tostring 4 invoke 1 get 和 set 乙個php類檔案為 object.php class object private array array function s...
PHP 中的魔術方法 屬性過載
php過載 是指,使用乙個物件 或類 的時候,如果訪問了其並沒有定義的 即不存在的 屬性或方法,則會使用某些預先定義好的 特殊方法 來應對這種情況。php中的過載,其實是一種內部 應對非法使用物件或類的措施 set name,value 該方法,在對乙個物件不存在的屬性進行賦值的時候,會被自動呼叫 ...
PHP魔術方法使用總結
魔術方法是php物件導向中特有的特性。它們在特定的情況下被觸發,都是以雙下劃線開頭,你可以把它們理解為鉤子,利用模式方法可以輕鬆實現php物件導向中過載 overloading即動態建立類屬性和方法 魔術方法很多還是成對出現的,以下列出目前php中所有的模式方法。1.construct,destru...