PHP面向对象常见的关键字和魔术方法
?
?
在PHP5的面向?qū)ο蟪绦蛟O(shè)計(jì)中提供了一些常見的關(guān)鍵字,用來修飾類、成員屬性或成員方法,使他們具有特定的功能,例如final、static、const等關(guān)鍵字。還有一些比較實(shí)用的魔術(shù)方法,用來提高類或?qū)ο蟮膽?yīng)用能力,例如__call()、__toString()、__autoload等。
自己對部分關(guān)鍵字的理解:
Final:不讓兒子繼承夫類,也就是說不能夠?qū)Ω割愒谶M(jìn)行調(diào)用,否則將會(huì)出錯(cuò)。
①final關(guān)鍵字的應(yīng)用
final關(guān)鍵字的作用如下:
a.實(shí)用final標(biāo)識(shí)的類,不能被繼承。
b.在類中使用final標(biāo)識(shí)的成員方法,在子類中不能被覆蓋。
在下面的例子中聲明一個(gè)MyClass類,并使用final關(guān)鍵字標(biāo)識(shí),MyClass類就是最終的版本。不能有子類,也就不能對它進(jìn)行擴(kuò)展。代碼如下所示:
| 1 2 3 4 5 6 7 8 9 10 | <?php ????final?class?MyClass{???? //聲明一個(gè)類,并使用final關(guān)鍵字標(biāo)識(shí),使其不能有子類 ????????//成員略 ????} ????class?MyClass2 extends?MyClass{???? //聲明另一個(gè)類并試圖去繼承final標(biāo)識(shí)的類,結(jié)果出錯(cuò)。 ????????//成員略 ????} ?> |
該程序運(yùn)行后輸出的結(jié)果為:
Fatal error:Class MyClass2 may not inberit from final class(MyClass) //輸出錯(cuò)誤
在上例中,試圖用MyClass2類去繼承用final標(biāo)識(shí)的類MyClass時(shí),系統(tǒng)報(bào)錯(cuò)。同理,如果在類中的成員方法前加final關(guān)鍵字標(biāo)識(shí),則在子類中不能覆蓋它,被final標(biāo)識(shí)的方法也是最終版本。代碼如下所示:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <?php ????final?class?MyClass{???? //聲明一個(gè)類,并使用final關(guān)鍵字標(biāo)識(shí),使其不能有子類 ????????final?function?fun(){ ????????????//方法中的內(nèi)容略 ????????} ????} ????class?MyClass2 extends?MyClass{???? //聲明另一個(gè)類并試圖去繼承final標(biāo)識(shí)的類,結(jié)果出錯(cuò)。 ????????function?fun(){ ????????????//方法中的內(nèi)容略 ????????} ????} ?> |
該程序運(yùn)行后輸出的結(jié)果為:
Fatal error:Cannot ovferride final method MyClass::fun() //系統(tǒng)報(bào)錯(cuò)
在上面的代碼中聲明一個(gè)MyClass類,并在類中聲明一個(gè)成員方法fun(),在fun()方法前使用final關(guān)鍵字標(biāo)識(shí)。又聲明一個(gè)類MyClass2類去繼承MyClass類,并在子類MyClass2中聲明一個(gè)方法fun()試圖去覆蓋父類中被final標(biāo)識(shí)的fun()方法時(shí),系統(tǒng)會(huì)出現(xiàn)報(bào)錯(cuò)信息。
②static關(guān)鍵字的使用
使用static關(guān)鍵字可以將類中的成員標(biāo)識(shí)為靜態(tài)的,既可以用來標(biāo)識(shí)成員屬性,也可以用來標(biāo)識(shí)成員方法。以Person類為例,如果在person類中有一個(gè)“$country=’china’”的成員屬性,任何一個(gè)Person類的對象都會(huì)擁有自己的一份$country屬性,對象之間不會(huì)干擾。而static成員是作為整個(gè)類的屬性存在,如果將$country屬性使用static關(guān)鍵字標(biāo)識(shí),則不管通過Person類創(chuàng)建多少個(gè)對象(甚至可以是沒有對象),這個(gè)static成員總是唯一存在的,在多個(gè)對象之間共享的。因?yàn)槭褂胹tatic標(biāo)識(shí)的成員是屬于類的,所以與對象實(shí)例和其他的類無關(guān)。類的靜態(tài)屬性非常類似于函數(shù)的全局變量。類中的靜態(tài)成員時(shí)不需要對象而使用類名來直接訪問的,格式如下所示:
類名::靜態(tài)成員屬性名; ? ? ? ? ? ? ? ? ? ? ? ? ?//在類的外部和成員方法中都可以使用這種方式訪問靜態(tài)成員屬性
類名::靜態(tài)成員方法名(); ? ? ? ? ? ? ? ? ? ? //在類的外部和成員方法中都可以使用這種方式訪問靜態(tài)成員方法
在類聲明的成員方法中,因?yàn)殪o態(tài)成員時(shí)屬于類的,而不屬于任何對象,所以你不能用$this來引用它,而在php中給我們提供了self關(guān)鍵字,就是在類的成員方法中用來代表本類的關(guān)鍵字。格式如下所示:
self::靜態(tài)成員屬性名; ? ? ? ? ? ? ? ? ? ? ? //在類中的成員方法中使用這種方式訪問本類中的靜態(tài)成員屬性
self::靜態(tài)成員方法名(); ? ? ? ? ? ? ? ? ?//在類中的成員方法中使用這種方式訪問本類中的靜態(tài)成員方法
如果在類的外部訪問類中的靜態(tài)成員,可以使用對象引用和使用類名訪問,通常使用類名來訪問。如果在類內(nèi)部的成員方法中訪問其他的靜態(tài)成員,通常使用self的形式去訪問,最好不要直接使用類名稱。在下面的例子中聲明一個(gè)MyClass類,為了讓類中的count屬性可以在每個(gè)對象中共享,將其聲明為static成員,用來統(tǒng)計(jì)通過MyClass類一共創(chuà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 | <?php ????//聲明一個(gè)類,用來演示如何使用靜態(tài)成員 ????class?MyClass{???? ????????static?$count;?????? //在類中聲名一個(gè)靜態(tài)成員屬性count,用來統(tǒng)計(jì)對象唄創(chuàng)建的次數(shù) ????????function?__construct(){???????? //每次創(chuàng)建一個(gè)對象就會(huì)自動(dòng)調(diào)用這個(gè)構(gòu)造方法 ????????????self::$count++;????????? //使用self訪問靜態(tài)成員count,使其自增1 ????????} ????????static?function?getCount(){???????????? //聲明一個(gè)靜態(tài)方法,在類外面直接使用類名就可以調(diào)用 ????????????return?self::$count;???????? //在方法中使用self訪問靜態(tài)成員并返回 ????????} ????} ????MyClass::$count=0;??????????? //在類外面使用類名訪問類中的靜態(tài)成員,為其初始化賦值0 ????$myc1?= new?MyClass();?????? //通過MyClass類創(chuàng)建第一個(gè)對象,在構(gòu)造方法中將count累加1 ????$myc2?= new?MyClass();?????? //通過MyClass類創(chuàng)建第二個(gè)對象,在構(gòu)造方法中將count累加1 ????$myc3?= new?MyClass();?????? //通過MyClass類創(chuàng)建第三個(gè)對象,在構(gòu)造方法中將count累加1 ????echo?MyClass::getCount();?????? //在類外面使用類名訪問類中的靜態(tài)成員方法,獲取靜態(tài)屬性的值3 ????echo?$myc3?-> getCount();?????? //通過對象也可以訪問類中的靜態(tài)成員方法,獲取靜態(tài)屬性值3 ?> |
上例的MyClass類中,在構(gòu)造方法內(nèi)部和成員方法getCount()的內(nèi)部,都使用self訪問本類中使用static標(biāo)識(shí)為靜態(tài)的屬性count,并在類的外部使用類名訪問類中的靜態(tài)屬性。可以看到同一個(gè)類中的靜態(tài)成員在每個(gè)對象中共享,沒創(chuàng)建一個(gè)對象靜態(tài)屬性count就自增1,用來統(tǒng)計(jì)實(shí)例化對象的次數(shù)。
另外在使用靜態(tài)方法時(shí)需要注意,在靜態(tài)方法中只能訪問靜態(tài)成員。因?yàn)榉庆o態(tài)成員必須通過對象的引用才能訪問,通常是使用$this完成的。而靜態(tài)的方法在對象不存在的情況下也可以直接使用類名類訪問,沒有對象也就沒有$this引用,沒有了$this引用就不能訪問類中的非靜態(tài)成員,但是可以使用類名或self在非靜態(tài)方式中訪問靜態(tài)成員。
③const關(guān)鍵字
雖然const和static的功能不同,但使用的方法比較相似。在PHP中定義常量是通過調(diào)用define()函數(shù)來完成的,但要將類中的成員屬性定義為常量,則只能使用const關(guān)鍵字。將類中的成員屬性使用const關(guān)鍵字標(biāo)識(shí)為常量,其訪問的方式和靜態(tài)成員一樣,都可以通過類名或在成員的方法中使用self關(guān)鍵字訪問,也不能用對象來訪問。標(biāo)識(shí)常量的屬性是只讀的,不能重新賦值,所以在聲明常量時(shí)一定要給初值,因?yàn)闆]有其他方式后期為常量賦值。在下面的示例中演示了再類中如何聲明常量,并在成員方法中使用self和在類外面通過類名來訪問常量。代碼如下所示:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?php ????//聲明一個(gè)MyClass類,在類中聲明一個(gè)常量,和一個(gè)成員方法 ????class?MyClass{ ????????const?CONSTANT = 'CONSTANT value';?????? //使用const聲明一個(gè)常量,并直接附上初始值 ????????function?showConstant() { ????????????echo?self::CONSTANT."<BR>";????????????? //使用self訪問常量,注意常量前不要加"$" ????????} ????} ????echo?MyClass::CONSTANT . "<BR>";??????????? //在類外部使用類名稱訪問常量 ????$class?= new?MyClass();????????????????? //通過類MyClass創(chuàng)建一個(gè)對象引用$class ????$class?->showConstant();??????????? //調(diào)用對象中的方法 ?> |
④instanceof關(guān)鍵字
使用這個(gè)關(guān)鍵字可以確定一個(gè)對象是類的實(shí)例、類的子類,還是實(shí)現(xiàn)了某個(gè)特定接口,并進(jìn)行相應(yīng)的操作。例如,假設(shè)希望了解名為$man的對象是否為類Person的實(shí)例:
| 1 2 3 4 5 6 7 | <?php ????$man?=new?Person(); ????????... ????if($man?instanceof?Person) ????????echo?'$man 是Person類的實(shí)例對象'; ?> |
在這里有兩點(diǎn)值得注意。首先,類名沒有任何定界符(不使用引號(hào)),使用定界符將導(dǎo)致語法錯(cuò)誤。其次,如果比較失敗,腳本將退出執(zhí)行。instanceof關(guān)鍵字在同時(shí)處理多個(gè)對象時(shí)特別有用,例如,你可能要重復(fù)地調(diào)用某個(gè)函數(shù),但希望根據(jù)對象類型調(diào)整函數(shù)的行為。
⑤clone關(guān)鍵字克隆對象和__clone()魔術(shù)方法。
在PHP中可以根據(jù)現(xiàn)有對象克隆出一個(gè)完全一樣的對象,克隆以后原本和副本兩個(gè)對象完全獨(dú)立,互不干擾。在PHP5中使用“clone”關(guān)鍵字克隆對象,代碼如下所示:
| 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 | <?php ????class?Person{ ????????private?$name; ????????private?$sex; ????????private?$age; ????????//構(gòu)造方法在對象誕生時(shí)為成員屬性付初值 ????????function?__construct($name="",$sex="",$age=1){ ????????????$this?->name = $name; ????????????$this?->sex = $sex; ????????????$this?->age = $age; ????????} ????????//聲明此方法則在對象克隆時(shí)自動(dòng)調(diào)用,用來為新對象重新賦值 ????????function?__clone(){ ????????????$this?->name ="我是".$that?->name."的副本";???? //為副本對象中的name屬性重新賦值 ????????????$this?->age =10; ????????} ????????//一個(gè)成員方法用于打印出自己對象中全部的成員屬性值 ????????function?say() { ????????????echo?"我的名字:".$this?->name.",性別:".$this?->sex.",年齡:".$this?->age."<br>"; ????????} ????} ????$p1?= new?Person("張三","男",20); ????$p2?= new?clone?$p1; ????$p1?->say();????????? //調(diào)用源對象中的說話方法,打印原對象中全部屬性值 ????$p2?->say();????????? //調(diào)用副本對象中的說話方法,打印副本對象中全部屬性值 ?> |
改程序運(yùn)行后輸出的結(jié)果為:
我的名字:張三, 性別:男,年齡:20
我的名字:我是張三的副本, 性別:男,年齡:10 //副本對象中的name和age都被賦上新值
在上面的程序中一共創(chuàng)建了兩個(gè)對象,其中有一個(gè)對象是通過clone關(guān)鍵字克隆出來的副本。兩個(gè)對象完全獨(dú)立,如果需要對克隆后的副本對象在克隆時(shí)重新為成員屬性賦初值,則可以在類中聲明一個(gè)魔術(shù)方法“__clone()”。該方法時(shí)在對象克隆時(shí)自動(dòng)調(diào)用的,所以就可以通過此方法對克隆后的副本重新初始化。__clone()方法不需要任何參數(shù),該方法中自動(dòng)包含$this和$that兩個(gè)對象的引用,$this是副本對象的引用,$that是原本對象的引用。將上例中的代碼改寫一下,在類中添加魔術(shù)方法__clone(),為副本對象中的成員屬性重新初始化。代碼如下所示:
| 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?Person{ ????????private?$name; ????????private?$sex; ????????private?$age; ????????//構(gòu)造方法在對象誕生時(shí)為成員屬性付初值 ????????function?__construct($name="",$sex="",$age=1){ ????????????$this?->name = $name; ????????????$this?->sex = $sex; ????????????$this?->age = $age; ????????} ????????//一個(gè)成員方法用于打印出自己對象中全部的成員屬性值 ????????function?say() { ????????????echo?"我的名字:".$this?->name.",性別:".$this?->sex.",年齡:".$this?->age."<br>"; ????????} ????} ????$p1?= new?Person("張三","男",20); ????$p2?= new?clone?$p1; ????$p1?->say();????????? //調(diào)用源對象中的說話方法,打印原對象中全部屬性值 ????$p2?->say();????????? //調(diào)用副本對象中的說話方法,打印副本對象中全部屬性值 ?> |
⑥類中通用的方法__toString()
“魔術(shù)”方法__toString()是快速獲取對象的字符串標(biāo)識(shí)的最便捷的方式,它是在直接輸出對象引用時(shí)自動(dòng)調(diào)用的方法。通過前面的介紹我們知道,對象引用是一個(gè)指針,即存放對象在堆內(nèi)存中的首地址的變量。例如“$p=new Person()”語句中,$p就是一個(gè)對象的引用,如果直接使用echo輸出$p,則會(huì)輸出錯(cuò)誤。如果在類中添加了“__toString()”方法,則直接輸出對象的引用時(shí)就不會(huì)產(chǎn)生錯(cuò)誤,而是自動(dòng)調(diào)用了該方法,并輸出“__toString()”方法中返回的字符串。所以__toString()方法中一定要有一個(gè)字符串作為返回值,通常在此方法中返回字符串是使用對象中多個(gè)屬性值鏈接而成的。在下面的例子中聲明一個(gè)測試類,并在類中添加了__toString()方法,該方法中將成員屬性的值轉(zhuǎn)化為字符串后返回。代碼如下所示:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?php ????class?TestClass{ ????????private?$foo; ????????function?__construct($foo){ ????????????$this?-> foo = $foo; ????????} ????????public?function?__toString(){ ????????????return?$this?->foo; ????????} ????} ????$obj?= new?TestClass('hello'); ????echo?$obj; ?> |
⑦_(dá)_call()方法的應(yīng)用
如果嘗試調(diào)用對象中不存在的方法,一定會(huì)出現(xiàn)系統(tǒng)報(bào)錯(cuò),并推出程序不能繼續(xù)執(zhí)行。在PHP中,可以在類中添加一個(gè)魔術(shù)方法__call(),則調(diào)用對象中不存在的方法時(shí)就會(huì)自動(dòng)調(diào)用該方法,并且程序也可以繼續(xù)向下執(zhí)行。所以我們可以借助__call()方法提示用戶,例如,用戶調(diào)用的方法及需要的參數(shù)列表不存在。__call()方法需要兩個(gè)參數(shù):第一個(gè)參數(shù)是調(diào)用不存在的方法時(shí),接收這個(gè)方法名稱字符串;而參數(shù)列表則以數(shù)組的形式傳遞到__call()方法的第二個(gè)參數(shù)中。下面的例子聲明的類中添加了__call()方法,用來解決用戶調(diào)用對象中不存在的方法的情況。代碼如下所示:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?php ????class?TestClass{ ????????function?printHello(){ ????????????echo?"Hello<br>"; ????????} ????????function?__call($functionName,$arge) { ????????????echo?"你所調(diào)用的函數(shù):".$functionName."(參數(shù):"; ????????????print_r($arge); ????????????echo?")不存在!<br>\n"; ????????} ????} ????$obj?= new?TestClass(); ????$obj?-> myFun("one",2,"three");????????? //調(diào)用對象中不存在的方法,則自動(dòng)調(diào)用了對象中的__call()方法 ????$obj?-> otherFun(8,9);?????????????????? //調(diào)用對象中不存在的方法,則自動(dòng)調(diào)用了對象中的__call()方法 ????$obj?-> printHello();???????????? //調(diào)用對象中存在的方法,可以成功調(diào)用 ?> |
該程序運(yùn)行后輸出的結(jié)果為:
你所調(diào)用的函數(shù):myFun(參數(shù):Array([0]=>one ,[1]=>2,[2]=>three))不存在!
你所調(diào)用的函數(shù):myFun(參數(shù):Array([0]=>8 ,[1]=>9))不存在!
Hello
⑧__autoload()自動(dòng)加載類
在設(shè)計(jì)面向?qū)ο蟮某绦蜷_發(fā)時(shí),通常為每個(gè)類的定義都單獨(dú)建立一個(gè)PHP源文件。當(dāng)你嘗試使用一個(gè)未定義的類時(shí),PHP會(huì)報(bào)告一個(gè)致命錯(cuò)誤。可以用include包含一個(gè)類鎖子啊的源文件,畢竟你知道要用哪個(gè)類。如果一個(gè)頁面需要使用多個(gè)類,就不得不在腳本頁面開頭編寫一個(gè)長長的包含文件的列表,將本頁面需要的類全部包含進(jìn)來。這樣處理不僅繁瑣,而且容易出錯(cuò)。
PHP提供了類的自動(dòng)加載功能,這可以節(jié)省編程的事件。當(dāng)你嘗試使用一個(gè)PHP沒有組織到的類時(shí),它會(huì)尋找一個(gè)__autoload()的全局函數(shù)(不是在類中聲明的函數(shù))。如果存在這個(gè)函數(shù),PHP會(huì)用一個(gè)參數(shù)來調(diào)用它,參數(shù)即類的名稱。
在下例中說明了__autoload()是如何使用的,它假設(shè)當(dāng)前目錄下每個(gè)文件對應(yīng)一個(gè)類,當(dāng)腳本嘗試來創(chuàng)建一個(gè)類User的實(shí)例時(shí),PHP會(huì)自動(dòng)執(zhí)行__autoload()函數(shù)。腳本假設(shè)user.class.php中定義有User類,不管調(diào)用時(shí)是大寫還是小寫,PHP將返回名稱小寫。所以你做項(xiàng)目時(shí),在組織定義類的文件名時(shí),需要按照一定的規(guī)則,一定要以類名為中心,也可以加上同意的前綴或后最形成文件名,比如classname.class.php、xxx_classname.php、lassname_xxx.php或是classname.php等,推薦類文件名使用“classname.class.php”格式。代碼如下所示:
| 1 2 3 4 5 6 7 8 | <?php ????function?__autoload($className){ ????????include(strtolower($className)."class.php"); ????} ????$obj?= new?User();???????? //User類不存在則自動(dòng)調(diào)用__autoload()函數(shù),將類名User作為參數(shù)傳入 ????$obj2?= new?Shop();??????? //Shop類不存在則自動(dòng)調(diào)用__autoload()函數(shù),將類名Shop作為參數(shù)傳入 ?> |
⑨serialize()對象串行化
對象通過寫出描述自己狀態(tài)的數(shù)值來記錄自己,這個(gè)過程稱對象的串行化。串行化就是把整個(gè)對象轉(zhuǎn)化為二進(jìn)制字符串。在兩種情況下必須把對象串行化,如下所示:
a.對象需要在網(wǎng)絡(luò)中傳輸時(shí),將對象串行化成二進(jìn)制串后在網(wǎng)絡(luò)中傳輸。
b.對象需要持久保存時(shí),將對象串行化后寫入文件或是數(shù)據(jù)庫中。
使用serialize()函數(shù)來串行化一個(gè)對象,把對象轉(zhuǎn)化為二進(jìn)制的字符串。serialize()函數(shù)需要一個(gè)參數(shù)就是對象的引用名,返回值為一個(gè)對象被串行化后的字符串。另一個(gè)是反串行化,就是把對象串行化后轉(zhuǎn)化的二進(jìn)制字符串再轉(zhuǎn)化為對象,我們使用unserialize()函數(shù)來飯串行化一個(gè)對象。
在PHP5中還有兩個(gè)魔術(shù)方法__sleep()和__wakeup()可以使用。在調(diào)用serialize()函數(shù)將對象串行化時(shí),會(huì)自動(dòng)調(diào)用對象中的__sleep()方法,用來將對象中的部分成員串行化。在調(diào)用unserialize()函數(shù)飯串行化對象時(shí),則會(huì)自動(dòng)調(diào)用對象中的__wakeup()方法,用來在二進(jìn)制串重新組成一個(gè)對象時(shí),為新對象中的成員屬性重新初始化。
__sleep()函數(shù)不需要接收任何參數(shù),但需要返回一個(gè)數(shù)組,在數(shù)組中包含需要串行化的屬性。未被包含在數(shù)組中的屬性將在串行化時(shí)被忽略。如果沒有在類中聲明sleep()方法,對象中的所有屬性都將被串行化。代碼如下所示:
| 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 | <?php ????class?Person { ????????private?$name; ????????private?$sex; ????????private?$age; ????????function?__construct($name="",$sex="",$age=1){ ????????????$this?->name = $name; ????????????$this?->sex = $sex; ????????????$this?->age = $age; ????????} ????????function?say() { ????????????echo?"我的名字:".$this?->name.",性別:".$this?->sex.",年齡:".$this?->age."<br>"; ????????} ????????//在類中添加此方法,在串行化時(shí)自動(dòng)調(diào)用并返回?cái)?shù)組 ????????function?__sleep(){ ????????????$arr?= array("name","age");????? //數(shù)組中的成員$name和$age將被串行化,成員$sex則被忽略 ????????????return($arr); ????????} ????????//在反串行化對象時(shí)自動(dòng)調(diào)用該方法,沒有參數(shù)也沒有返回值 ????????function?__wakeup(){ ????????????$this?->age = 40;??????? //在重新組織對象時(shí),為新對象中的$age屬性重新賦值 ????????} ????} ????$person1?= new?Person("張三","男",20);???? ????//把一個(gè)對象串行化,返回一個(gè)字符串,調(diào)用了__sleep()方法,忽略沒在數(shù)組中的屬性$sex ????$person_string=serialize($person_string); ????echo?$person_string."<br>"; ????//反串行化對象,并自動(dòng)調(diào)用了__wakeup()方法重新為對象中的$age屬性賦值 ????$person2?= unserialize($person_string);?????????? //反串行化對象形成對象$P2重新賦值$age為40 ????$person2?->say(); ?> |
總結(jié)
以上是生活随笔為你收集整理的PHP面向对象常见的关键字和魔术方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Java核心技术卷】I/O详析
- 下一篇: php数组操作集锦- 掌握了数组操作,