




已閱讀5頁,還剩14頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
xx年最新PHP類的精縮歸納 xx年最新PHP類的精縮歸納一結構和調用(實例化)class className,調用$obj=new className();當類有構造函數時,還應傳入參數。 如$obj=new className($v,$v2.);二構造函數和析構函數 1、構造函數用于初始化使用_construct(),可帶參數。 2、但析構函數不能帶參數(用于在銷去一個類之前執(zhí)行一些操作或功能)。 析構函數用_destruct()做名稱。 在腳本執(zhí)行結束時,PHP會銷掉內存中的對象,因此可不用析造函數,但有些比如COOKIE等,就應當要用此函數銷掉。 知識點在PHP4中也提供了構造函數,但使用的是與類同名的類方法,在PHP5仍能兼容這種做法,當一個類中沒有包含_construct時,會查找與類同名的方法,如果找到,就認為是構造函數,如下class testvar$b;function test()$this-b=5;function addab($c)return$this-b+$c;$a=new test();echo$a-addab (4);/返回 93、PHP不會自動調用父類的構造函數(不支持構造函數重載),必須使用parent關鍵字顯式地調用。 class employeefunction_construct().class Managerextents Employeefunction_construct()parent:_construct();echo這個子類的父類構造函數調用了!;當然也可以調用與該實例沒有任何關系的其它類的構造函數。 只需在_construct()前加上類名即可。 如otherClassName:_construct();類的主家庭成員屬性、方法、常量、靜態(tài)成員 三、類的屬性有兩種方法對類的屬性賦值或取值。 1、使用公共作用域public關鍵詞。 2、使用_set()和_get()來分別賦值和取值,前者稱為設置方法(setter)或修改方法(mutator),后者稱為訪問方法(aessor)或獲取方法(getter)。 建議使用這種方法優(yōu)點A、可在_set()統(tǒng)一進行數據驗證。 B、便于統(tǒng)一管理屬性。 注意第一_set()和_get()只對私有屬性起作用,對于用public定義的屬性,它們兩個都懶理搭理,如下class testprotected$a=9,$b=2,$c;public$d;function_set($n,$v)$this-$n=$v+2;function_get($name)return$this-$name+2;$a=new test();$a-b=5;echo ;echo$a-b;實例只對$a,$b,$c的設置會經過_set和_get過濾與返回,對于$d,就不會起作用。 如$a-d=5,再返回還是5。 第二_set($n,$v)要帶兩個參數。 而_get($n)只能有一個參數。 實例class testprivate$a=5,$b=6,$c;function_set($n,$v)if($n=a&$n0)$this-$n=$v;else$this-$n=$v+2;function_get($name)return$this-$name;/如果改為return$this-$name+$this-addab();如調用a的值,實際返回的是a+a+b的值。 默認為5+5+6=16。 function addab()return$this-a+$this-b;$e=new test();$e-a=11;/注意寫法類的內部用$this-$n即變量的寫法,但外部實例要用$e-a的方式。 $e-b=12;/get14$e-k=22;類的屬性可自由擴展,如上例的k,不管是否用_set,當一個實例建立起來后,可以用$e-newProperty=xx;直接來創(chuàng)造一個屬性,但不建議這么做。 四、類的方法理解成類當中的函數即可。 調用 1、內部調用可使用$this-Fanname();或$this-addab()或test:addab(); 2、實例化調用時,用$e-addab();即可。 對于在該方法中沒有使用$this關鍵字的,如上例中的function addab()return$this-a+$this-b;改為function addab()return25;那在在外部實例調用該方法,也可用“$e:addab();”或“test:addab();” 五、類的常量如果類的屬性理解成類中的變量,那么類的常量和變量是不一樣的,其定義方法為class testprivate$a;const PI=3.14;./在類中調用上面的常量用兩種方法,“$this:PI”,或“類名:PI”,這里就是test:PI,如下function getvalue()return$this-a*$this:PI;/或$this-a*test:PI,用this關鍵字或類名均可,但都要用雙冒號。 $e=new test();$e-PI=5;/注意,這里用-只是創(chuàng)造了一個也是名為PI的屬性,而不是改變類中的PI常量的值。 echo$e:PI;/這個才是調用類的常量。 常量只能用雙冒號:來調用。 并且不能更改其值。 在類外部實例化后調用類常量同樣也有兩種方法。 方法為“$e:PI”或“test:PI”,共同點是都要用冒號,不同點是外部不能用this關鍵字,只能用實例名,但類名:PI是通用的。 六、類的靜態(tài)成員(靜態(tài)屬性或靜態(tài)方法)如果需要創(chuàng)建供所有類的實例共享的字段或方法。 就得用靜態(tài)成員。 有兩個特征 1、靜態(tài)成員是共產主義者,它讓腳本上的所有該類的實例調用,但不能借助類的特定實例名調用,而是在類的外部,統(tǒng)一使用“類名:$成員名”的方式調用。 而類的內部則統(tǒng)一使用“self:$成員名”來調用。 2、當每一次新創(chuàng)建實例時,靜態(tài)成員會從上次創(chuàng)建的實例最后值開始重新計算,而不是類中初始的值開始計算。 3、對于用public定義的靜態(tài)成員,可以在外部更改它的值。 private等則不行。 class testpublic static$v=0;function_construct()self:$v+;static functiongetV()return self:$v;$a=new test();echo test:getV();/返回1$b=new test();echo test:getV();/返回2test:$v=8;/由于public定義的成員,改變靜態(tài)成員的值。 $c=new test();echo test:getV();/返回9 七、關鍵字(一)this關鍵字用于類的內部指代類的本身。 來訪問屬性或方法或常量,如$this-屬性名或方法名。 $this:常量名。 this還可以用在該類的子類中,來指代本身的屬性或方法。 (二)雙冒號“:”關鍵字用于調用常量、靜態(tài)成員。 (三)self關鍵字:在類的內部與雙冒號配合調用靜態(tài)成員,如self:$staticVar.,在類的內部,不能用$this來調用靜態(tài)成員。 (四)_toString()在類中使用_toString(),用于將類轉成字串并打印類,用處不大如class testpublic$p;public function_toString()return var_export($this,TRUE);$a=new test();echo$a;/輸出test:_set_state(array(p=NULL,),或寫成echo$a-_toString();(五)_clone()當克隆對象時,這個關鍵字才會發(fā)生作用,用于更改克隆時某些值。 (六)_call()方法重載,參下面示例class cBfunction_call($method,$n)if($method=showVarType)if(is_numeric($n0)/不能用$n。 要用$n0;$this-displayNum();else if(is_array($n0)$this-displayArr();else$this-displayOther();function displayNum()echo (七)extends:繼承:如class aclass bextends a類b繼承了類a附記憶以后統(tǒng)一在調用方法或屬性時用-,調用常量則用雙冒號“:”,不會搞暈。 八、方法和屬性的作用域共有6種public(默認,可省略,也等同于php6的var聲明),private(私有,也不能由子類使用),protected(私有,但可由子類使用),abstract(抽象,參下文),final(阻止在子類中覆蓋也稱重載,阻止被繼承,用于修飾類名及方法,如final class testfinal functionfun(),但不能用于屬性),static(靜態(tài))九抽象類和抽象方法(abstract注意沒有所謂抽象屬性):抽象可以理解成父類為子類定義了一個模板或基類。 作用域abstract只在父類中聲明,但在子類中實現。 注意事項 1、抽象類不能被實例化,只能被子類(具體類)繼承后實現。 2、抽象類必須在其子類中實現該抽象類的所有抽象方法。 否則會出錯。 3、在抽象方法中,只是聲明,但不能具體實現如abstract functiongettow()return$this-p;是錯的,只能聲明這個方法abstract functiongettow();(連方括號都不要出現),抽象方法和抽象類主要用于復雜的類層次關系中。 該層次關系需要確保每一個子類都包含并重載了某些特定的方法。 這也可以通過接口實現 4、屬性不能被命名為抽象屬性,如abstract$p=5是錯的。 5、只有聲明為抽象的類可以聲明抽象方法,但如果方法聲明為抽象,就不能具體實現。 如abstract classEmployeeabstract functiona(.);abstract functionb(.);以后再對這個父類擴展,組成各種子類(如經理,員工,出納)。 6、抽象類中,如果要實現具體的方法,不能聲明為抽象。 這樣可能實際意義更大。 可以把幾個類庫中共同的部分提取到抽象類中,其它的類繼承抽象類即可。 如下abstract classBaseShopConst TAX=0.06;/在抽象類中定義常量public functionbuy($gid)/如果定義為抽象方法abstract functionbuy()就不能在這里實現主體。 echo(你購買了ID為:.$gid.的商品);public functionsell($gid)echo(你賣了ID為:.$gid.的商品);public functionview($gid)echo(你查看了ID為:.$gid.的商品);class BallShopextends BaseShopvar$itme_id=null;public function_construct()$this-itme_id=2314;public functionopen()$this-sell($this-itme_id);public functiongetTax()echo printf( 有些類的方法需要傳入的參數為所期望的對象類型,可以用下面的方法達到強制實施此替則。 要達到類型提示,只要在方法的對象型參數前加一個已存在的類的名稱,如function funname(OtherClassName$otherclassINSName,$c.),注意,OtherClassName必須是存在的類。 如下class emvar$k=56;class testfunction_construct()echo$this-addab(new em(),2);function addab(em$j,$c)/這個方法,即可以在內部調用,也可以在外部調用。 只要作用域許可。 return$j-k+$c;$a=new test();$b=new em();echo$a-addab($b,2);/或$a-addab(new em(),2); 十一、類的管理 1、instanceof關鍵字用于分析一個對象是否是某一個類的實例或子類或是實現了某個特定的接口如下例,但要注意類名沒有任何引號等定界符,否則會出錯。 如test不能用testclass test2class testclass testChilernExtends test$a=new test2();$m=new test();$i=($m instanceoftest);if($i)echo$m是類test的實例! ;/get thisvalue switch($a instanceoftest)case true:echoYES ;break;case false:echoNo ;/get thisvalue break;$d=new testChilern();if($d instanceoftest)echo$d是類test的子類! ;/get thisvalue 2、確定類是否存在boolean class_exists(string class_name):class_exists(test); 3、返回類名string get_class(object),成功時返回實例的類名,失敗則返回FALSE$a=new test2();echo get_class($a);/返回test 24、了解類的公用屬性array get_class_vars(className),返回關鍵數組包含所有定義的public屬性名及其相應的值。 這個函數不能用實例名做變量 5、返回類方法get_class_methods(test);/或get_class_methods($a);可用實例名做參數,返回包括構造函數在內的所有非私有方法。 6、print_r(get_declared_classes()了解當前PHP版本中所有的類名。 PHP5有149個。 7、get_object_vars($a)返回實例中所有公用的屬性及其值的關聯數組。 注意它和get_class_vars()的區(qū)別/* (1)get_object_vars($a)是用實例名做參數,而get_class_vars(test)是用類名做參數。 * (2)get_object_vars($a)獲得的屬性值是實例運行后的值,而get_class_vars(test)獲得的屬性值是類中的初始定義。 * (3)兩者均返回關聯數組,且均對未賦值的屬性返回NULL的值。 如類test中有定義了public$q;則返回Array(v=5q=),*/ 8、返回父類的名稱get_parent_class($b);/或get_parent_class(test2);返回test 9、確定接口是否存在boolean interface_exists($string interface,boolean autoload) 10、確定對象類型boolean is_a($obj,className),當$obj屬于CLASSNAME類時,或屬于其子類時,返回TRUE,如果$obj與class類型無關則返回FALSE。 如is_a($a,test) 11、確定是否是某類的子對象當$b是繼承自TEST類時,返回TRUE,否則FALSE。 boolean is_subclass_of($b,test); 12、確定類或實例中,是否存在某方法。 method_exists($a,getv)/或用method_exists(test,getv),此函數適用于非public定義的作用域的方法。 以上函數實例class testpublic$v=2;private$c=5;function_construct()$this-v=5;private functiongetv()return$this-v;class test2extends test$a=new test();$b=new test2();print_r(get_class_methods(test);/或print_r(get_class_methods($a);均返回Array(0=_construct1=getv)echo ;print_r(get_class_vars(test);/返回Array(v=2),和上面不一樣,不能用print_r(get_class_methods($a);echo ;echo get_parent_class($b);/或get_parent_class(test2);返回test echo ;echo is_a($b,test);/返回1echo ;if(is_subclass_of(test2,test)echo是子類!;/或(is_subclass_of($b,test),返回1,當參數1為$a時則返回false,echo ;echo method_exists($a,getv)/或用method_exists(test,getv)返回1,本函數也適用于用private等定義域的方法。 十二、自動加載類庫文件當類多了以后,比如要在一個文件中載入3個類庫文件a.class.php,b.class.php,c.class.php要用三個require_once require_once(classes/a.class.php);require_once(classes/b.class.php);require_once(classes/c.class.php);可以用PHP5自動加載的功能來處理在全局應用配置文件中,定義一個特殊的函數_autoload($class)函數(_autoload并不是一個類的方法,只是單獨的函數,和類沒有關系)function_autoload($class)require_once(classes/$class)該函數放哪沒有關系,在創(chuàng)建類實例時,也不必去調用這個autoload函數。 PHP會自動完成。 但務必注意一點“在調用頁面上創(chuàng)建實例所使用的類名稱”、和“被調用的文件名”、以及“該文件中的類的名稱”3個必須是一樣的。 這樣就不需要去調用_autoload();如果不一樣則必須單獨調用_autoload(c);并給它一個文件名前綴。 如c.class.php文件的代碼是這里代碼的類名稱是c,而文件名也是c,現在要在index.php調用m;?此時PHP會自動調用根目錄下的c.class.php中的類C。 但如果c.class.php中的代碼是而調用頁index.php代碼是 $m=new mm();echo$m-m;?會出錯,提示找不到mm.class.php文件。 這時可以加一行_autoload(c);但這樣就達不到簡化代碼的目的。 類的家族化擴展類的高級功能 一、對象克隆當克隆一個對象的實例時,其屬性初始值繼承了被克隆對象的當前值。 classtestpublic$p=5;function_clone()/只在克隆發(fā)生時起作用。 用于改變在克隆時某些值$this-p=15;$a=new test();echo$a-p;$a-p=8;/如果沒有_clone()方法影響,$b的P值將為8$b=clone$a;echo$b-p;/15 二、對象繼承沒有被聲明為final的類可以被繼承,沒有被final和private界定的方法也可以繼承,沒有被private界定的屬性也可以繼承。 當子類繼承了父類或超類后,可以直接使用父類或超類(祖父類以及祖父的祖父)的所有允許的方法,屬性。 關鍵理解構造函數和重載在繼承中的特性!(一)構造函數在繼承中的特性 1、當父類有構造函數而子類沒有則子類會在實例化時會自動執(zhí)行父類的構造函數。 這時如果要創(chuàng)建子類的實例,需要引入父類構造函數中所需的參數,否則出錯。 即使是“子類的子類”如果沒有構造函數,也要在創(chuàng)建實例時輸入其父類的父類的構造函數所需參數。 PHP會從實例所在的子類會向上搜索合造的構造函數,一旦找到就停止,使用該構造函數。 而不會再向上搜索,因此子類本身如果沒有構造函數,則以其最靠近的一個超類并且有構造函數的為準。 class cApublic$name,$age;function_construct($n)$this-name=$n;$this-age=25;function_set($n,$v)$this-$n=$v;function_get($n)return$this-$n;class cBextends cAfunction funB1()echo 改為$c=new cC(David);即可。 echo$c-name();/David 2、當子類也有構造函數時這時,不管父類是否有構造函數,都會執(zhí)行子類自己的構造函數。 如上class cBextends cAfunction_construct()echo 因此$b-name和$-age就不會初始化值。 需要另外賦值$b-name=Jack,$b-age=25;如果這時要執(zhí)行父類CA的構造函數,可以這樣function_construct($n)parent:_construct($n);/或cA:_construct($n);echo 不會執(zhí)行cA。 這時,如果CC的實例想都調用CA和CB的構造函數,有兩種方法A、在CB中也加入parent:_construct($n)B、在CC中把構造函數改為function_construct($n)cA:_construct($n);/即類名:構造函數。 cB:_construct();echo 1、調用父類方法在子類中調用父類的方法,有3種方法$this-ParentFunction();或父類名:ParentFunction();或parent:parentFun(); 2、調用父類屬性只能用$this-ParentProperty;(三)重載在子類中,可以定義與父類相同屬性或方法,改變父類該屬性或方法的值或操作,稱做重載。 如calss ParClassfunction pfun().class ChildrenClassextends ParClassfunction pfun()./重載了父類的pfun的方法。 在子類中重載后,優(yōu)先執(zhí)行自己重載后的新定義的方法或屬性。 也可以在子類中用parent:parentFun();調用父類的方法,但所得到的值是子類自己輸入的參數運算值。 而不是該方法在父類中運算的值。 三、接口接口interface,可以理解成一組功能的共同規(guī)范,最大意義可能就是在多人協(xié)作時,為各自的開發(fā)規(guī)定一個共同的方法名稱。 和抽象類中的抽象方法一樣 1、不能在接口中對方法具體實現進行定義。 而是由具體類來實現(而抽象類中的非抽象方法可以不必再定義,只有抽象方法和
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權】 ISO/IEC 23090-25:2025 EN Information technology - Coded representation of immersive media - Part 25: Conformance and reference software for carriage of visual volumetric vid
- 房屋租賃付定金合同
- 獨家代理合同(20篇)
- 酒店服務標準化建設合作協(xié)議
- 軟件開發(fā)委托服務合同
- 食品安全檢測認證服務合同
- 藝術品交易鑒賞期免責合同協(xié)議
- 手房租賃買賣合同
- 工程施工中止合同書
- 環(huán)保工程承包施工合同
- 各種el34名膽電子管評測
- 超分子化學-杯芳烴課件
- 車標識別 課講義件課件
- 送達地址確認書(樣本)
- 壓力容器考試審核考試題庫(容標委-氣體協(xié)會聯合)
- 二年級道德與法治下冊全冊教案(含反思)
- 文物保護概論課件
- HBZ 131-2020 高溫合金母合金選用原材料技術要求
- 生物化學緒論
- 公路工程項目隱隱蔽工程管理辦法
- PCCP安裝與水壓試驗
評論
0/150
提交評論