PHP筆記:接口,自動加載機(jī)制,序列化與反序列化,對象的克隆_第1頁
PHP筆記:接口,自動加載機(jī)制,序列化與反序列化,對象的克隆_第2頁
PHP筆記:接口,自動加載機(jī)制,序列化與反序列化,對象的克隆_第3頁
PHP筆記:接口,自動加載機(jī)制,序列化與反序列化,對象的克隆_第4頁
PHP筆記:接口,自動加載機(jī)制,序列化與反序列化,對象的克隆_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、PHP接口結(jié)構(gòu),interface接口:指的是對象的公共方法也有一種接口技術(shù),定義一個接口結(jié)構(gòu),用于限制一個類(對象)應(yīng)該具備的公共方法(接口方法)!語法:使用關(guān)鍵字 interface 聲明一個接口結(jié)構(gòu)!聲明:interface i_Goods public function sayName();public function sayPrice();注意:接口內(nèi)只能包含 公共的抽象方法(不完整的方法)!使用:使一個類來實(shí)現(xiàn)接口內(nèi)定義的所有接口方法(公共方法)實(shí)現(xiàn):使用關(guān)鍵字 implements 來完成interface i_Goods public function sayName();p

2、ublic function sayPrice();abstract class Godds implements i_Goods class Shop implements i_Goods public function sayName() public function sayPrice() 明顯,實(shí)現(xiàn)接口結(jié)構(gòu)的類,就包含了接口中定義的抽象方法,兩個選擇:1:定義成抽象類2:實(shí)現(xiàn)接口方法類似于抽象類,比較與接口的區(qū)別:1:抽象類與普通類之間是繼承關(guān)系 普通類繼承抽象類,第一,可以得到抽象類中的已有的常規(guī)成員,第二,才需要實(shí)現(xiàn)抽象方法(也不一定是 public 的)2:接口與普通類之間是實(shí)現(xiàn)

3、關(guān)系 普通類實(shí)現(xiàn)了接口,只能將其沒有實(shí)現(xiàn)的公共方法實(shí)現(xiàn)3:接口只用于定義公共的方法,而抽象類,什么都可以有典型的使用:多實(shí)現(xiàn)一個類,可以同時實(shí)現(xiàn)多個接口interface i_a public function sayA();interface i_b public function sayB();class A implements i_a,i_b 接口可以定義常量:interface i_a const PAI = 3.14;public function sayA();interface i_b public function sayB();class A implements i_a,

4、i_b public function sayA() public function sayB() echo A:PAI;辨別?1:接口是不是類?NO 可以用 class_exists(); 判斷是不是類2:PHP是單繼承,怎么實(shí)現(xiàn)多繼承? “可以通過接口的多實(shí)現(xiàn)來模擬” 此說法是錯誤的 答案:不能實(shí)現(xiàn)多繼承類文件的載入-自動加載機(jī)制項目中如何管理大量的類的定義?典型的,每個類,獨(dú)立的創(chuàng)建一個文件,用于保存定義該類的源代碼!使用時,將該文件載入即可!此時,類文件的命名為:類名.class.php此時,面臨一個類文件很多,某個功能需要使用其中部分類:如何合理方便載入?老辦法:將載入類的代碼,放在

5、一起問題是:會有類的額外加載現(xiàn)在的載入類文件的方式是:按需加載在需要某個類時,如果該類沒有被加載,則加載定義該類的類文件判斷當(dāng)前類是否已經(jīng)加載?該類在哪個文件中?什么時機(jī)執(zhí)行上面的操作? (自動加載機(jī)制來完成)此時可以使用PHP的類文件,自動加載機(jī)制完成!自動加載機(jī)制當(dāng)需要一個類,但是并沒有找到該類的定義,此時,PHP核心(Zend Engine)會自動嘗試調(diào)用一個叫: _autoload() 的函數(shù)。與此同時,會將當(dāng)前所需要的類名作為參數(shù),傳遞到 _autoload() 這個函數(shù)中默認(rèn)是沒有這個函數(shù)的,需要用戶自己定義!因此,用戶腳本需要完成定義該函數(shù)該函數(shù)應(yīng)該有個形參,用于得到當(dāng)前所需要的

6、類名示例:function _autoload($class_name) require ./.$class_name.class.php;new Book;此時,輸出的結(jié)果為:BookFatal error: Class Book not found inE:VIP78.phpon line6此時,我們只要完成該函數(shù),利用得到的類名,將類名所對應(yīng)的文件載入即可序列化,反序列化(串行化,反串行化)場景:數(shù)據(jù)的持久性保存!例如:將數(shù)據(jù)保存在文件內(nèi)向文件寫入數(shù)據(jù):寫入的長度 = file_put_contents("文件","數(shù)據(jù)");從文件讀取數(shù)據(jù):數(shù)據(jù)

7、= file_get_contents("文件");寫入:$data = ginvip;echo 寫入前的數(shù)據(jù):<br />var_dump($data);$len = file_put_contents(./data.txt,$data);echo <br />var_dump($len);讀取:$data = file_get_contents(./data.txt);echo 讀取到的數(shù)據(jù):<br />var_dump($data);在數(shù)據(jù)保存時,面臨一個問題:數(shù)據(jù)格式問題:PHP的數(shù)據(jù)有八種類型之多,文件只能保存字節(jié)數(shù)據(jù)(字符串)

8、一旦數(shù)據(jù)類型不是字符串類型!就會導(dǎo)致數(shù)據(jù)不能原樣保存,不能取得原始數(shù)據(jù)應(yīng)該如何解決?任何形式的數(shù)據(jù),都可以存儲到文件中,并且,在取出來時,原樣得到數(shù)據(jù)在保存與讀取時,對數(shù)據(jù)進(jìn)行轉(zhuǎn)換與反轉(zhuǎn)換!序列化,serlialize序列化:原始數(shù)據(jù)轉(zhuǎn)成能夠記錄原始數(shù)據(jù)信息的字符串$data = ginvip;echo 寫入前的數(shù)據(jù):<br />var_dump($data);$ser_data = serialize($data);echo <br />序列化后的數(shù)據(jù):;var_dump($ser_data);$len = file_put_contents(./data.txt,$

9、ser_data);echo <br />var_dump($len);輸出結(jié)果為:讀取到的數(shù)據(jù):string(3) "b:0"轉(zhuǎn)換后的數(shù)據(jù)bool(false)反序列化,unserialize反序列化:通過序列化的字符串結(jié)果,將原始數(shù)據(jù)還原$data = file_get_contents(./data.txt);echo 讀取到的數(shù)據(jù):<br />var_dump($data);echo <br />echo 轉(zhuǎn)換后的數(shù)據(jù)<br />var_dump(unserialize($data);輸出結(jié)果為:讀取到的數(shù)據(jù):stri

10、ng(13) "s:6:"ginvip""轉(zhuǎn)換后的數(shù)據(jù)string(6) "ginvip"只有在涉及到數(shù)據(jù)需要被存儲或者傳輸時,需要對數(shù)據(jù)序列化注意:所有的數(shù)據(jù)類型都可以被序列化與反序列化。但資源是例外!對象的序列化與反序列化1:在反序列化時,需要找到該對象所屬的類的定義才可以,否則會變成 PHP_Incomplete_Class 的對象,不是原來的對象:存入:讀?。阂虼?,只要在反序列化之前將類載入即可2:反序列化,也會觸發(fā)自動加載機(jī)制3:在序列化時,可以自定義需要序列化的屬性名單 通過對象的特殊方法 _sleep(); 該方法會在對

11、象序列化時,自動調(diào)用,不需要參數(shù),需要返回一個數(shù)組,數(shù)組內(nèi)每個元素表示一個屬性名,數(shù)組內(nèi)存在的屬性名,就會被序列化,反之不會被序列化4:在反序列化時,可以自動再次執(zhí)行某些代碼,從而完成某些資源的初始化通過對象方法:_wakeup(); 函數(shù)會在對象被反序列過程中自動調(diào)用,所負(fù)責(zé)的功能,執(zhí)行反序列化(醒來之后的初始化工作)總結(jié):_construct_destruct_sleep_wakeupPHP自動調(diào)用,用戶腳本只需要定義。在特定的功能調(diào)用特定的方法以上四個方法總稱為魔術(shù)方法對象的拷貝與克隆class Book public $author;$b1 = new Book;$b1->aut

12、hor = Bruce Lee;$b2 = $b1;var_dump($b2);echo <hr />$b1->author = Jet Lee;var_dump($b1->author);echo <br />var_dump($b2->author);輸出結(jié)果依次為:對象之間的賦值,只有引用傳遞,沒有值傳遞保存對象的變量內(nèi),保存的不是對象本身,而是對象的標(biāo)識導(dǎo)致的結(jié)果是,不能通過賦值的方式,使用舊對象,得到新對象對象的克隆克隆,使用一個已有對象,得到一個屬性一致的新對象使用關(guān)鍵字 clone 來實(shí)現(xiàn)class Book public $author

13、;$b1 = new Book;$b1->author = Bruce Lee;$b2 = clone $b1;var_dump($b2);echo <br />$b1->author = Jet Lee;var_dump($b1->author);echo <br />var_dump($b2->author);輸出結(jié)果為:object(Book)#2 (1) "author"=> string(9) "Bruce Lee" string(7) "Jet Lee"string(9

14、) "Bruce Lee"典型的在克隆時,一定會出現(xiàn)某些屬性是用于區(qū)分是否是克隆出來的意味著,在克隆出來新對象時,要為新對象增加一些額外的標(biāo)識,才可以區(qū)分出來此時,在執(zhí)行 clone 時,會自動調(diào)用新對象的魔術(shù)方法 _clone 去完成克隆對象的初始化class Book public $is_clone = false;public $author;public function _clone() $this->is_clone = true;$b1 = new Book;$b1->author = Bruce Lee;$b2 = clone $b1;var_dump($b1, $b2);echo <br />$b1->author = Jet Lee;var_dump($b1->author);echo <br />var_dump($b2->author);輸出結(jié)果為:object(Book)#1 (2) "is_clone"=> bool(false) "author"=> string(9) "

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論