程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php 魔術函數使用說明

php 魔術函數使用說明

編輯:關於PHP編程

什麼是魔術函數?
對於__開頭的函數就命名為魔術函數, 此類函數都在特定的條件下觸發的.比如: __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) ; // 如果實例中的某個成員屬性也是個實例,那麼這個成員屬性還是會以引用方法被傳遞到新的實例。

復制代碼 代碼如下:
class test74 {
public $age = 10;
public $sub = null;
}
class test75 {
public $age = 11;
}
$i = new test74;
$i->sub = new test75();
$i1 =clone $i;
var_dump($i1->sub->age);
$i->sub->age = 12;
var_dump($i1->sub->age);

// $i 和$i1雖然不是指向同一個實例,但是它們的成員屬性$sub卻是指向同一個實例。這時候,我們必須借
助__clone這個方法來對$sub進行復制。 // $i2和$3指向不同實例.成員屬性$sub也指向不同實例.
復制代碼 代碼如下:
class test76 {
public $age = 10;
public $sub = null;
public function __clone() {
$this->sub = clone $this->sub;
}
}
$i2 = new test76();
$i2->sub = new test75();
$i3 = clone $i2;
$i2->sub->age = 15 ;
var_dump($i3->sub->age);

__autoload()函數.當創建一個實例化的時候,如果對應的類不存在,則會被調用
復制代碼 代碼如下:
function __autoload($class) {
   if ( $class == "test8" ){
require_once dirname(__FILE__).'/class8.php'; 
}
}
spl_autoload();
$t8 = new test8;
var_dump($t8->age);

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved