PHP魔術函式和魔術常量

2021-06-05 22:18:13 字數 4143 閱讀 2613

魔術函式

1、__construct()

例項化物件時被呼叫。

當__construct和以類名為函式名的函式同時存在時,__construct將被呼叫,另乙個不被呼叫。

2、__destruct()

當刪除乙個物件或物件操作終止時被呼叫。

3、__call()

物件呼叫某個方法。

若方法存在,則直接呼叫。 

若不存在,則會去呼叫__call函式。

4、__get()

讀取乙個物件的屬性時。

若屬性存在,則直接返回屬性值。

若不存在,則會呼叫__get函式。

5、__set()

設定乙個物件的屬性時。

若屬性存在,則直接賦值。

若不存在,則會呼叫__set函式。

6、__tostring()

列印乙個物件的時被呼叫。如echo $obj;或print $obj;

注意:這時候php會丟擲乙個catchable fatal error錯誤,還有一點要注意,用print_r列印物件不會觸發此函式

7。__clone()

轉殖物件時被呼叫。如:$t=new test();$t1=clone $t;

8、__sleep()

serialize之前被呼叫。若物件比較大,想刪減一點東東再序列化,可考慮一下此函式。

9、__wakeup()

unserialize時被呼叫,做些物件的初始化工作。

10、__isset()

檢測乙個物件的屬性是否存在時被呼叫。如:isset($c->name)。

如果name不存在,則觸發該函式

11、__unset()

unset乙個物件的屬性時被呼叫。如:unset($c->name)。

如果name不存在,則觸發該函式

12。__set_state()

呼叫var_export時,被呼叫。用__set_state的返回值做為var_export的返回值。

13、__autoload()

這個函式比較特殊,這個函式並不是作為類的成員方法是用的。

例項化乙個物件時,如果對應的類不存在,則該方法被呼叫。

可以用spl_autoload_register函式來定義其他的函式來代替__autoload

魔術常量

1、__line__

返回檔案中的當前行號。

2、__file__

返回檔案的完整路徑和檔名。如果用在包含檔案中,則返回包含檔名。自 php 4.0.2 起,__file__ 總是包含乙個絕對路徑,而在此之前的版本有時會包含乙個相對路徑。

3、__function__

返回函式名稱(php 4.3.0 新加)。自 php 5 起本常量返回該函式被定義時的名字(區分大小寫)。在 php 4 中該值總是小寫字母的。

4、__class__

返回類的名稱(php 4.3.0 新加)。自 php 5 起本常量返回該類被定義時的名字(區分大小寫)。在 php 4 中該值總是小寫字母的。

5、__method__

返回類的方法名(php 5.0.0 新加)。返回該方法被定義時的名字(區分大小寫)。

測試例子

<?php

class magic

/*** 建構函式

* 在類的初始化的時候我被呼叫

* 當__construct和以類名為函式名的函式同時存在時,__construct將被呼叫,另乙個不被呼叫。

*/public function __construct()

/*** 析構函式

* 當刪除乙個物件或物件操作終止時候呼叫

*/public function __destruct()

/*** 當呼叫物件不存在的方法時,我被觸發

* @param varchar $method 呼叫的方法名

* @param array $args 傳遞的引數

*/public function __call($method, $args)

/*** 讀取乙個物件的屬性時,如果該屬性不存在,我被觸發

* @param varchar $attr 所get的屬性名

*/public function __get($attr)

/*** 設定乙個物件的屬性的值的時候,若屬性存在,直接賦值,若不存在,我被觸發

* @param varchar $attr 所set的變數名

* @param $value 所set的變數值

*/public function __set($attr, $value)

/*** 列印乙個物件時,我被呼叫

* 注意:這時候php會丟擲乙個catchable fatal error錯誤,還有一點要注意,用print_r列印物件不會觸發此函式

*/public function __tostring()

/*** 物件被轉殖的時候呼叫我

*/public function __clone()

/*** 物件在serialize之前被呼叫。若物件比較大,想刪減一點東東再序列化,可考慮一下此函式。

*/public function __sleep()

/*** unserialize時被呼叫,做些物件的初始化工作。

*/public function __wakeup()

/*** 檢測乙個物件的屬性是否存在時被呼叫

* 如果屬性存在,不呼叫

* 如果不存在,呼叫

* @param varchar $attr 檢測的物件的名稱

*/public function __isset($attr)

/*** unset乙個物件的屬性時被呼叫

*/public function __unset($attr)

/*** 呼叫var_export時,被呼叫。用__set_state的返回值做為var_export的返回值。

*/public function __set_state() }

// test __construct

$magic = new magic;

// __construct 被觸發,輸出__construct

// test __call

$magic->haha(1,2,3);

// __call 被觸發

// 輸出 haha be called with args:array ( [0] => 1 [1] => 2 [2] => 3 )

// test __get

$magic->a;

$magic->b;

// 輸出 b has been get!

// test __set

$magic->b = array(1,2,3);

// 輸出 b has been to value:123

// test __tostring

//print $magic; // 測試時請去掉注釋

// 輸出 __tosting

// 同時給出乙個報錯:catchable fatal error: method magic::__tostring() must return a string value in e:\eclipse\workspace\test\magic_test.php on line 87

// test __clone

//$new_magin = clone $magic;

// 輸出 __clone

// test __isset

isset($magic->a);

// 無輸出

isset($magic->b);

// b is checked by isset function

// test __unset

unset($magic->a);

// 無輸出

unset($magic->b);

// 輸出 b has been unset

echo '

';function __autoload($class_name)

$test_auto = new test_auto;

// 輸出 __autoload

PHP魔術常量 魔術函式

1 魔術常量 2 line 檔案中的當前行號 包含注釋行 3 file 檔案的完整路徑和檔名 4 function 當前所在的函式名稱 php 4.3.0 新增 5 class 當前所在的類的名稱 php 4.3.0 新增 6 method 當前所在的類的方法名 php 5.0.0 新增 7 核心預...

php的魔術函式和魔術常量

1。construct 例項化物件時被呼叫,當 construct和以類名為函式名的函式同時存在時,construct將被呼叫,另乙個不被呼叫。2。destruct 當刪除乙個物件或物件操作終止時被呼叫。3。call 物件呼叫某個方法,若方法存在,則直接呼叫 若不存在,則會去呼叫 call函式。4。...

PHP魔術方法和魔術常量

具體的解釋如下 1。construct 例項化物件時被呼叫,當 construct和以類名為函式名的函式同時存在時,construct將被呼叫,另乙個不被呼叫。2。destruct 當刪除乙個物件或物件操作終止時被呼叫。3。call 物件呼叫某個方法,若方法存在,則直接呼叫 若不存在,則會去呼叫 c...