日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內(nèi)最全I(xiàn)T社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > php開源 > php教程 > php __set __get __isset __unset用法防被忽悠分析

php __set __get __isset __unset用法防被忽悠分析

來源:程序員人生   發(fā)布時(shí)間:2014-12-16 08:40:00 閱讀次數(shù):2825次

大家好我是小煙  今天分享下 php面向?qū)ο笾衉_set __get __isset __unset用法之防忽悠介紹

全文注意=====================================

__set __get __isset __unset  這些方法 老版本php是可以設(shè)置成私有的 但是現(xiàn)在php版本 最好不要設(shè)置成私有 更不能設(shè)置成靜態(tài) 設(shè)置成靜態(tài)方法直接就出錯了  設(shè)置成私有的話 雖然能正常返回值 但是會有個(gè) Warning 正告!?。ū救耸莗hp5.5版本)



正文開始======================================


我們常常會在php的面向?qū)ο笾锌梢钥吹轿籣_set __get __isset __unset這些東西的用法,但很不明白為何會要用這些東西,下面我們來逐一介紹1下他們哥4的用法吧。

  1般來講,總是把類的屬性定義為private,這更符合現(xiàn)實(shí)的邏輯。但是,對屬性的讀取和賦值操作是非常頻繁的,因此在PHP5中,預(yù)定義了兩個(gè)函數(shù)“__get()”和“__set()”來獲得和賦值其屬性,和檢查屬性的“__isset()”和刪除屬性的方法“__unset()”。


我們?yōu)槊恳粋€(gè)屬性做了設(shè)置和獲得的方法,在PHP5中給我們提供了專門為屬性設(shè)置值和獲得值的方法,“__set()”和“__get()”這兩個(gè)方法,這兩個(gè)方法不是默許存在的,而是我們手工添加到類里面去的,像構(gòu)造方法(__construct())1樣, 類里面添加了才會存在,可以按下面的方式來添加這兩個(gè)方法,固然也能夠按個(gè)人的風(fēng)格來添加:

public function __get($property_name){ if(isset($this->$property_name)){ return($this->$property_name); }else{ return(NULL); } } //__set()方法用來設(shè)置私有屬性 public function __set($property_name, $value){ $this->$property_name = $value; }
__get()方法:這個(gè)方法用來獲得私有成員屬性值的,有1個(gè)參數(shù),參數(shù)傳入你要獲得的成員屬性的名稱,返回獲得的屬性值,這個(gè)方法不用我們手工的去調(diào)用,由于我們也能夠把這個(gè)方法做成私有的方法,是在直接獲得私有屬性的時(shí)候?qū)ο笞詣诱{(diào)用的。由于私有屬性已被封裝上了,是不能直接獲得值的(比如:"echo $p1->name"這樣直接獲得是毛病的),但是如果你在類里面加上了這個(gè)方法,在使用"echo $p1->name"這樣的語句直接獲得值的時(shí)候就會自動調(diào)用__get($property_name)方法,將屬性name傳給參數(shù)$property_name,通過這個(gè)方法的內(nèi)部履行,返回我們傳入的私有屬性的值。如果成員屬性不封裝成私有的,對象本身就不會去自動調(diào)用這個(gè)方法。

 基本上網(wǎng)上 99%的文章 介紹 __get() 都是這么說的 但是我還要說最關(guān)鍵的是  __get() 不光只是獲得當(dāng)前類的私有成員變量 還能在這個(gè)方法里面 做其他操作 比如說 實(shí)例化另外一個(gè)類 獲得另外一個(gè)類的對象。 請看下面代碼

public function __get($name) { return LibsComponents::getInstance()->$name; }

這里 如果 獲得name  其實(shí)不是獲得當(dāng)前類的 私有屬性 而且靜態(tài)調(diào)用 Components類 里面的 $name 屬性 所以 __get 方法1定要靈活應(yīng)用 還有就是 __get() 方法不只是調(diào)用當(dāng)前類的私有變量

public function __get($name) { if(isset($this->config[$name])) { return $this->config[$name]; } return null; }
也還能這么用   指定 要獲得的 變量!!


乃至 還能在類里面用 請看下面代碼

class b { private $config = ['aa'=>'小煙']; public function __get($key) { if($this->config[$key]) return $this->config[$key]; } public function __construct() { echo $this->aa; } } $b = new b(); //輸出 小煙

類里面 $this->bb 根本不存在 就會在類里面觸發(fā) __get 方法 返回config 里面的 aa  從而返回內(nèi)容



__set()方法:這個(gè)方法也是用來取得你指定的變量 1般來說都是獲得類里面的私有變量,有兩個(gè)參數(shù),第1個(gè)參數(shù)為你要為設(shè)置值的屬性名,第2個(gè)參數(shù)是要給屬性設(shè)置的值,沒有返回值。,

如果沒有__set()這個(gè)方法,是不允許直接獲得私有變量的,比如:$this->name='zhangsan', 這樣會出錯,但是如果你在類里面加上了__set($property_name, $value)這個(gè)方法,在直接給私有屬性賦值的時(shí)候,就會自動調(diào)用它,把屬性比如name傳給$property_name, 把要賦的值"zhangsan"傳給$value,通過這個(gè)方法的履行,到達(dá)賦值的目的。如果成員屬性不封裝成私有的,對象本身就不會去自動調(diào)用這個(gè)方法。為了不傳入非法的值,還可以在這個(gè)方法給做1下判斷。代碼以下:

<?php class Person{ private $name; private $sex; private $age; private function __get($property_name){ echo "在直接獲得私有屬性值的時(shí)候,自動調(diào)用了這個(gè)__get()方法<br>"; if (isset($this->$property_name)) { return ($this->$property_name); } else { return null; } } private function __set($property_name, $value) { echo "在直接設(shè)置私有屬性值的時(shí)候,自動調(diào)用了這個(gè)__set()方法為私有屬性賦值<br>"; $this->$property_name = $value; } } $p1 = new Person(); $p1->name = "小煙"; $p1->sex = "男"; $p1->age = 23; echo "姓名:".$p1->name."<br>"; echo "性別:".$p1->sex."<br>"; echo "年齡:".$p1->age."<br>";

程序履行結(jié)果:
在直接設(shè)置私有屬性值的時(shí)候,自動調(diào)用了這個(gè)__set()方法為私有屬性賦值 在直接設(shè)置私有屬性值的時(shí)候,自動調(diào)用了這個(gè)__set()方法為私有屬性賦值 在直接設(shè)置私有屬性值的時(shí)候,自動調(diào)用了這個(gè)__set()方法為私有屬性賦值 在直接獲得私有屬性值的時(shí)候,自動調(diào)用了這個(gè)__get()方法 姓名:小煙 在直接獲得私有屬性值的時(shí)候,自動調(diào)用了這個(gè)__get()方法 性別:男 在直接獲得私有屬性值的時(shí)候,自動調(diào)用了這個(gè)__get()方法 年齡:23


以上代碼如果不加上__get()和__set()方法,程序就會出錯,由于不能在類的外部操作私有成員,而上面的代碼是通過自動調(diào)用__get()和__set()方法來幫助我們直接存取封裝的私有成員的。


__isset() 方法:在看這個(gè)方法之前我們看1下"isset()"函數(shù)的利用,isset()是測定變量是不是設(shè)定用的函數(shù),傳入1個(gè)變量作為參數(shù),如果傳入的變量存在則傳回true,否則傳回false。


那末如果在1個(gè)對象外面使用"isset()"這個(gè)函數(shù)去測定對象里面的成員是不是被設(shè)定可不可以用它呢?分兩種情況,如果對象里面成員是公有的,我們就能夠使用這個(gè)函數(shù)來測定成員屬性,如果是私有的成員屬性,這個(gè)函數(shù)就不起作用了,緣由就是由于私有的被封裝了,在外部不可見。那末我們就不可以在對象的外部使用"isset()"函數(shù)來測定私有成員屬性是不是被設(shè)定了呢?

答案是可以的,你只要在類里面加上1個(gè)"__isset()"方法就能夠了,當(dāng)在類外部使用"isset()"函數(shù)來測定對象里面的私有成員是不是被設(shè)定時(shí),就會自動調(diào)用類里面的"__isset()"方法了幫我們完成這樣的操作,"__isset()"方法也能夠做成私有的。你可以在類里面加上下面這樣的代碼就能夠了:


private function __isset($nm){ echo "當(dāng)在類外部使用isset()函數(shù)測定私有成員$nm時(shí),自動調(diào)用<br>"; return isset($this->$nm); }

__unset()方法:看這個(gè)方法之前呢,我們也先來看1下"unset()"這個(gè)函數(shù),"unset()"這個(gè)函數(shù)的作用是刪除指定的變量且傳回true,參數(shù)為要刪除的變量。那末如果在1個(gè)對象外部去刪除對象內(nèi)部的成員屬性用"unset()"函數(shù)可不可以呢,也是分兩種情況,如果1個(gè)對象里面的成員屬性是公有的,就能夠使用這個(gè)函數(shù)在對象外面刪除對象的公有屬性,如果對象的成員屬性是私有的,我使用這個(gè)函數(shù)就沒有權(quán)限去刪除,但一樣如果你在1個(gè)對象里面加上"__unset()"這個(gè)方法,就能夠在對象的外部去刪除對象的私有成員屬性了。


在對象里面加上了"__unset()"這個(gè)方法以后,在對象外部使用"unset()"函數(shù)刪除對象內(nèi)部的私有成員屬性時(shí),自動調(diào)用"__unset()"函數(shù)來幫
我們刪除對象內(nèi)部的私有成員屬性,這個(gè)方法也能夠在類的內(nèi)部定義成私有的。在對象里面加上下面的代碼就能夠了:

private function __unset($nm){ echo "當(dāng)在類外部使用unset()函數(shù)來刪除私有成員時(shí)自動調(diào)用的<br>"; unset($this->$nm); }

最后,我們來看1個(gè)完全的實(shí)例:

<?php class Person { private $name; private $sex; private $age; public function __get($property_name) { if(isset($this->$property_name)) { return ($this->$property_name); } else { return (NULL); } } public function __set($property_name, $value) { $this->$property_name = $value; } public function __isset($nm) { echo "isset()函數(shù)測定私有成員時(shí),自動調(diào)用<br>"; return isset($this->$nm); } public function __unset($nm) { echo "當(dāng)在類外部使用unset()函數(shù)來刪除私有成員時(shí)自動調(diào)用的<br>"; unset($this->$nm); } } $p1 = new Person(); $p1->name = "this is a person name"; echo var_dump(isset($p1->name))."<br>"; echo $p1->name."<br>"; unset($p1->name); echo $p1->name;



輸出結(jié)果為:
isset()函數(shù)測定私有成員時(shí),自動調(diào)用 
bool(true) 
this is a person name
當(dāng)在類外部使用unset()函數(shù)來刪除私有成員時(shí)自動調(diào)用的

isset()函數(shù)測定私有成員時(shí),自動調(diào)用


最后最后 小煙還是要提示下你 這4個(gè)方法用法都是非常的靈活的 不要以為只能獲得類里面的私有變量 而且可以自由擴(kuò)大 獲得類里某個(gè)特定成員變量的值 或 其他類里面的值切記切記  不要被誤導(dǎo)!!

小煙 2014⑴2-03     轉(zhuǎn)載請注明出處 謝謝!


生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 国产99久久| 精品久久久久久久久久久院品网 | av在线免费不卡 | www,久久久| 一区二区三区在线电影 | 日韩高清国产一区在线 | 久久久久无码国产精品一区 | av片网| 国产精品三级在线观看 | 日韩欧美电影在线观看 | 精品成人av | 久久久蜜桃av | 欧美a∨一区二区三区久久黄 | 亚洲精品网站在线观看 | 国产农村乱色xxxx | 国产精品伦一区二区三级视频 | 国产在线精品91国自产拍免费 | 黄色裸体网站 | 永久免费在线观看 | 精品视频在线免费观看 | 久久久久久高清 | 美女又爽又黄免费 | 欧美一区视频 | 一区二区三区中文字幕 | 精品免费二区三区三区高中清不卡 | 国产精品久久久久久久午夜 | 免费网站黄 | 亚洲一区二区综合 | 网友自拍一区 | 国产午夜精品一区二区三区 | 日日操视频 | 久久久久国产视频 | 国产成人亚洲综合 | 久久av红桃一区二区小说 | 久久成人亚洲 | 精品美女 | 亚洲福利一区二区 | 99热在线观看 | 久久久久久久久国产 | 国产精品高潮呻吟久久 | 国产精品久久久久久久久潘金莲 |