一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

php 魔術(shù)函數(shù)使用說明

什么是魔術(shù)函數(shù)?
對(duì)于__開頭的函數(shù)就命名為魔術(shù)函數(shù), 此類函數(shù)都在特定的條件下觸發(fā)的.比如: __set() __get()等
在設(shè)置或取不存在的屬性時(shí)候觸發(fā).
有那些魔術(shù)函數(shù)呢?
總的來說, 有下面幾個(gè)魔術(shù)函數(shù)
__construct() __destruct() __get() __set() __isset() __unset() __call() __callStatic()
__sleep() __wakeup() __toString() __set_state() __clone() __autoload()
__construct()當(dāng)實(shí)例化一個(gè)對(duì)象的時(shí)候,這個(gè)對(duì)象的這個(gè)方法首先被調(diào)用。
__destruct()當(dāng)刪除一個(gè)對(duì)象或?qū)ο蟛僮鹘K止的時(shí)候,調(diào)用該方法。
復(fù)制代碼 代碼如下:
class test1 {
public function __construct() {
var_dump(__function__);
}
public function __destruct() {
var_dump(__function__);
}
}
$t1 = new test1 ;
unset($t1);

__get當(dāng)試圖讀取一個(gè)并不存在的屬性的時(shí)候被調(diào)用。
__set當(dāng)試圖向一個(gè)并不存在的屬性寫入值的時(shí)候被調(diào)用。
__isset當(dāng)試圖檢測一個(gè)并不存在的屬性時(shí)候被調(diào)用。
__unset當(dāng)試圖取消一個(gè)并不存在的屬性時(shí)候被調(diào)用。
復(fù)制代碼 代碼如下:
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當(dāng)進(jìn)行序列化對(duì)象時(shí)候調(diào)用
__wakeup當(dāng)進(jìn)行反序列對(duì)象時(shí)候調(diào)用
需要注意一點(diǎn):
1. __sleep()必須返回一個(gè)數(shù)組或者對(duì)象(一般返回的是$this),返回的值將會(huì)被用來做為序列化的
值。
如果不返回這個(gè)值,則序列化失敗。這也意味著反序列化將不會(huì)觸發(fā)__wakeup事件。
2. 序列化會(huì)保存默認(rèn)賦值的屬性.如果要通過實(shí)例化賦值的內(nèi)容,則需要屬性在__sleep()返回?cái)?shù)組的
指定.
如$id與$id2的區(qū)別.
復(fù)制代碼 代碼如下:
class test3 {
public $name = "steven";
public $id = "1"; public $id2;
public function __sleep() {
var_dump(__function__); // 序列化不成功.沒有返回值.反序列也失敗 //
return array("name"); // 序列化成功.有返回值.反序列成功.id2屬性能被恢復(fù) //
return array("name", "id2");// 序列化成功.有返回值.反序列成功.id2屬性不能被恢復(fù)
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當(dāng)直接打印一個(gè)對(duì)象的時(shí)候,這個(gè)方法將會(huì)被調(diào)用
復(fù)制代碼 代碼如下:
class test4 {
public function __toString() {
return "toString";
}
}
$t4 = new test4();
echo $t4;
print $t4;
var_dump($t4);
print_r($t4);

__call($func, $param) 當(dāng)嘗試調(diào)用一個(gè)不存在的方法的時(shí)候被調(diào)用.
這個(gè)方法必須有兩個(gè)參數(shù),第一個(gè)為調(diào)用的方法名,第二個(gè)是一個(gè)被調(diào)用方法的參數(shù)數(shù)組。
需要注意的是,當(dāng)你在一個(gè)子類調(diào)用父類的private的方法,或者在實(shí)例里調(diào)用類的非protect方法的
時(shí)候,并不會(huì)調(diào)用__call()
復(fù)制代碼 代碼如下:
class test5 {
public function __call($func, $param) {
var_dump('Function:'.$func);
var_dump($param);
}
}
$t5 = new test5;
$t5->echoTest('xx','xx','xx');

__callStatic()當(dāng)嘗試調(diào)用一個(gè)不存在的靜態(tài)方法的時(shí)候被調(diào)用
這個(gè)方法必須有兩個(gè)參數(shù),第一個(gè)為調(diào)用的方法名,第二個(gè)是一個(gè)被調(diào)用方法的參數(shù)數(shù)組。
php5.3中出現(xiàn)
復(fù)制代碼 代碼如下:
class test51 {
public function __callStatic($fun, $param) {
var_dump('Function:'.$func);
var_dump($param);
}
}
test51::test('xx','xx','xx');

__set_state()當(dāng)用var_export導(dǎo)出實(shí)例的時(shí)候被調(diào)用.此方法有一個(gè)參數(shù),為包含所導(dǎo)出的實(shí)例的所
有成員屬性的一個(gè)數(shù)組
復(fù)制代碼 代碼如下:
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()當(dāng)克隆實(shí)例時(shí)候被調(diào)用.
注意:
1.在php5里,對(duì)象間的賦值總是以地址引用來傳遞的.
2.如果要以實(shí)際值來傳遞,則需要用到clone關(guān)鍵詞
3.clone的只是實(shí)例。如果實(shí)例中的某個(gè)成員屬性也是個(gè)實(shí)例,那么這個(gè)成員屬性還是會(huì)以引用方法被
傳遞到新的實(shí)例。
// 對(duì)象間的賦值總是以地址引用來傳遞的. $t71 $t72的age屬性是一樣的.
復(fù)制代碼 代碼如下:
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) ; // 如果要以實(shí)際值來傳遞,則需要用到clone關(guān)鍵詞 $t73 = clone $t71; $t71->age = 13 ; var_dump($t71->age) ;
var_dump($t73->age) ; // 如果實(shí)例中的某個(gè)成員屬性也是個(gè)實(shí)例,那么這個(gè)成員屬性還是會(huì)以引用方法被傳遞到新的實(shí)例。

復(fù)制代碼 代碼如下:
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雖然不是指向同一個(gè)實(shí)例,但是它們的成員屬性$sub卻是指向同一個(gè)實(shí)例。這時(shí)候,我們必須借
助__clone這個(gè)方法來對(duì)$sub進(jìn)行復(fù)制。 // $i2和$3指向不同實(shí)例.成員屬性$sub也指向不同實(shí)例.
復(fù)制代碼 代碼如下:
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()函數(shù).當(dāng)創(chuàng)建一個(gè)實(shí)例化的時(shí)候,如果對(duì)應(yīng)的類不存在,則會(huì)被調(diào)用
復(fù)制代碼 代碼如下:
function __autoload($class) {
   if ( $class == "test8" ){
require_once dirname(__FILE__).'/class8.php'; 
}
}
spl_autoload();
$t8 = new test8;
var_dump($t8->age);

php技術(shù)php 魔術(shù)函數(shù)使用說明,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 色婷婷在线视频 | 国产精品免费一区二区区 | 欧美日韩一二三区 | 亚洲欧美国产18 | 欧美一级在线全免费 | 免费在线小视频 | 亚洲欧美成人网 | 色婷婷亚洲十月十月色天 | 国产色婷婷亚洲 | 午夜免费视频 | 亚洲黄色在线观看 | 亚洲国产香蕉视频欧美 | 一区二区三区免费视频网站 | 亚洲欧美在线观看 | 深夜影院深a入口 | 韩国美女一级毛片 | 伊人精品视频在线观看 | 亚洲欧洲精品成人久久曰影片 | 色偷偷成人 | 国产福利精品在线 | 久久亚洲综合网 | 亚洲欧美久久婷婷爱综合一区天堂 | 最新国产福利在线 | 九九综合视频 | 精品成人一区二区 | 国产一区在线免费观看 | 思思久久q6热在精品国产 | 免费国产精品视频 | 国产一区二区在线播放 | 国产精品麻豆99久久 | 精品视频第一页 | 一级风流片a级国产 | 国产激情图片 | 欧美激情视频网站 | 欧美首页 | 91免费在线视频观看 | 四虎入口 | 黄色在线视频网站 | 国产麻豆福利a v在线播放 | 大杳焦伊人久久综合热 | 婷婷涩 |