PHP基礎(chǔ)之類和對(duì)象1——簡(jiǎn)介及基本概念
自 PHP 5 起完全重寫(xiě)了對(duì)象模型以得到更佳性能和更多特性。這是自 PHP 4 以來(lái)的最大變化。PHP 5 具有完整的對(duì)象模型。PHP 5 中的新特性包括訪問(wèn)控制,抽象類和?final?類與方法,附加的魔術(shù)方法,接口,對(duì)象復(fù)制和類型約束。PHP 對(duì)待對(duì)象的方式與引用和句柄相同,即每個(gè)變量都持有對(duì)象的引用,而不是整個(gè)對(duì)象的拷貝。
二、基本概念1.class每個(gè)類的定義都以關(guān)鍵字?class?開(kāi)頭,后面跟著類名,后面跟著一對(duì)花括號(hào),里面包含有類的屬性與方法的定義。類名可以是任何非 PHP?保留字的合法標(biāo)簽。一個(gè)合法類名以字母或下劃線開(kāi)頭,后面跟著若干字母,數(shù)字或下劃線。以正則表達(dá)式表示為:[a-zA-Z_x7f-xff][a-zA-Z0-9_x7f-xff]*。一個(gè)類可以包含有屬于自己的常量,變量(稱為“屬性”)以及函數(shù)(稱為“方法”)。Example #1 簡(jiǎn)單的類定義
<?php class SimpleClass {//聲明屬性public $var = ’1’;//聲明方法public function displayVar(){ echo $this->var;} }?>
當(dāng)一個(gè)方法在類定義內(nèi)部被調(diào)用時(shí),有一個(gè)可用的偽變量 $this。$this 是一個(gè)到主叫對(duì)象的引用(通常是該方法所從屬的對(duì)象,但如果是從第二個(gè)對(duì)象靜態(tài)調(diào)用時(shí)也可能是另一個(gè)對(duì)象)。Example #2 $this 偽變量的示例
<?php class A {function foo(){ if(isset($this)){echo ’$this is defined (’;echo get_class($this);echo ’)<br>’; }else{echo ’$this is not defined.<br>’; }} } class B {function bar(){ //如果開(kāi)啟了E_STRICT這一行會(huì)有警告提示 A::foo();} } $a = new A(); $a -> foo(); //如果開(kāi)啟了E_STRICT這一行會(huì)有警告提示 A::foo(); $b = new B(); $b -> bar(); //如果開(kāi)啟了E_STRICT這一行會(huì)有警告提示 B::bar();?>
輸出結(jié)果:
$this is defined (A)$this is not defined.$this is defined (B)$this is not defined.2.new
要?jiǎng)?chuàng)建一個(gè)類的實(shí)例,必須使用?new?關(guān)鍵字。當(dāng)創(chuàng)建新對(duì)象時(shí)該對(duì)象總是被賦值,除非該對(duì)象定義了構(gòu)造函數(shù)并且在出錯(cuò)時(shí)拋出了一個(gè)異常。類應(yīng)在被實(shí)例化之前定義(某些情況下則必須這樣)。如果在?new?之后跟著的是一個(gè)包含有類名的字符串,則該類的一個(gè)實(shí)例被創(chuàng)建。如果該類屬于一個(gè)名字空間,則必須使用其完整名稱。Example #3 創(chuàng)建一個(gè)實(shí)例
<?php $instance = new SimpleClass(); //也可以這樣做: $className = 'Foo'; $instance = new $className(); //Foo()?>
在類定義內(nèi)部,可以用?new self?和?new parent?創(chuàng)建新對(duì)象。當(dāng)把一個(gè)對(duì)象已經(jīng)創(chuàng)建的實(shí)例賦給一個(gè)新變量時(shí),新變量會(huì)訪問(wèn)同一個(gè)實(shí)例,就和用該對(duì)象賦值一樣。此行為和給函數(shù)傳遞入實(shí)例時(shí)一樣。可以用克隆給一個(gè)已創(chuàng)建的對(duì)象建立一個(gè)新實(shí)例。Example #4 對(duì)象賦值
include_once(’class1.php’);$instance = new SimpleClass();$assigned = $instance;$reference = & $instance;$instance -> var = ’$assigned will have this value’;$instance = null; //$instance和$reference變成nullvar_dump($instance);var_dump($reference);var_dump($assigned);
輸出結(jié)果是:
NULLNULLobject(SimpleClass)#1 (1) { ['var']=> string(30) '$assigned will have this value' }
PHP 5.3.0 引進(jìn)了兩個(gè)新方法來(lái)創(chuàng)建一個(gè)對(duì)象的實(shí)例:
class Test{ static public function getNew() {return new static; }}class Child extends Test{}$obj1 = new Test();$obj2 = new $obj1;var_dump($obj1 !== $obj2);$obj3 = Test::getNew();var_dump($obj3 instanceof Test);$obj4 = Child::getNew();var_dump($obj4 instanceof Child);
輸出結(jié)果:
bool(true)bool(true)bool(true)3.extends
一個(gè)類可以在聲明中用?extends?關(guān)鍵字繼承另一個(gè)類的方法和屬性。PHP不支持多重繼承,一個(gè)類只能繼承一個(gè)基類(與java一樣都是單繼承)。被繼承的方法和屬性可以通過(guò)用同樣的名字重新聲明被覆蓋。但是如果父類定義方法時(shí)使用了?final,則該方法不可被覆蓋。可以通過(guò)?parent::?來(lái)訪問(wèn)被覆蓋的方法或?qū)傩浴.?dāng)覆蓋方法時(shí),參數(shù)必須保持一致否則 PHP 將發(fā)出?E_STRICT?級(jí)別的錯(cuò)誤信息。但構(gòu)造函數(shù)例外,構(gòu)造函數(shù)可在被覆蓋時(shí)使用不同的參數(shù)。Example #6 簡(jiǎn)單的類繼承:
class ExtendClass extends SimpleClass{ //重寫(xiě)父類的方法 function displayVar() {echo 'Extending class<br>';parent::displayVar(); }}$extended = new ExtendClass();$extended -> displayVar();
輸出結(jié)果:
Extending class14.::class
自 PHP 5.5 起,關(guān)鍵詞?class?也可用于類名的解析。使用?ClassName::class?你可以獲取一個(gè)字符串,包含了類?ClassName?的完全限定名稱。這對(duì)使用了?命名空間?的類尤其有用。Example #7 類名的解析
namespace NS{ class ClassName{} echo ClassName::class;}
輸出結(jié)果:
NSClassName
相關(guān)文章:
1. Python如何批量生成和調(diào)用變量2. ASP.NET MVC實(shí)現(xiàn)橫向展示購(gòu)物車3. 通過(guò)CSS數(shù)學(xué)函數(shù)實(shí)現(xiàn)動(dòng)畫(huà)特效4. ASP.Net Core對(duì)USB攝像頭進(jìn)行截圖5. Python獲取B站粉絲數(shù)的示例代碼6. .net如何優(yōu)雅的使用EFCore實(shí)例詳解7. windows服務(wù)器使用IIS時(shí)thinkphp搜索中文無(wú)效問(wèn)題8. ajax動(dòng)態(tài)加載json數(shù)據(jù)并詳細(xì)解析9. python利用opencv實(shí)現(xiàn)顏色檢測(cè)10. Python 中如何使用 virtualenv 管理虛擬環(huán)境
