PHP5中魔術方法函式和魔法常量有哪幾個,請舉例說明各自的用法
魔術函式
1、__construct()
例項化物件時被呼叫,當__construct和以類名為函式名的函式同時存在時,__construct將被呼叫,另一個不被呼叫。
<?php
class Test
{
public function __construct()
{
echo "__construct <br>";
}
public function Test()
{
echo "Test <br>";
}
}
$t = new Test();
輸出:__construct
如果隱藏__construct函式,則輸出:Test
2、__destruct()
當刪除一個物件或物件操作終止時被呼叫。
當執行die時,__destruct會被呼叫;
3、__call()
物件呼叫某個方法,若方法存在,則直接呼叫;若不存在,則會去呼叫__call函式。
<?php class Test { public function __call($Key, $Args) { echo "您要呼叫的 {$Key} 方法不存在。你傳入的引數是:" . print_r($Args, true); } } $t = new Test(); $t->notExit('ok','go'); die;
4、__get()
讀取一個物件的屬性時,若屬性存在,則直接返回屬性值;若不存在,則會呼叫__get函式。如果試圖讀取一個物件並不存在的屬性的時候,PHP就會給出錯誤資訊。如果在類裡新增__get方法,並且我們可以用這個函式實現類似java中反射的各種操作。
class Test { public function __set($key,$value) { echo '對.$key . '附值'.$value; } public function __get($key) { echo $key . '不存在'; } } $t = new Test(); $t->name = 'ok'; echo $t->name;
5、__set()
設定一個物件的屬性時,若屬性存在,則直接賦值;若不存在,則會呼叫__set函式。
6、__toString()
列印一個物件的時被呼叫。如echo $obj;或print $obj;
class Test
{
public function __toString()
{
return “列印 Test”;
}
}
$t = new Test();
echo $t;
執行echo $t;的時候,就會呼叫$t->__toString();從而輸出
列印 Test
7、__clone()
__clone()
克隆物件時被呼叫。如:$t=new Test();$t1=clone $t;
class Test
{
public function __clone()
{
echo “我被複制了!”;
}
}
$t = new Test();
$t1 = clone $t;
程式輸出:
我被複制了
8、__sleep() serialize之前被呼叫。若物件比較大,想刪減一點東東再序列化,可考慮一下此函式。
9、__wakeup() unserialize時被呼叫,做些物件的初始化工作。
10、 __isset() 檢測一個物件的屬性是否存在時被呼叫。如:isset($c->name)。
11、__unset() unset一個物件的屬性時被呼叫。如:unset($c->name)。
12、__set_state() 呼叫var_export時,被呼叫。用__set_state的返回值做為var_export的返回值。
13、__autoload() 例項化一個物件時,如果對應的類不存在,則該方法被呼叫。
魔術常量
- __LINE__
返回檔案中的當前行號。 - __FILE__
返回檔案的完整路徑和檔名。如果用在包含檔案中,則返回包含檔名。自 PHP 4.0.2 起,__FILE__ 總是包含一個絕對路徑,而在此之前的版本有時會包含一個相對路徑。 - __FUNCTION__
返回函式名稱(PHP 4.3.0 新加)。自 PHP 5 起本常量返回該函式被定義時的名字(區分大小寫)。在 PHP 4 中該值總是小寫字母的。 - __CLASS__
返回類的名稱(PHP 4.3.0 新加)。自 PHP 5 起本常量返回該類被定義時的名字(區分大小寫)。在 PHP 4 中該值總是小寫字母的。 - __METHOD__
返回類的方法名(PHP 5.0.0 新加)。返回該方法被定義時的名字(區分大小寫)。