4-4-2php-class類簡單用法總結._第1頁
4-4-2php-class類簡單用法總結._第2頁
已閱讀5頁,還剩17頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、衛浴潔具http:/ className ,調用:$obj = new className();當類有構造函數時,還應傳入參數。如$obj=new className($v,$v2 );二:構造函數和析構函數:1、 構造函數用于初始化:使用construct(),可帶參數。2、但析構函數不能帶參數(用于在銷去一個類之前執行一些操作或功能)。析構函數用destruct()做名稱。在腳本執行結束時,會銷掉內存中的對象,因此可不用析造函數,但有些 比如 COOKIE等,就應當要用此函數銷掉。知識點:在 PHP4 中也提供了構造函數,但使用的是與類同名的類方法,在PHP5 仍能兼容這種做法,當一個類中

2、沒有包含_con struct 時,會查找與類同名的方法,如果找到,就認為是構造函數,如下:class test var $b;fun ctio n test() $this-b=5; fun ctio n addab($c) return $this-b+$c; $a = new test(); echo $a-addab(4); / 返回 93、 PHP 不會自動調用父類的構造函數(不支持構造函數重載),必須使用 pare nt 關鍵字顯式地調 用。class employeefun cti on _con struct。class Man ager exte nts Employeefu

3、n cti on _con struct()pare nt:_c on struct();echo 個子類的父類構造函數調用了!;當然也可以調用與該實例沒有任何關系的其它類的構造函數。只需在_construct()前加上類名即可。如:otherClassName:_con struct();類的主家庭成員:屬性、方法、常量、靜態成員 三、類的屬性:有兩種方法對類的屬性賦值或取值。1、 使用公共作用域 public 關鍵詞。2、 使用_set()和_get()來分別賦值和取值,前者稱為設置方法( setter)或修改方法(mutator), 后者稱為訪問方法(accessor)或獲取方法(get

4、ter)。建議使用這種方法:優點:A、可在_set ()統一進行數據驗證B、便于統一管理屬性。第一如下_set()和_get()只對私有屬性起作用,對于用 public 定義的屬性,它們兩個都懶理搭理,衛浴潔具http:/ testprotected $a=9,$b=2,$c;public $d;fun ction _set($ n,$v) $this-$ n = $v+2; fun cti on _get($ name) return $this-$ name+2; $a = new test();$a- b =5; echo “ ”cho $a-b;實例只對$a,$b,$c 的設置會經過

5、set 和get 過濾與返回,對于$d,就不會起作用。如$a-d=5, 再返回還是5。第二:set($n,$v)要帶兩個參數。而 _get($n)只能有一個參數。實例:class testprivate $a=5,$b=6,$c;fun ction _set($ n,$v)if($n= a&$n0)$this-$ n = $v;else$this-$n = $v+2;fun cti on _get($ name)return $this-$name; /如果改為 return $this-$name + $this-addab();如調用 a 的值,實際返回的是 a+a+b 的值。默認

6、為 5+5+6=16。fun cti on addab()return $this-a + $this-b; $e=new test();$e-a = 11;/注意寫法:類的內部用$this-$n 即變量的寫法,但外部實例要用 $e-a 的方式。$e-b = 12; /get 14$e-k = 22;類的屬性可自由擴展,如上例的k,不管是否用 _set,當一個實例建立起來后,可以用$e- newProperty = xx; 直接來創造一個屬性,但不建議這么做。四、類的方法:理解成類當中的函數即可。調用:1、 內部調用:可使用$this-Fanname();或$this-addab()或 tes

7、t:addab();2、 實例化調用時,用$e-addab();即可。對于在該方法中沒有使用$this 關鍵字的,如上例中的:fun cti on addab() retur n $this-a+$this-b;改為:fun ction addab() return 25;那在在外部實例調用該方法,也可用“ $e:addab();或 “test:addab(); ”衛浴潔具http:/ 類的常量:如果類的屬性理解成類中的變量,那么類的常量和變量是不一樣的,其定義方法為:class testprivate $a;con st PI = 3.14 ;/在類中調用上面的常量用兩種方法,“$this:

8、PI 或類名::PI 這里就是 test:PI,如下:fun cti on getvalue()return $this-a * $this:PI; / 或$this-a * test:PI,用 this 關鍵字或類名均可,但都要用雙冒號。$e= new test();$e-PI =5;/注意,這里用-只是創造了一個也是名為PI 的屬性,而不是改變類中的PI 常量的值。echo $e:PI; /這個才是調用類的常量。常量只能用雙冒號:來調用。并且不能更改其值。在類外部實例化后調用類常量同樣也有兩種方法。方法為:“ $e:PI 或“ test:PI,共同點是都要用冒號, 不同點是外部不能用thi

9、s 關鍵字,只能用實例名,但類名:PI 是通用的。六、 類的靜態成員(靜態屬性或靜態方法):如果需要創建供所有類的實例共享的字段或方法。就得用靜態成員。有兩個特征:1、 靜態成員是共產主義者,它讓腳本上的所有該類的實例調用,但不能借助類的特定實例名調用,而是在類的外部,統一使用類名:$成員名”的方式調用。而類的內部則統一使用“self:賊員名”來調用。2、 當每一次新創建實例時,靜態成員會從上次創建的實例最后值開始重新計算,而不是類中初 始的值開始計算。3、 對于用 public 定義的靜態成員,可以在外部更改它的值。private 等則不行。class testpublic static $

10、v = 0;fun cti on _con struct() self:$v+; static fun cti on getV()retur n self:$v; $a = new test();echo test:getV(); / 返回 1$b = new test();echo test:getV(); / 返回 2test:$v=8;/由于 public 定義的成員,改變靜態成員的值。$c = new test();echo test:getV(); / 返回 9七、 關鍵字:(一) this 關鍵字:用于類的內部指代類的本身。來訪問屬性或方法或常量,如$this-屬性名或衛浴潔具ht

11、tp:/ 還可以用在該類的子類中,來指代本身的屬性或方法。(二) 雙冒號 “:關鍵字:用于調用常量、靜態成員。衛浴潔具http:/ 關鍵字:在類的內部與雙冒號配合調用靜態成員,如self:$staticVar.,在類的內部,不能用$this 來調用靜態成員。(四)toString():在類中使用_toString(),用于將類轉成字串并打印類,用處不大:如:class test public $p;public fun cti on _toStri ng()retur n var_export($this,TRUE); $a=new test();echo $a; / 輸岀:test:_set

12、_state(array( p = NUL 或寫成:echo $a-_toString();(五)_clone():當克隆對象時,這個關鍵字才會發生作用,用于更改克隆時某些值。(六)_call():方法重載,參下面示例:class cBfun ction _call($method,$ n)if($method= showVarType )if(is_numeric($n0)/不能用 $n。要用 $n0;$this-displayNum();else if (is_array($ n0)$this-displayArr();else$this-displayOther();fun cti on

13、 displayNum() echo h3 這是數字! ;fun cti on displayArr() echo h3 這是數組! ;fun cti on displayOther() echo h3 不是數組也不是數字! ;$x= a;$y=array( a ,b );$b=new cB;$b-showVarType($x); /不是數組也不是數字$b-showVarType($y); /這是數組注意,不能在類中定義showVarType ()方法,否則代碼不能用。(七)extends:繼承:女口 class a class b extends a 類 b 繼承了類 a附:記憶:以后統一在

14、調用方法或屬性時用- 調用常量則用雙冒號“:,不會搞暈。八、方法和屬性的作用域:衛浴潔具http:/ 6 種: public(默認, 可省略, 也等同于 php6 的 var 聲明),private (私有, 也不能由子類使 用), protected(私有,但可由子類使用),abstract(抽象,參下文),final(阻止在子類中覆蓋 一衛浴潔具http:/ 注意:沒有所謂抽象屬性):抽象可以理解成父類為子類定義了一個模板或基類。作用域abstract 只在父類中聲明,但在子類中實現。注意事項:1、抽象類不能被實例化,只能被子類(具體類)繼承后實現。2、抽象類必須在其子類中實現該抽象類的所

15、有抽象方法。否則會岀錯。3、 在抽象方法中,只是聲明,但不能具體實現:如abstract fun ctio n gettow() return $this-p; 是錯的,只能聲明這個方法:abstract function gettow();(連方括號都不要岀現),抽象方法和抽象類主要用于復雜的類層次關系中。該層次關系需要確保每一個子類都包含并重載了某些特定的方法。這也可以通過接口實現4、 屬性不能被命名為抽象屬性,如abstract $p = 5 是錯的。5、只有聲明為抽象的類可以聲明抽象方法,但如果方法聲明為抽象,就不能具體實現。如:abstract class Employeeabstr

16、act function a();abstract function b();以后再對這個父類擴展,組成各種子類(如經理,員工,岀納)。6、抽象類中,如果要實現具體的方法,不能聲明為抽象。這樣可能實際意義更大。可以把幾個 類庫中共同的部分提取到抽象類中,其它的類繼承抽象類即可。如下:abstract class BaseShopConst TAX=0.06;/在抽象類中定義常量public function buy($gid) /如果定義為抽象方法abstract function buy ()就不能在這里實現主體。echo(你購買了 ID 為:.$gic 的商品);public fun ct

17、i on sell($gid) echo(你賣了 ID 為:.$gic 的商品);public fun cti on view($gid) echo(你查看了 ID 為:.$gic 的商品);class BallShop exte nds BaseShopvar $itme_id = n ull;public fun cti on _con struct()$this-itme_id = 2314;public fun cti on ope n()$this-sell($this-itme_id);final class test final fun cti on fun(),但不衛浴潔具ht

18、tp:/ fun cti on getTax()echo printf( 平均稅率是d%。 ,$this:TAX*100);$s = new BallShop;$s-open(); / 你賣了 ID 為:2314 的商品$shop-getTax();十:類型提示:注意,類型提示功能只能用于參數為對象的提示,而無法用于為整數,字串,浮點等類型提示。有些類的方法需要傳入的參數為所期望的對象類型,可以用下面的方法達到強制實施此替則。要達到類型提示,只要在方法的對象型參數前加一個已存在的類的名稱,如:fun cti onfunname(OtherClassName $otherclasslNSName

19、,$cJ注意,OtherClassName必須是存在的類。如下:class em var $k=56; class testfun cti on _con struct() echo $this-addab( new em(),2);fun ction 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 關鍵字:用于分析一個對象

20、是否是某一個類的實例或子類或是實現了某個特定的接口:如下例,但要注意:類名沒有任何引號等定界符,否則會岀錯。女口test 不能用test class test2class testclass testChilern Exte nds test$a = new test2();$m = new test();$i = ($m in sta nceof test);if($i)echo是 test 的實例! ; / get this valueswitch ($a in sta nceof test)case true :echo YES ;break;case false :echo No 7/

21、get this value衛浴潔具http:/ testChilern();if($d instanceof test)echo是類$St 的子類! ; / get SnValue2、 確定類是否存在: boolean class_exists(string class_name): class_exists( test );3、 返回類名:string get_class(object),成功時返回實例的類名,失敗則返回FALSE :$a = new test2(); echo get_class($a);/返回 test24、 了解類的公用屬性:array get_class_vars(

22、 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() 的區別:/* (1) get_object_va

23、rs($a)是用實例名做參數,而get_class_vars( tes 是 用類名做參數。*get_object_vars($a)獲得的屬性值是實例運行后的值,而get_class_vars( tes 獲得的屬性值是類中的初始定義。* (3)兩者均返回關聯數組,且均對未賦值的屬性返回NULL 的值。如類 test 中有定義了 public $q;則返回 Array ( v = 5 q=),*/8、 返回父類的名稱: get_parent_class($b); 或 get_parent_class( test2 返回 test9、 確定接口是否存在:boolea n in terface_exi

24、sts($stri ng in terface,boolea n autoload)10、 確定對象類型:boolean is_a($obj, classNanje 當 $obj 屬于 CLASSNAME 類時,或屬 于其子類時,返回 TRUE,如果$obj 與 class 類型無關則返回 FALSE。如:is_a($a, test )11、確定是否是某類的子對象: 當$b 是繼承自 TEST 類時,返回 TRUE,否則 FALSE。booleanis_subclass_of($b, test );12、 確定類或實例中,是否存在某方法。method_exists($a, getv 或用met

25、hod_exists( test ,此函數適用于非public 定義的作用域的方法。以上函數實例:class testpublic $v=2;private $c=5;fun cti on _con struct()$this-v=5;private fun cti on getv()return $this-v;class test2 exte nds test$a=new test();$b=new test2();衛浴潔具http:/ get_class_methods( test: Mn/_r( get_class_methods($a);均返回: Array ( 0= _con st

26、ruct 1 = getv )echo ;print_r( get_class_vars( te 返:回:)A(/ay ( v = 2 ),和上面不一樣,不能用衛浴潔具http:/ nt_r( get_class_methods($a);echo ;echo get_parent_class($b);或 get_parent_class( test2 返回 testecho ;echo is_a($b, test 返回;/1echo ;if(is_subclass_of( test2 , 是子類!)eho 或(is_subclass_of($b, te 返回 1,當參數 1為$a 時則返回 f

27、alse,echo ;echo method_exists($a, get或用)method_exists( test 返 etV 1,本函數也適用于用private 等定義域的方法。十、自動加載類庫文件:當類多了以后,比如要在一個文件中載入3 個類庫文件:a.class.php,b.class.php,c.class.php要用三個 require.once( classes/a.class.php);require_once( classes/b.class.php);require_once( classes/c.class.php);可以用 PHP5 自動加載的功能來處理:在全局應用配

28、置文件中,定義一個特殊的函數_autoload($class)函數(_autoload 并不是一個類的方法,只是單獨的函數,和類沒有關系): fun cti on_autoload($class)require_once(“ classes/$class)該函數放哪沒有關系,在創建類實例時,也不必去調用這個autoload 函數。PHP 會自動完成。但務必注意一點:在調用頁面上創建實例所使用的類名稱”、和 被調用的文件名”、以及 該文件中的類的名稱”3個必須是一樣的。這樣就不需要去調用_autoload();如果不一樣則必須單獨調用autoload( c并給它一個文件名前綴。如:c.class

29、.php 文件的代碼是:這里代碼的類名稱是c,而文件名也是 c,現在要在 index.php 調用:m;?此時 PHP 會自動調用根目錄下的c.class.php 中的類 C。但如果 c.class.php 中的代碼是:衛浴潔具http:/ index.php 代碼是:v?phpfun cti on _autoload($class)require.once“ $class.class.php ”;# _autoload( c 如果不加這一行就會岀錯。$m = new mm();echo $m-m;?會岀錯,提示找不到 mm.class.php 文件。這時可以加一行 _autoload( c但

30、這樣就達不到簡化 代碼的目的。類的家族化擴展:類的高級功能:一、 對象克隆:當克隆一個對象的實例時,其屬性初始值繼承了被克隆對象的當前值。class testpublic $p=5;fun ction _clon e()/只在克隆發生時起作用。用于改變在克隆時某些值$this-p=15;$a=new test();echo $a-p;$a-p=8; /如果沒有_clone()方法影響,$b 的 P 值將為 8$b = clo ne $a;echo $b-p; 15二、對象繼承:沒有被聲明為 final 的類可以被繼承,沒有被 final 和 private 界定的方法也可以繼承,沒有被 pri

31、vate 界定的屬性也可以繼承。當子類繼承了父類或超類后,可以直接使用父類或超類(祖父 類以及祖父的祖父)的所有允許的方法,屬性。關鍵:理解構造函數和重載在繼承中的特性!(一)構造函數在繼承中的特性:1、當父類有構造函數而子類沒有:則子類會在實例化時會自動執行父類的構造函數。這時如果要創建子類的實例,需要引入父類構造函數中所需的參數,否則岀錯。即使是子類的子類”如果沒有構造函數,也要在創建實例時輸入其父類的父類的構造函數所需參數。PHP 會從實例所在的子類會向上搜索合造的構造函數,一旦找到就停止,使用該構造函數。而不會再向上搜索,因此:子類本身如果沒有構造函數,則以其最靠近的一個超類并且有構造

32、函數的為準。class cA衛浴潔具http:/ $n ame,$age;衛浴潔具http:/ cti on _con struct($ n) $this-n ame = $n;$this-age = 25;fun ction _set($ n,$v) $this-$ n = $v;fun cti on _get($ n) return $this-$ n;class cB exte nds cAfunction funB1()echo Class cB execute success! ;class cC exte nds cB function funC1() echo Class cC

33、FunC1! ; $b=new cB( Jack );$b- n ame= Joh n ;echo “ $name : $b-age ”;$b-fu nB1();$c=new cC(); /這里會岀錯,由于cB 也沒有構造函數,因此再向上以 cA 為準,需要一個參數。改為 $c=new cC( David即可。echo $c- n ame(); /David2、當子類也有構造函數時:這時,不管父類是否有構造函數,都會執行子類自己的構造函數。 如上:class cB exte nds cAfun cti on _con struct() echo this is Class cB s _cons

34、truct!;function funB1() echo Class cB execute success!;現在類 CB 有自己的構造函數時,這時創建實例$b=new cB( Jack參數 JACK 不會起作用,因為父類 CA 的構造函數沒有得到執行。因此$b-name 和$-age 就不會初始化值。需要另外賦值$b- name= Jack ,$b-age=25;如果這時要執行父類CA 的構造函數,可以這樣:fun cti on _con struct($ n) parent:_construct($n);/ 或: cA:_construct($n);echo this is Class c

35、B s _construct!;衛浴潔具http:/ parent:_construct($n);只會向上搜索父類的構造函數,一找到就停止且執行當前找到的衛浴潔具http:/ 是用在最后一層的類 cC 中,并且類 CB,CA 都有構造函數,那么 cC 的實例只會執行 cB 的構造函數。不會執行 cA。這時,如果 CC 的實例想都調用 CA 和 CB 的構造函數,有兩種方法:A、在 CB 中也加入 parent:_construct($n)B、在 CC 中把構造函數改為:fun cti on _con struct($ n) cA:_construct($n);/即:類名:構造函數。cB:_co

36、n struct();echo this is Class cB s _construct!;(二) 在子類中調用父類的屬性或方法:1、 調用父類方法:在子類中調用父類的方法,有3 種方法:$this-Pare ntFu ncti on();或父類名:ParentFunction();或pare nt:pare ntFu n();2、 調用父類屬性:只能用 $this-Pare ntProperty;(三) 重載:在子類中,可以定義與父類相同屬性或方法,改變父類該屬性或方法的值或操作,稱做重載。如:calss ParClass function pfun().class ChildrenClass extends ParClassfunction pfun() / 重載了父類的 pfun 的方法。在子類中重載后,優先執行自己重載后的新定義的方法或屬性。也可以在子類中用pare nt:pare ntFu n();調用父類的方法,但所得到的值是子類自己輸入的參數運算值。而不是該方法在父類中運算的值。三、接口:接口: in terface,可以理解成一組功能的共同規范,最大意義可能就是在多人協作時,為各自的 開發規

溫馨提示

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

最新文檔

評論

0/150

提交評論