PHP的過載 使用魔術方法實現

2022-08-03 10:39:17 字數 3223 閱讀 8563

摘錄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() 進行屬性過載

class

propertytest

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() 對方法過載

class

methodtest

/*** 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...