php 魔術方法

2021-08-04 19:03:01 字數 4887 閱讀 1665

方法一:__contruct()

作用:在每次類被例項化的時候被呼叫

<?php

class

index

}$index= new index();

//執行結果 頁面顯示123

方法二:__call($function_name,$args)

作用:在物件中呼叫乙個不可訪問方法時呼叫

該方法有兩個引數 fu

ncti

onna

me:不

可訪問的

方法名稱

args : 對不可訪問的方法傳入的引數值

class

index

private

function

aa(){}

}$index= new index();

$index->aa(123,456,"111");

方法三 :__tostring()

作用 : 類被當成字串時的回應方法, 輸出的內容需要返回

<?php

class

index

}$index= new index();

echo

$index;

方法四 :__destruct()

作用 : 類的析構函式

析構方法允許在銷毀乙個類之前執行的一些操作或完成一些功能,比如說關閉檔案、釋放結果集等。

一般來說,析構方法在php中並不是很常用,它屬類中可選擇的一部分,通常用來完成一些在物件銷毀前的清理任務。

<?php

class

index

}$index= new index();

unset($index); //銷毀上面建立的物件$person

方法五 :__get()

作用 : 獲得乙個類的成員變數時呼叫

在 php 物件導向程式設計中,類的成員屬性被設定為 private 後,如果我們試圖在外面呼叫它則會出現「不能訪問某個私有屬性」的錯誤。那麼為了解決這個問題,我們可以使用魔術方法 __get()。

$fieldname : 不能直接方法的屬性名

<?php

class

index

}$index= new index();

echo

$index->name;

方法六:__set()

作用 : 設定乙個類的成員變數時呼叫

__set( pr

oper

ty, value )` 方法用來設定私有屬性, 給乙個未定義的屬性賦值時,此方法會被觸發,傳遞的引數是被設定的屬性名和值。

<?php

class

index

public

function

getname

()

}$index= new index();

$index->name = "譚勇";

echo

$index->getname();

方法七 :__isset()

作用 : 當對不可訪問屬性呼叫isset()或empty()時呼叫

在看這個方法之前我們看一下isset()函式的應用,isset()是測定變數是否設定用的函式,傳入乙個變數作為引數,如果傳入的變數存在則傳回true,否則傳回false。

那麼如果在乙個物件外面使用isset()這個函式去測定物件裡面的成員是否被設定可不可以用它呢?

分兩種情況,如果物件裡面成員是公有的,我們就可以使用這個函式來測定成員屬性,如果是私有的成員屬性,這個函式就不起作用了,原因就是因為私有的被封裝了,在外部不可見。那麼我們就不可以在物件的外部使用isset()函式來測定私有成員屬性是否被設定了呢?當然是可以的,但不是一成不變。你只要在類裡面加上乙個__isset()方法就可以了,當在類外部使用isset()函式來測定物件裡面的私有成員是否被設定時,就會自動呼叫類裡面的__isset()方法了幫我們完成這樣的操作。

__isset()的作用:當對不可訪問屬性呼叫 isset() 或 empty() 時,__isset() 會被呼叫。

<?php

class

index

}$index= new index();

if(isset($index->age))

方法八 :__unset()

作用 : 當對不可訪問屬性呼叫unset()時被呼叫。

看這個方法之前呢,我們也先來看一下 unset() 函式,unset()這個函式的作用是刪除指定的變數且傳回true,引數為要刪除的變數。

那麼如果在乙個物件外部去刪除物件內部的成員屬性用unset()函式可以嗎?

這裡自然也是分兩種情況:

1、 如果乙個物件裡面的成員屬性是公有的,就可以使用這個函式在物件外面刪除物件的公有屬性。

2、 如果物件的成員屬性是私有的,我使用這個函式就沒有許可權去刪除。

雖然有以上兩種情況,但我想說的是同樣如果你在乙個物件裡面加上__unset()這個方法,就可以在物件的外部去刪除物件的私有成員屬性了。在物件裡面加上了__unset()這個方法之後,在物件外部使用「unset()」函式刪除物件內部的私有成員屬性時,物件會自動呼叫__unset()函式來幫我們刪除物件內部的私有成員屬性。

<?php

class

index

}$index= new index();

unset($index->age);

方法九 :__sleep()

serialize() 函式會檢查類中是否存在乙個魔術方法 __sleep()。如果存在,則該方法會優先被呼叫,然後才執行序列化操作。

此功能可以用於清理物件,並返回乙個包含物件中所有應被序列化的變數名稱的陣列。

如果該方法未返回任何內容,則 null 被序列化,並產生乙個 e_notice 級別的錯誤。

注意:__sleep() 不能返回父類的私有成員的名字。這樣做會產生乙個 e_notice 級別的錯誤。可以用 serializable 介面來替代。

作用:__sleep() 方法常用於提交未提交的資料,或類似的清理操作。同時,如果有一些很大的物件,但不需要全部儲存,這個功能就很好用。

<?php

class

index

}$index= new index();

echo serialize($index);

方法十 :__wakeup()

作用 : 執行unserialize()時,先會呼叫這個函式

如果說 __sleep() 是白的,那麼 __wakeup() 就是黑的了。

那麼為什麼呢?

因為:與之相反,unserialize()會檢查是否存在乙個__wakeup()方法。如果存在,則會先呼叫__wakeup方法,預先準備物件需要的資源。

作用:__wakeup() 經常用在反序列化操作中,例如重新建立資料庫連線,或執行其它初始化操作。

<?php

header("content-type:text/html;charset=utf-8");

class

index

public

function

__wakeup

()

}$index= new index();

$a = serialize($index);

$aindex = unserialize($a);

echo

$aindex->name;

方法十一 :__invoke()

作用 : 呼叫函式的方式呼叫乙個物件時的回應方法

當嘗試以呼叫函式的方式呼叫乙個物件時,__invoke() 方法會被自動呼叫。

注意:本特性只在 php 5.3.0 及以上版本有效。

<?php

header("content-type:text/html;charset=utf-8");

class

index

}$index= new index();

$index();

方法十二 :__clone()作用:

物件複製可以通過 clone 關鍵字來完成(如果可能,這將呼叫物件的 __clone() 方法)。物件中的 __clone() 方法不能被直接呼叫。

語法:

$copy_of_object = clone

$object;

注意:

當物件被複製後,php 5 會對物件的所有屬性執行乙個淺複製(shallow copy)。所有的引用屬性 仍然會是乙個指向原來的變數的引用。

當複製完成時,如果定義了 __clone() 方法,則新建立的物件(複製生成的物件)中的 __clone() 方法會被呼叫,可用於修改屬性的值(如果有必要的話)。

<?php

header("content-type:text/html;charset=utf-8");

class

index

}$index= new index();

$index_1 = clone

$index;

php魔術常量,魔術方法

魔術常量 1。line 返回檔案中的當前行號。2。file 返回檔案的完整路徑和檔名。如果用在包含檔案中,則返回包含檔名。自php4.0.2 起,file 總是包含乙個絕對路徑,而在此之前的版本有時會包含乙個相對路徑。3。function 返回函式名稱 php4.3.0 新加 自php5 起本常量返...

invoke 魔術 PHP 魔術方法

php 魔術方法 構造方法 construct 析構方法 destruct get 與 set unset call 和 callstatic sleep 和 wakeup clone tostring invoke set state debuginfo construct 這個方法應該是最常用的...

php魔術方法

php5魔術方法 魔術函式 1。construct 建構函式 例項化物件時被呼叫,當 construct和以類名為函式名的建構函式同時存在時,construct將被呼叫,另乙個不被呼叫。2。destruct 析構函式 當刪除乙個物件或物件操作終止時被呼叫 程式結束後物件就摧毀 永遠都是最後執行的。3...