魔術常數
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 新加)。傳回該方法被定義時的名字(區分大小寫)。
什麼是魔術函數?
對於開頭的函數就命名為魔術函數, 此類函數都在特定的條件下觸發的.例如: set() get()等
在設定或取不存在的屬性時候觸發.
有那些魔術函數呢?
總的來說, 有下面幾個魔術函數
construct() destruct() get() set() isset() unset() call() callStatic()
sleep() wakeup() toString#() set_state() clone() autoload()
construct()當實例化一個物件的時候,這個物件的這個方法首先被呼叫。
destruct()當刪除一個物件或物件操作終止的時候,呼叫該方法。
class test1 { public function construct() { var_dump(function); } public function destruct() { var_dump(function); } } $t1 = new test1 ; unset($t1);
get當試圖讀取一個不存在的屬性的時候被呼叫。
set當試圖向一個不存在的屬性寫入值的時候被呼叫。
isset當試圖偵測一個並不存在的屬性時候被呼叫。
unset當試圖取消一個並不存在的屬性時候被呼叫。
class test2 { public $name3; public function set($key, $value) { var_dump(function. ' KEY:' .$key.' Value:' .$value); } public function get($key) { var_dump(function. 'KEY:'.$key); } public function isset($key) { var_dump(function. ' KEY:'.$key); } public function unset($key) { var_dump(function. ' KEY:'.$key); } } $t =new test2 ; $t->name = "steven"; $t->name2; $t->name3; isset($t->name2); isset($t->name3); unset($t->name4);
sleep當進行序列化物件時候呼叫
wakeup當進行反序列物件時候呼叫
需要注意一點:
1. sleep()必須傳回一個陣列或物件(一般返回的是$this),傳回的值將會被用來做為序列化的
值。
如果不傳回這個值,則序列化失敗。這也意味著反序列化將不會觸發wakeup事件。
2. 序列化會保存預設賦值的屬性.如果要透過實例化賦值的內容,則需要屬性在sleep()傳回數組的
指定.
如$id與$id2的區別.
class test3 { public $name = "steven"; public $id = "1"; public $id2; public function sleep() { var_dump(function); // 序列化不成功.没有返回值.反序列也失败 // return array("name"); // 序列化成功.有返回值.反序列成功.id2属性能被恢复 // return array("name", "id2");// 序列化成功.有返回值.反序列成功.id2属性不能被恢复 return array("name"); } public function testEcho() { var_dump($this->name); var_dump($this->id); var_dump($this->id2); } public function wakeup() { var_dump(function); $this->testEcho(); } } $t3= new test3 ; $t3->id2 = uniqid(); $t3s = serialize($t3); unserialize($t3s);
toString當直接列印一個物件的時候,這個方法將會被呼叫
class test4 { public function toString() { return "toString"; } } $t4 = new test4(); echo $t4; print $t4; var_dump($t4); print_r($t4);
call($func, $param) 當嘗試呼叫一個不存在的方法的時候被呼叫.
這個方法必須有兩個參數,第一個為呼叫的方法名,第二個是一個被呼叫方法的參數數組。
要注意的是,當你在一個子類別呼叫父類別的private的方法,或是在實例裡呼叫類別的非protect方法的
時候,並不會呼叫call()
class test5 { public function call($func, $param) { var_dump('Function:'.$func); var_dump($param); } } $t5 = new test5; $t5->echoTest('xx','xx','xx');
callStatic()當嘗試呼叫一個不存在的靜態方法的時候被呼叫
這個方法必須有兩個參數,第一個為呼叫的方法名,第二個是一個被呼叫方法的參數數組。
在PHP5.3中出現
class test51 { public function callStatic($fun, $param) { var_dump('Function:'.$func); var_dump($param); } } test51::test('xx','xx','xx');
set_state()當用var_export導出實例的時候被呼叫.此方法有一個參數,為包含所導出的實例的所
有成員屬性的一個陣列
class test6 { public function set_state($arr){ var_dump($arr); } } $t6 = new test6; $t6->age = "12"; var_export($t6, true); var_export($t6); eval(' $b=' .var_export($t6,true).';'); print_r($b);
clone()當複製實例時候被呼叫.
注意:
1.在php5裡,物件間的賦值總是以位址引用來傳遞的.
2 .如果要以實際值來傳遞,則需要用到clone關鍵字
3.clone的只是實例。如果實例中的某個成員屬性也是實例,那麼這個成員屬性還是會以引用方法被
傳遞到新的實例。
// 物件間的賦值總是以位址引用來傳遞的. $t71 $t72的age屬性是一樣的.
class test71 { public $age = 10; } $t71 = new test71(); $t72 = $t71 ; var_dump($t71->age) ; $t71->age =12 ; var_dump($t71->age) ; var_dump($t72->age) ; // 如果要以实际值来传递,则需要用到clone关键词 $t73 = clone $t71; $t71->age = 13 ; var_dump($t71->age) ; var_dump($t73->age) ; // 如果实例中的某个成员属性也是个实例,那么这个成员属性还是会以引用方法被传递到新的实例。
autoload()函數.當建立一個實例化的時候,如果對應的類別不存在,則會被呼叫
function autoload($class) { if ( $class == "test8" ){ require_once dirname (FILE).'/class8.php'; } } spl_autoload(); $t8 = new test8; var_dump($t8->age);
以上是php魔術常數介紹和魔術函數使用程式碼說明總結的詳細內容。更多資訊請關注PHP中文網其他相關文章!