面向对象的设计模式及魔术函数
1.工廠模式:?????
a.概述:???? 工廠模式主要是為創(chuàng)建對(duì)象提供過渡接口,以便將創(chuàng)建對(duì)象的具體過程(new 關(guān)鍵字和具體的構(gòu)造器)隱藏起來。用一個(gè)工廠方法來替代,對(duì)外提供的只是一個(gè)工廠方法,達(dá)到提高靈活性的目的。?
?????b.優(yōu)點(diǎn):?
?????????? 1.隱藏了new關(guān)鍵字和構(gòu)造器?
?????????? 2.降低了這個(gè)對(duì)象與別的類之間的耦合度,提高了程序的可擴(kuò)展性。?
???????????? 原因:當(dāng)子類被別的類替代,或者構(gòu)造器的參數(shù)發(fā)生變化的時(shí)候,只需改動(dòng)工廠方法內(nèi)的new即可,改動(dòng)量降到了最低,而如果不用工廠模式,而是直接用new關(guān)鍵字的話,需要改動(dòng)的地方就很多了?
?????????? 3.把對(duì)象的設(shè)計(jì)和實(shí)現(xiàn)分割開來,從而代碼擴(kuò)展性強(qiáng)、靈活性高。?
???? c.工廠模式的使用范圍:?
?????? 當(dāng)遇到下面的情況時(shí),開發(fā)人員可以考慮采用工廠模式:?
?????? * 在編碼時(shí)不能預(yù)見需要?jiǎng)?chuàng)建哪一個(gè)種類的實(shí)例。?
?????? * 一個(gè)類使用它的子類來創(chuàng)建對(duì)象。?
?????? * 開發(fā)人員不希望創(chuàng)建了那個(gè)類的實(shí)例以及如何創(chuàng)建實(shí)例的信息暴露給外部程序。?
????? 除了上面提到的例子,工廠模式的實(shí)現(xiàn)方式還允許有一些小小的變化,例如:?
?????? * 基類可以是一個(gè)抽象類,在這種情況下,工廠類必須返回一個(gè)非抽象類。?
?????? * 基類提供了一些缺省方法,只有當(dāng)這些缺省方法不能滿足特殊需求的情況下才能在子類中重寫這些方法。?
?????? * 可以直接通過傳遞給工廠類的參數(shù)決定應(yīng)該返回哪一個(gè)子類的實(shí)例。?
???? d. 使用工廠模式,它的設(shè)計(jì)期于運(yùn)行期的對(duì)象不同,這樣就增強(qiáng)了代碼的可擴(kuò)展性。?
??????? 它把構(gòu)造器隱藏了起來,降低了代碼的耦合度,增強(qiáng)了代碼的復(fù)用性。?
??????? 工廠模式與new的比較:如果使用new關(guān)鍵字的話,那么如果這個(gè)類的對(duì)象在很多的地方用到,必須要使用多次的new操作,這樣容易引起代碼的重復(fù)使用,如果需要改動(dòng)或者替換成這個(gè)類的子類對(duì)象,那么,就需要把執(zhí)行了new操作的所有地方都要改,比較麻煩。而工廠模式,因?yàn)樗媪藰?gòu)造器和new關(guān)鍵字,而且,它是使用面向接口的,所以,需要這個(gè)類的對(duì)象的時(shí)候,只需要調(diào)用這個(gè)方法就可以了,如果,需要改動(dòng)或者替換成這個(gè)類的子類對(duì)象。只要修改這個(gè)工廠里面的內(nèi)容,而其他的地方都不需要改動(dòng)。?
??????????工廠模式的結(jié)構(gòu)是:用一個(gè)方法來代替new關(guān)鍵字和構(gòu)造器。?
?
工廠模式相當(dāng)于創(chuàng)建實(shí)例對(duì)象的new,經(jīng)常要根據(jù)類Class生成實(shí)例對(duì)象,如A a=new A() 工廠模式也是用來創(chuàng)建實(shí)例對(duì)象的,工廠模式是現(xiàn)今最常用的模式,在Java程序系統(tǒng)中隨處可見。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | <?php class?YunSuan { ????public?$a; ????public?$b; ????//寫一個(gè)空方法,讓子類繼承重寫父類 ????public?function?Suan() ????{ ????????? ????} } class?Jia?extends?YunSuan { ????public?function?Suan() ????{ ????????return?$this->a+$this->b; ????}?? } //工廠模式 //工廠類:生產(chǎn)對(duì)象 class?GongChang { ????static?function?ShengChan($ysf) ????{ ????????switch($ysf) ????????{ ????????????case?"+": ????????????????return?new?Jia(); ????????????????break; ????????????case?"-": ????????????????return?new?Jian(); ????????????????break; ????????} ????????????? ????} } $jia?= GongChang::ShengChan("+"); $jia->a = 10; $jia->b = 10; echo?$jia->Suan(); //結(jié)果為20 |
?2. ?單例模式:?
??
?? 一、單例模式的四大特征:?
??懶漢式:?
??????? 1。聲明一個(gè)私有的,靜態(tài)的本類對(duì)象,但并不在聲明的時(shí)候就初始化,因此,它? 的值為null。?
??????? 2。私有化構(gòu)造器?
??????? 3。對(duì)外提供一個(gè)全局的,共有的,靜態(tài)的,唯一的方法,用來獲得該實(shí)例,但注意的是:必須要手動(dòng)保持線程同步(synchronized)?
??????? 4.在該方法里,判斷對(duì)象是否為null,如果是null的話,表示這個(gè)類還沒有被實(shí)例化,就會(huì)初始化這個(gè)對(duì)象,再返回如果不是null的話,就直接返回。?
??餓漢式:?
??????? 1.聲明一個(gè)私有的,靜態(tài)的本類對(duì)象,并在聲明的時(shí)候就初始化?
??????? 2.私有構(gòu)造器?
??????? 3.對(duì)外提供一個(gè)全局的,共有的,靜態(tài)的,唯一的方法,用來獲得該實(shí)例(餓漢式線程本身就是同步的)?
??????? 4.在該方法里,直接返回該對(duì)象即可?
??? 從資源利用效率角度來講,這個(gè)比懶漢式單例類稍微差些。從速度和反應(yīng)時(shí)間角度來講,則比懶漢式單例類稍好些。?
????
???? 二、它能解決什么問題:?
????? 它確保一個(gè)類在java虛擬機(jī)里只有一個(gè)實(shí)例,使一個(gè)類只有一個(gè)對(duì)象,整個(gè)系統(tǒng)共享這個(gè)對(duì)象。?
???? 三、什么時(shí)候使用懶漢式和餓漢式:?
???????? 1。 在使用的幾率很少的情況下使用懶漢式。 --用的時(shí)候?qū)嵗?
???????? 2。 而使用的幾率很高的話就用餓漢式。--一開始就初始化實(shí)例?
???? 四、單例模式的好處:?
???????? 整個(gè)系統(tǒng)中的所有的類共用一個(gè)實(shí)例化對(duì)象,這樣可以有效的節(jié)省資源。?
優(yōu)點(diǎn):
1. 改進(jìn)系統(tǒng)的設(shè)計(jì)
2. 是對(duì)全局變量的一種改進(jìn)
缺點(diǎn):
1. 難于調(diào)試
2. 隱藏的依賴關(guān)系
3. 無法用錯(cuò)誤類型的數(shù)據(jù)覆寫一個(gè)單例
單例模式的目的是將類只能造一個(gè)對(duì)象出來
單例模式的主要方法是:將構(gòu)造 變成私有的-->做一個(gè)靜態(tài)的生成對(duì)象的方法-->造一個(gè)靜態(tài)的存儲(chǔ)對(duì)象-->return 靜態(tài)的對(duì)象
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <?php class?DBDA { ????//連接數(shù)據(jù)庫的類讓他只能造一個(gè)對(duì)象出來,在不加任何控制的時(shí)候可以造很多的類出來 ????//在造對(duì)象的時(shí)候會(huì)調(diào)用構(gòu)造的方法, ????//把構(gòu)造方法變成私有的就可以可以控制住 ????public?static?$dx;//存儲(chǔ)對(duì)象 ????//把構(gòu)造做為私有 ????private?function?__construct() ????{ ????????????? ????}?? ????//生成對(duì)象 ????static?function?DuiXiang() ????{ ????????if(empty(self::$dx)) ????????{ ????????????self::$dx?=?new?DBDA();?//調(diào)用靜態(tài)對(duì)象 ????????} ????????return?self::$dx; ????} } //DBDA::DuiXiang();//調(diào)用靜態(tài)方法 $db?= DBDA::DuiXiang(); |
面向?qū)ο蟮脑O(shè)計(jì)原則:
OOD基本上有6大原則,而實(shí)際上都是互補(bǔ)的,也就是說一些原則需要利用另一些原則來實(shí)現(xiàn)自己。6大原則如下:
1) Open-Close Principle(OCP),開-閉原則,講的是設(shè)計(jì)要對(duì)擴(kuò)展有好的支持,而對(duì)修改要嚴(yán)格限制。這是最重要也是最為抽象的原則,基本上我們所說的Reusable Software既是基于此原則而開發(fā)的。其他的原則也是對(duì)它的實(shí)現(xiàn)提供了路徑。
2) Liskov Substituition Principle(LSP),里氏代換原則,很嚴(yán)格的原則,規(guī)則是“子類必須能夠替換基類,否則不應(yīng)當(dāng)設(shè)計(jì)為其子類。”也就是說,子類只能去擴(kuò)展基類,而不是隱藏或覆蓋基類。
3) Dependence Inversion Principle(DIP),依賴倒換原則,“設(shè)計(jì)要依賴于抽象而不是具體化”。換句話說就是設(shè)計(jì)的時(shí)候我們要用抽象來思考,而不是一上來就開始劃分我需要哪些哪些類,因?yàn)檫@些是具體。這樣做有什么好處呢?人的思維本身實(shí)際上就是很抽象的,我們分析問題的時(shí)候不是一下子就考慮到細(xì)節(jié),而是很抽象的將整個(gè)問題都構(gòu)思出來,所以面向抽象設(shè)計(jì)是符合人的思維的。另外這個(gè)原則會(huì)很好的支持OCP,面向抽象的設(shè)計(jì)使我們能夠不必太多依賴于實(shí)現(xiàn),這樣擴(kuò)展就成為了可能,這個(gè)原則也是另一篇文章《Design by Contract》的基石。
4) Interface Segregation Principle(ISP),接口隔離原則,“將大的接口打散成多個(gè)小接口”,這樣做的好處很明顯,我不知道有沒有必要再繼續(xù)描述了,為了節(jié)省篇幅,實(shí)際上我對(duì)這些原則只是做了一個(gè)小總結(jié),如果有需要更深入了解的話推薦看《Java與模式》,MS MVP的一:本巨作!^_^
5) 單一職責(zé):一個(gè)類的功能盡量單一,降低耦合
6) Law of Demeter or Least Knowlegde Principle(LoD or LKP),迪米特法則或最少知識(shí)原則,這個(gè)原則首次在Demeter系統(tǒng)中得到正式運(yùn)用,所以定義為迪米特法則。它講的是“一個(gè)對(duì)象應(yīng)當(dāng)盡可能少的去了解其他對(duì)象”。也就是又一個(gè)關(guān)于如何松耦合(Loosely-Coupled)的法則。
好了,以上是6大原則(或法則)的介紹,對(duì)這些原則的深入研究正是如何得到設(shè)計(jì)模式的道路。在進(jìn)行了深入了解后我們就可以開始看看設(shè)計(jì)模式了,設(shè)計(jì)模式正是對(duì)這些法則的應(yīng)用,著名的設(shè)計(jì)模式有四人幫(Gang of Four,GoF)的23個(gè)模式,除此之外還有很多其他的一些著名模式,大家可以慢慢研究,如果能自己產(chǎn)出一兩個(gè)模式的話那就太好了,證明你也是高手了!^_^
魔術(shù)函數(shù)
1.__construct()
PHP 構(gòu)造方法 __construct() 允許在實(shí)例化一個(gè)類之前先執(zhí)行構(gòu)造方法。
構(gòu)造方法
構(gòu)造方法是類中的一個(gè)特殊方法。當(dāng)使用 new 操作符創(chuàng)建一個(gè)類的實(shí)例時(shí),構(gòu)造方法將會(huì)自動(dòng)調(diào)用,其名稱必須是 __construct() 。
在一個(gè)類中只能聲明一個(gè)構(gòu)造方法,而是只有在每次創(chuàng)建對(duì)象的時(shí)候都會(huì)去調(diào)用一次構(gòu)造方法,不能主動(dòng)的調(diào)用這個(gè)方法,所以通常用它執(zhí)行一些有用的初始化任務(wù)。該方法無返回值。
語法:
function __construct(arg1,arg2,...) {...... }例子:
<?php class Person {var $name;var $age;//定義一個(gè)構(gòu)造方法初始化賦值function __construct($name, $sex, $age) {$this->name=$name;$this->age=$age;}function say() {echo "我的名字叫:".$this->name."<br />";echo "我的年齡是:".$this->age;} }$p1=new Person("張三", 20); $p1->say(); ?>運(yùn)行該例子,輸出:
我的名字叫:張三 的年齡是:20在該例子中,通過構(gòu)造方法對(duì)對(duì)象屬性進(jìn)行初始化賦值。
提示
PHP 不會(huì)在本類的構(gòu)造方法中再自動(dòng)的調(diào)用父類的構(gòu)造方法。要執(zhí)行父類的構(gòu)造方法,需要在子類的構(gòu)造方法中調(diào)用 parent::__construct() 。
2。__destruct()?
當(dāng)刪除一個(gè)對(duì)象或?qū)ο蟛僮鹘K止時(shí)被調(diào)用。
PHP 析構(gòu)方法 __destruct() 允許在銷毀一個(gè)類之前執(zhí)行執(zhí)行析構(gòu)方法。
析構(gòu)方法
與構(gòu)造方法對(duì)應(yīng)的就是析構(gòu)方法,析構(gòu)方法允許在銷毀一個(gè)類之前執(zhí)行的一些操作或完成一些功能,比如說關(guān)閉文件、釋放結(jié)果集等。析構(gòu)函數(shù)不能帶有任何參數(shù),其名稱必須是 __destruct() 。
語法:
function __destruct() {...... }我們?cè)谏厦娴睦又屑尤胂旅娴奈鰳?gòu)方法:
//定義一個(gè)析構(gòu)方法 function __destruct() {echo "再見".$this->name; }再次運(yùn)行該例子,輸出:
我的名字叫:張三 的年齡是:20 再見張三提示
3。__call()?
對(duì)象調(diào)用某個(gè)方法,?
若方法存在,則直接調(diào)用;?
若不存在,則會(huì)去調(diào)用__call函數(shù)。
__call() 方法用于監(jiān)視錯(cuò)誤的方法調(diào)用。
__call()(Method overloading)
為了避免當(dāng)調(diào)用的方法不存在時(shí)產(chǎn)生錯(cuò)誤,可以使用 __call() 方法來避免。該方法在調(diào)用的方法不存在時(shí)會(huì)自動(dòng)調(diào)用,程序仍會(huì)繼續(xù)執(zhí)行下去。
語法:
function __call(string $function_name, array $arguments) {...... }該方法有兩個(gè)參數(shù),第一個(gè)參數(shù) $function_name 會(huì)自動(dòng)接收不存在的方法名,第二個(gè) $args 則以數(shù)組的方式接收不存在方法的多個(gè)參數(shù)。
在類里面加入:
function __call($function_name, $args) {echo "你所調(diào)用的函數(shù):$function_name(參數(shù):<br />";var_dump($args);echo ")不存在!"; }當(dāng)調(diào)用一個(gè)不存在的方法時(shí)(如 test() 方法):
$p1=new Person(); $p1->test(2,"test");輸出的結(jié)果如下:
你所調(diào)用的函數(shù):test(參數(shù): array(2) {[0]=>int(2)[1]=>string(4) "test" } )不存在!4。__get()?
讀取一個(gè)對(duì)象的屬性時(shí),?
若屬性存在,則直接返回屬性值;?
若不存在,則會(huì)調(diào)用__get函數(shù)
- __set()?方法用于設(shè)置私有屬性值。
實(shí)際應(yīng)用中,經(jīng)常會(huì)把類的屬性設(shè)置為私有(private),那么需要對(duì)屬性進(jìn)行訪問時(shí),就會(huì)變得麻煩。雖然可以將對(duì)屬性的訪問寫成一個(gè)方法來實(shí)現(xiàn),但 PHP 提供了一些特殊方法來方便此類操作。
__set()
__set() 方法用于設(shè)置私有屬性值:
function __set($property_name, $value) { $this->$property_name = $value; }在類里面使用了 __set() 方法后,當(dāng)使用 $p1->name = "張三"; 這樣的方式去設(shè)置對(duì)象私有屬性的值時(shí),就會(huì)自動(dòng)調(diào)用 __set() 方法來設(shè)置私有屬性的值。
5。__set()?
設(shè)置一個(gè)對(duì)象的屬性時(shí),?
若屬性存在,則直接賦值;?
若不存在,則會(huì)調(diào)用__set函數(shù)。
- __get()?方法用于獲取私有屬性值。
__get()
__get() 方法用于獲取私有屬性值:
function __set($property_name, $value) { return isset($this->$property_name) ? $this->$property_name : null; }例子:
<?php class Person {private $name;private $sex;private $age;//__set()方法用來設(shè)置私有屬性function __set($property_name, $value) { echo "在直接設(shè)置私有屬性值的時(shí)候,自動(dòng)調(diào)用了這個(gè) __set() 方法為私有屬性賦值<br />";$this->$property_name = $value; }//__get()方法用來獲取私有屬性function __get($property_name) { echo "在直接獲取私有屬性值的時(shí)候,自動(dòng)調(diào)用了這個(gè) __get() 方法<br />";return isset($this->$property_name) ? $this->$property_name : null;} }$p1=new Person(); //直接為私有屬性賦值的操作, 會(huì)自動(dòng)調(diào)用 __set() 方法進(jìn)行賦值 $p1->name = "張三"; //直接獲取私有屬性的值, 會(huì)自動(dòng)調(diào)用 __get() 方法,返回成員屬性的值 echo "我的名字叫:".$p1->name; ?>運(yùn)行該例子,輸出:
在直接設(shè)置私有屬性值的時(shí)候,自動(dòng)調(diào)用了這個(gè) __set() 方法為私有屬性賦值 在直接獲取私有屬性值的時(shí)候,自動(dòng)調(diào)用了這個(gè) __get() 方法 我的名字叫:張三6。__toString()?
打印一個(gè)對(duì)象的時(shí)被調(diào)用。如echo $obj;或print $obj;
7。__clone()?
克隆對(duì)象時(shí)被調(diào)用。如:$t=new Test();$t1=clone $t;
clone 關(guān)鍵字用于克隆一個(gè)完全一樣的對(duì)象,__clone() 方法來重寫原本的屬性和方法。
對(duì)象克隆
有的時(shí)候我們需要在一個(gè)項(xiàng)目里面使用兩個(gè)或多個(gè)一樣的對(duì)象,如果使用 new 關(guān)鍵字重新創(chuàng)建對(duì)象,再賦值上相同的屬性,這樣做比較煩瑣而且也容易出錯(cuò)。PHP 提供了對(duì)象克隆功能,可以根據(jù)一個(gè)對(duì)象完全克隆出一個(gè)一模一樣的對(duì)象,而且克隆以后,兩個(gè)對(duì)象互不干擾。
使用關(guān)鍵字 clone 來克隆對(duì)象。語法:
$object2 = clone $object;例子:
<?php class Person {private $name;private $age;function __construct($name, $age) {$this->name=$name;$this->age=$age;}function say() {echo "我的名字叫:".$this->name."<br />";echo "我的年齡是:".$this->age;} }$p1 = new Person("張三", 20); $p2 = clone $p1; $p2->say(); ?>運(yùn)行例子,輸出:
我的名字叫:張三 我的年齡是:20__clone()
如果想在克隆后改變?cè)瓕?duì)象的內(nèi)容,需要在類中添加一個(gè)特殊的 __clone() 方法來重寫原本的屬性和方法。__clone() 方法只會(huì)在對(duì)象被克隆的時(shí)候自動(dòng)調(diào)用。
例子:
<?php class Person {private $name;private $age;function __construct($name, $age) {$this->name = $name;$this->age = $age;}function say() {echo "我的名字叫:".$this->name;echo " 我的年齡是:".$this->age."<br />";}function __clone() {$this->name = "我是假的".$this->name;$this->age = 30;} }$p1 = new Person("張三", 20); $p1->say(); $p2 = clone $p1; $p2->say(); ?>運(yùn)行例子,輸出:
我的名字叫:張三 我的年齡是:20 我的名字叫:我是假的張三 我的年齡是:308。__sleep()?
serialize之前被調(diào)用。若對(duì)象比較大,想刪減一點(diǎn)東東再序列化,可考慮一下此函數(shù)。
9。__wakeup()?
unserialize時(shí)被調(diào)用,做些對(duì)象的初始化工作。
10。__isset()?
檢測(cè)一個(gè)對(duì)象的屬性是否存在時(shí)被調(diào)用。如:isset($c->name)。
__isset()
__isset() 方法用于檢測(cè)私有屬性值是否被設(shè)定。
如果對(duì)象里面成員是公有的,可以直接使用 isset() 函數(shù)。如果是私有的成員屬性,那就需要在類里面加上一個(gè) __isset() 方法:
private function __isset($property_name) {return isset($this->$property_name); }這樣當(dāng)在類外部使用 isset() 函數(shù)來測(cè)定對(duì)象里面的私有成員是否被設(shè)定時(shí),就會(huì)自動(dòng)調(diào)用 __isset() 方法來檢測(cè)。
11。__unset()?
unset一個(gè)對(duì)象的屬性時(shí)被調(diào)用。如:unset($c->name)。
__unset()
__unset() 方法用于刪除私有屬性。
同 isset() 函數(shù)一樣,unset() 函數(shù)只能刪除對(duì)象的公有成員屬性,當(dāng)要?jiǎng)h除對(duì)象內(nèi)部的私有成員屬性時(shí),需要使用__unset() 方法:
private function __unset($property_name) {unset($this->$property_name); }12。__set_state()?
調(diào)用var_export時(shí),被調(diào)用。用__set_state的返回值做為var_export的返回值。
13。__autoload()?
實(shí)例化一個(gè)對(duì)象時(shí),如果對(duì)應(yīng)的類不存在,則該方法被調(diào)用。
__autoload() 方法用于自動(dòng)加載類。
__autoload()
在實(shí)際項(xiàng)目中,不可能把所有的類都寫在一個(gè) PHP 文件中,當(dāng)在一個(gè) PHP 文件中需要調(diào)用另一個(gè)文件中聲明的類時(shí),就需要通過 include 把這個(gè)文件引入。不過有的時(shí)候,在文件眾多的項(xiàng)目中,要一一將所需類的文件都 include 進(jìn)來,一個(gè)很大的煩惱是不得不在每個(gè)類文件開頭寫一個(gè)長(zhǎng)長(zhǎng)的包含文件的列表。我們能不能在用到什么類的時(shí)候,再把這個(gè)類所在的 php 文件導(dǎo)入呢?
為此,PHP 提供了 __autoload() 方法,它會(huì)在試圖使用尚未被定義的類時(shí)自動(dòng)調(diào)用。通過調(diào)用此函數(shù),腳本引擎在 PHP 出錯(cuò)失敗前有了最后一個(gè)機(jī)會(huì)加載所需的類。
__autoload() 方法接收的一個(gè)參數(shù),就是欲加載的類的類名,所以這時(shí)候需要類名與文件名對(duì)應(yīng),如 Person.php ,對(duì)應(yīng)的類名就是 Pserson 。
例子:
Pserson.php
<?php <?php class Person {private $name;private $age;function __construct($name, $age) {$this->name = $name;$this->age = $age;}function say() {echo "我的名字叫:".$this->name."<br />";echo " 我的年齡是:".$this->age;} } ?>test.php
<?php function __autoload($class_name) {require_once $class_name.'.php'; }//當(dāng)前頁面 Pserson 類不存在則自動(dòng)調(diào)用 __autoload() 方法,傳入?yún)?shù) Person $p1 = new Person("張三","20"); $p1 -> say(); ?>運(yùn)行 test.php ,輸出:
我的名字叫:張三 我的年齡是:20魔術(shù)常量
1。__LINE__?
返回文件中的當(dāng)前行號(hào)。
2。__FILE__?
返回文件的完整路徑和文件名。如果用在包含文件中,則返回包含文件名。自 PHP 4.0.2 起,__FILE__ 總是包含一個(gè)絕對(duì)路徑,而在此之前的版本有時(shí)會(huì)包含一個(gè)相對(duì)路徑。
3。__FUNCTION__?
返回函數(shù)名稱(PHP 4.3.0 新加)。自 PHP 5 起本常量返回該函數(shù)被定義時(shí)的名字(區(qū)分大小寫)。在 PHP 4 中該值總是小寫字母的。
4。__CLASS__?
返回類的名稱(PHP 4.3.0 新加)。自 PHP 5 起本常量返回該類被定義時(shí)的名字(區(qū)分大小寫)。在 PHP 4 中該值總是小寫字母的。
5。__METHOD__?
返回類的方法名(PHP 5.0.0 新加)。返回該方法被定義時(shí)的名字(區(qū)分大小寫)。
?
(1)初識(shí)魔術(shù)方法
Php5.0發(fā)布以來為我們提供了很多面向?qū)ο蟮奶匦?尤其是為我們提供了好多易用的魔術(shù)方法,這些魔術(shù)方法可以讓我們簡(jiǎn)化我們的編碼,更好的設(shè)計(jì)我們的系統(tǒng)。今天我們就來認(rèn)識(shí)下php5.0給我們提供的魔術(shù)方法。
總結(jié)
以上是生活随笔為你收集整理的面向对象的设计模式及魔术函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MYSQL 索引相关
- 下一篇: 用.NET CF进行HardReset?