版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
5.1PHP類與對(duì)象陳學(xué)平1PHP類與對(duì)象01類的定義及應(yīng)用02目錄011PHP類與對(duì)象基本概念面向?qū)ο缶幊蹋∣bjectOrientedProgramming,OOP,面向?qū)ο蟪绦蛟O(shè)計(jì))是一種計(jì)算機(jī)編程架構(gòu)。OOP的一條基本原則是計(jì)算機(jī)程序是由單個(gè)能夠起到子程序作用的單元或?qū)ο蠼M合而成。OOP達(dá)到了軟件工程的三個(gè)目標(biāo):重用性、靈活性和擴(kuò)展性。PHP在4.0版本之后完善了對(duì)OOP的支持了。對(duì)于小型的應(yīng)用,使用傳統(tǒng)的過程化編程可能更簡單也更有效率。然而對(duì)于大型的復(fù)雜應(yīng)用時(shí),OOP就是一個(gè)不得不考慮的選擇。類類是具有相同屬性和服務(wù)的一組對(duì)象的集合。它為屬于該類的所有對(duì)象提供了統(tǒng)一的抽象描述,其內(nèi)部包括屬性和服務(wù)兩個(gè)主要部分。在面向?qū)ο蟮木幊陶Z言中,類是一個(gè)獨(dú)立的程序單位,它應(yīng)該有一個(gè)類名并包括屬性說明和服務(wù)說明兩個(gè)主要部分。對(duì)象對(duì)象是系統(tǒng)中用來描述客觀事物的一個(gè)實(shí)體,它是構(gòu)成系統(tǒng)的一個(gè)基本單位。一個(gè)對(duì)象由一組屬性和對(duì)這組屬性進(jìn)行操作的一組服務(wù)組成。01類與對(duì)象的關(guān)系就如模具和鑄件的關(guān)系,類的實(shí)例化結(jié)果就是對(duì)象,而對(duì)一類對(duì)象的抽象就是類。02關(guān)于面向?qū)ο蟮木幊躺婕暗膬?nèi)容很廣泛,本章只介紹基本的概念與在PHP中的應(yīng)用。03對(duì)象1.1類使用關(guān)鍵字class來聲明一個(gè)類,后面緊跟類的名字,主體用{}符號(hào)括起來。語法:classclass_name{......}類里面包含了屬性和方法。對(duì)象1.2屬性通過在類定義中使用關(guān)鍵字var來聲明變量,即創(chuàng)建了類的屬性,也叫類的成員屬性。語法:classclass_name{var$var_name;}舉個(gè)實(shí)例說明,如果定義一個(gè)人的類,那么人的姓名、年齡、性別等等便可以看做人這個(gè)類的屬性。對(duì)象1.3方法01通過在類定義中聲明函數(shù),即創(chuàng)建了類的方法。02語法:03classclass_name{04functionfunction_name(arg1,arg2,……)05{06函數(shù)功能代碼07}08}對(duì)象1.4類的應(yīng)用一個(gè)定義了屬性和方法的類就是一個(gè)完整的類了,可以在一個(gè)類里面包含一個(gè)完整的處理邏輯。使用new關(guān)鍵字來實(shí)例化一個(gè)對(duì)象以便應(yīng)用類里面的邏輯。可以同時(shí)實(shí)例化多個(gè)對(duì)象。語法:object=newclass_name();實(shí)例化一個(gè)對(duì)象后,使用->操作符來訪問對(duì)象的成員屬性和方法。語法:object->var_name;object->function_name;如果要在定義的類里面訪問成員的屬性或者方法,可以使用偽變量$this。$this用于表示當(dāng)前對(duì)象或?qū)ο蟊旧怼?2類的定義及應(yīng)用實(shí)例1:類的定義及應(yīng)用<?phpclassPerson{
//人的成員屬性
var$name;
//人的名字
var$age;
//人的年齡
//人的成員say()方法
functionsay(){
echo"我的名字叫:".$this->name."<br/>"; echo"我的年齡是:".$this->age;
}}
//類定義結(jié)束//實(shí)例化一個(gè)對(duì)象$p1=newPerson();//給$p1對(duì)象屬性賦值$p1->name="張三";
$p1->age=20;//調(diào)用對(duì)象中的say()方法$p1->say();?>實(shí)例1:類的定義及應(yīng)用運(yùn)行該實(shí)例,輸出:我的名字叫:張三我的年齡是:20上面的實(shí)例演示了一個(gè)簡單的基于面向?qū)ο蟮腜HP應(yīng)用。謝謝5.2PHP類的繼承extends關(guān)鍵字、構(gòu)造__construct()與析構(gòu)__destruct()方法陳學(xué)平011PHP類的繼承extends關(guān)鍵字022
PHP構(gòu)造方法__construct()目錄033PHP析構(gòu)方法__destruct()012PHP類的繼承extends關(guān)鍵字2PHP類的繼承extends關(guān)鍵字PHP類的繼承是指建立一個(gè)新的派生類,從一個(gè)或多個(gè)先前定義的類中繼承數(shù)據(jù)和方法,而且可以重新定義或加進(jìn)新數(shù)據(jù)和方法,從而建立了類的層次或等級(jí)。將已存在的用來派生新類的類為父類,由已存在的類派生出的新類為子類。繼承是面向?qū)ο蟮娜筇匦灾弧T赑HP中,一個(gè)類只能直接從一個(gè)類中繼承數(shù)據(jù),即單繼承。使用extends關(guān)鍵字來定義類的繼承:class子類extends父類{}2PHP類的繼承extends關(guān)鍵字實(shí)例2使用
extends關(guān)鍵字來定義類的繼承實(shí)例代碼如下:<?phpclassPerson{
var$name;
var$age;
functionsay(){
echo"我的名字叫:".$this->name."<br/>"; echo"我的年齡是:".$this->age;
}}2PHP類的繼承extends關(guān)鍵字//類的繼承classStudentextendsPerson{
var$school;
//學(xué)生所在學(xué)校的屬性
functionstudy(){
echo"我的名字叫:".$this->name."<br/>";
echo"我正在".$this->school."學(xué)習(xí)";
} }$t1=newStudent();$t1->name="張三";$t1->school="人民大學(xué)";$t1->study();?>022PHP構(gòu)造方法__construct()2PHP構(gòu)造方法__construct()5.3PHP構(gòu)造方法__construct()PHP構(gòu)造方法__construct()允許在實(shí)例化一個(gè)類之前先執(zhí)行構(gòu)造方法。構(gòu)造方法是類中的一個(gè)特殊方法。當(dāng)使用new操作符創(chuàng)建一個(gè)類的實(shí)例時(shí),構(gòu)造方法將會(huì)自動(dòng)調(diào)用,其名稱必須是__construct()。在一個(gè)類中只能聲明一個(gè)構(gòu)造方法,而是只有在每次創(chuàng)建對(duì)象的時(shí)候都會(huì)去調(diào)用一次構(gòu)造方法,不能主動(dòng)的調(diào)用這個(gè)方法,所以通常用它執(zhí)行一些有用的初始化任務(wù)。該方法無返回值。語法:function__construct(arg1,arg2,...){......PHP構(gòu)造方法實(shí)例3:PHP構(gòu)造方法
__construct()的使用實(shí)例代碼如下:<?phpclassPerson{
var$name;
var$age;
//定義一個(gè)構(gòu)造方法初始化賦值
function__construct($name,$age){
$this->name=$name;
$this->age=$age;
}
functionsay(){
echo"我的名字叫:".$this->name."<br/>"; echo"我的年齡是:".$this->age;
}}$p1=newPerson("張三",20);$p1->say();?>PHP構(gòu)造方法運(yùn)行該實(shí)例,輸出:我的名字叫:張三我的年齡是:20在該實(shí)例中,通過構(gòu)造方法對(duì)對(duì)象屬性進(jìn)行初始化賦值。提示PHP不會(huì)在本類的構(gòu)造方法中再自動(dòng)的調(diào)用父類的構(gòu)造方法。要執(zhí)行父類的構(gòu)造方法,需要在子類的構(gòu)造方法中調(diào)用parent::__construct()。033PHP析構(gòu)方法__destruct()4PHP析構(gòu)方法__destruct()PHP析構(gòu)方法__destruct()允許在銷毀一個(gè)類之前執(zhí)行執(zhí)行析構(gòu)方法。析構(gòu)方法與構(gòu)造方法對(duì)應(yīng)的就是析構(gòu)方法,析構(gòu)方法允許在銷毀一個(gè)類之前執(zhí)行的一些操作或完成一些功能,比如說關(guān)閉文件、釋放結(jié)果集等。析構(gòu)函數(shù)不能帶有任何參數(shù),其名稱必須是__destruct()。語法:function__destruct(){......}4PHP析構(gòu)方法__destruct()在上面的實(shí)例中加入下面的析構(gòu)方法://定義一個(gè)析構(gòu)方法function__destruct(){
echo"再見".$this->name;}4PHP析構(gòu)方法__destruct()提示和構(gòu)造方法一樣,PHP不會(huì)在本類中自動(dòng)的調(diào)用父類的析構(gòu)方法。要執(zhí)行父類的析構(gòu)方法,必須在子類的析構(gòu)方法體中手動(dòng)調(diào)用parent::__destruct()。試圖在析構(gòu)函數(shù)中拋出一個(gè)異常會(huì)導(dǎo)致致命錯(cuò)誤。在PHP4版本中,構(gòu)造方法的名稱必須與類名相同,且沒有析構(gòu)方法。謝謝5.5PHPfinal關(guān)鍵字陳學(xué)平
015PHPfinal關(guān)鍵字5PHPfinal關(guān)鍵字final關(guān)鍵字。final關(guān)鍵字用于定義類和方法,該關(guān)鍵字表示該類或方法為最終版本,即該類不能被繼承,或該方法在子類中不能被重載(覆蓋)。類使用final關(guān)鍵字的實(shí)例:finalclassPerson{......}final定義的類被繼承時(shí)會(huì)提示如下錯(cuò)誤:Fatalerror:ClassStudentmaynotinheritfromfinalclass(Person)in...5PHPfinal關(guān)鍵字classPerson{
finalfunctionsay()
{
......
}}025PHP類的接口6.1PHP接口PHP類是單繼承,也就是不支持多繼承,當(dāng)一個(gè)類需要多個(gè)類的功能時(shí),繼承就無能為力了,為此PHP引入了類的接口技術(shù)。如果一個(gè)抽象類里面的所有方法都是抽象方法,且沒有聲明變量,而且接口里面所有的成員都是public權(quán)限的,那么這種特殊的抽象類就叫接口。接口使用關(guān)鍵字interface來定義,并使用關(guān)鍵字implements來實(shí)現(xiàn)接口中的方法,且必須完全實(shí)現(xiàn)。實(shí)例4使用關(guān)鍵字interface定義接口,并使用關(guān)鍵字implements實(shí)現(xiàn)接口中的方法實(shí)例代碼如下:<?php6.1PHP接口<?php//定義接口interfaceUser{
functiongetDiscount();
functiongetUserType();}//VIP用戶接口實(shí)現(xiàn)classVipUserimplementsUser{
//VIP用戶折扣系數(shù)
private$discount=0.8;
functiongetDiscount(){
return$this->discount;
}
functiongetUserType(){
return"VIP用戶";
}}6.1PHP接口classGoods{
var$price=100;
var$vc;
//定義User接口類型參數(shù),這時(shí)并不知道是什么用戶
functionrun(User$vc){
$this->vc=$vc;
$discount=$this->vc->getDiscount(); $usertype=$this->vc->getUserType();
echo$usertype."商品價(jià)格:".$this->price*$discount;
}}$display=newGoods();$display->run(newVipUser); //可以是更多其他用戶類型?>6.1PHP接口運(yùn)行該實(shí)例,輸出:VIP用戶商品價(jià)格:80元該實(shí)例演示了一個(gè)PHP接口的簡單應(yīng)用。該實(shí)例中,User接口實(shí)現(xiàn)用戶的折扣,而在VipUser類里面實(shí)現(xiàn)了具體的折扣系數(shù)。最后商品類Goods根據(jù)User接口來實(shí)現(xiàn)不同的用戶報(bào)價(jià)。該實(shí)例僅限于演示PHP接口的用法,不涉及其科學(xué)與否。6.2實(shí)現(xiàn)多個(gè)接口PHP也可以在繼承一個(gè)類的時(shí)候同時(shí)實(shí)現(xiàn)多個(gè)接口:class子類extends父類implemtns接口1,接口2,...{......}6.3抽象類和接口的區(qū)別接口是特殊的抽象類,也可以看做是一個(gè)模型的規(guī)范。接口與抽象類大致區(qū)別如下:一個(gè)子類如果implements一個(gè)接口,就必須實(shí)現(xiàn)接口中的所有方法(不管是否需要);如果是繼承一個(gè)抽象類,只需要實(shí)現(xiàn)需要的方法即可。如果一個(gè)接口中定義的方法名改變了,那么所有實(shí)現(xiàn)此接口的子類需要同步更新方法名;而抽象類中如果方法名改變了,其子類對(duì)應(yīng)的方法名將不受影響,只是變成了一個(gè)新的方法而已(相對(duì)老的方法實(shí)現(xiàn))。抽象類只能單繼承,當(dāng)一個(gè)子類需要實(shí)現(xiàn)的功能需要繼承自多個(gè)父類時(shí),就必須使用接口。謝謝5.7PHP類的訪問控制與封裝陳學(xué)平
017PHP類的訪問控制與封裝7PHP類的訪問控制與封裝PHP中通過在前面添加訪問修飾符public、protected或private來實(shí)現(xiàn)對(duì)屬性或方法的訪問控制。7.1訪問控制類型的訪問修飾符允許開發(fā)人員對(duì)類成員的訪問進(jìn)行控制,這是面向?qū)ο驩OP語言的一個(gè)特性。PHP支持如下三種訪問修飾符:public(公有的):類中的成員將沒有訪問限制,所有的外部成員都可以訪問(讀和寫)這個(gè)類成員(包括成員屬性和成員方法)。如果類的成員沒有指定成員訪問修飾符,將被視為public。protected(受保護(hù)的):被定義為protected的成員不能被該類的外部代碼訪問,但該類的子類具有訪問權(quán)限。private(私有的):被定義為private的成員,允許同一個(gè)類里的所有成員訪問,但對(duì)于該類的外部代碼和子類都不允許訪問。7.1訪問控制提示在子類覆蓋父類的方法時(shí),子類中方法的訪問權(quán)限不能低于父類被覆蓋方法的訪問權(quán)限。7.2封裝封裝,就是把類(對(duì)象)的屬性和服務(wù)結(jié)合成一個(gè)獨(dú)立的單位,并盡可能隱藏內(nèi)部的細(xì)節(jié),只保留必要的接口與外部發(fā)生聯(lián)系。這種封裝特性,有效的保證了對(duì)象的獨(dú)立性,使軟件錯(cuò)誤能夠局部化,大大減少查錯(cuò)和排錯(cuò)的難度。使用private關(guān)鍵字來對(duì)屬性和方法進(jìn)行封裝:實(shí)例5使用private關(guān)鍵字對(duì)屬性和方法進(jìn)行封裝實(shí)例代碼如下:<?phpclassPerson{//將成員屬性定義為privateprivate$name;7.2封裝
private$age;
//定義一個(gè)構(gòu)造方法初始化賦值
function__construct($name,$age){
$this->name=$name;
$this->age=$age;
}
functionsay(){
echo"我的名字叫:".$this->name."<br/>"; echo"我的年齡是:".$this->age;
}}$p1=newPerson("張三",20);$p1->say();?>謝謝5.8PHP自動(dòng)加載類、范圍操作解析符陳學(xué)平8PHP自動(dòng)加載類9.3::訪問父類覆蓋成員和方法的實(shí)例9.2::訪問靜態(tài)成員、方法實(shí)例9范圍解析操作符(::)目錄018PHP自動(dòng)加載類8PHP自動(dòng)加載類__autoload()方法用于自動(dòng)加載類。在實(shí)際項(xiàng)目中,不可能把所有的類都寫在一個(gè)PHP文件中,當(dāng)在一個(gè)PHP文件中需要調(diào)用另一個(gè)文件中聲明的類時(shí),就需要通過include把這個(gè)文件引入。不過有的時(shí)候,在文件眾多的項(xiàng)目中,要一一將所需類的文件都include進(jìn)來,需要在每個(gè)類文件開頭寫一個(gè)長長的包含文件的列表。那么能不能在使用類的時(shí)候,再把這個(gè)類所在的php文件導(dǎo)入呢?為此,PHP提供了__autoload()方法,它會(huì)在試圖使用尚未被定義的類時(shí)自動(dòng)調(diào)用。通過調(diào)用此函數(shù),腳本引擎在PHP出錯(cuò)失敗前有了最后一個(gè)機(jī)會(huì)加載所需的類。8PHP自動(dòng)加載類__autoload()方法接收的一個(gè)參數(shù),就是欲加載的類的類名,所以這時(shí)候需要類名與文件名對(duì)應(yīng),如Person.php,對(duì)應(yīng)的類名就是Pserson。實(shí)例6_使用_autoload()方法自動(dòng)加載類實(shí)例代碼如下:Pserson.php<?phpclassPerson{private$name;private$age;
function__construct($name,$age){
$this->name=$name;
$this->age=$age;
}
functionsay(){ echo"我的名字叫:".$this->name."<br/>"; echo"我的年齡是:".$this->age;
}}?>8PHP自動(dòng)加載類test.php<?phpfunction__autoload($class_name){require_once$class_name.'.php';}//當(dāng)前頁面Pserson類不存在則自動(dòng)調(diào)用__autoload()方法,傳入?yún)?shù)Person$p1=newPerson("張三","20");$p1->say();?>運(yùn)行test.php,輸出:我的名字叫:張三我的年齡是:20高版本PHP使用下面的方式調(diào)用spl_autoload_register(function($class){$file='classes/'.$class.'.class.php';if(file_exists($file)){require$file;}});029范圍解析操作符(::)9.1范圍解析操作符(::)范圍解析操作符(::)是一對(duì)冒號(hào),可以用于訪問靜態(tài)成員、方法和常量,以及被覆蓋類中的成員和方法。當(dāng)在類的外部使用::符號(hào)訪問這些靜態(tài)成員、方法和常量時(shí),必須使用類的名字,如下面實(shí)例所示。039.2::訪問靜態(tài)成員、方法實(shí)例9.2::訪問靜態(tài)成員、方法實(shí)例<?phpClassPerson{
//定義靜態(tài)成員屬性
publicstatic$country="中國";
//定義靜態(tài)成員方法
publicstaticfunctionmyCountry(){
//內(nèi)部訪問靜態(tài)成員屬性
echo"我是".self::$country."人<br/>";
}}//輸出靜態(tài)成員屬性值echoPerson::$country."<br/>";//訪問靜態(tài)方法Person::myC輸出結(jié)果中國我是中國人使用
::符號(hào)訪問靜態(tài)成員及方法參考PHP靜態(tài)(static)。049.3::訪問父類覆蓋成員和方法的實(shí)例9.3::訪問父類覆蓋成員和方法的實(shí)例實(shí)例8使用::訪問父類覆蓋成員和方法實(shí)例代碼如下:<?phpclassPerson{
var$name;
var$sex;
var$age;
functionsay(){
echo"我的名字叫:".$this->name."<br/>";
echo"性別:".$this->sex."<br/>";
echo"我的年齡是:".$this->age;
}}9.3::訪問父類覆蓋成員和方法的實(shí)例classStudentextendsPerson{
var$school;
functionsay(){
parent::say();
echo"我在".$this->school."上學(xué)";
}}//$P1=newPerson();
$P2=newStudent();$P2->name="張三";$P2->sex="男";$P2->age=20;$P2->say();輸出結(jié)果輸出結(jié)果我的名字叫:張三性別:男我的年齡是:20我在上學(xué)
謝謝5.10PHP類的靜態(tài)成員屬性與靜態(tài)方法演講人0110PHP類的靜態(tài)成員屬性與靜態(tài)方法10PHP類的靜態(tài)成員屬性與靜態(tài)方法PHP類中定義靜態(tài)的成員屬性和方法使用static關(guān)鍵字。10.1靜態(tài)static聲明類成員或方法為static,就可以不實(shí)例化類而直接訪問,不能通過一個(gè)對(duì)象來訪問其中的靜態(tài)成員(靜態(tài)方法除外)。靜態(tài)成員屬于類,不屬于任何對(duì)象實(shí)例,但類的對(duì)象實(shí)例都能共享。10.1靜態(tài)static實(shí)例9使用static聲明類成員或方法實(shí)例9使用static聲明類成員或方法實(shí)例代碼如下:<?phpClassPerson{
//定義靜態(tài)成員屬性
publicstatic$country="中國";
//定義靜態(tài)成員方法
publicstaticfunctionmyCountry(){
//內(nèi)部訪問靜態(tài)成員屬性
echo"我是".self::$country."人<br/>";
}}10.1靜態(tài)static實(shí)例9使用static聲明類成員或方法classStudentextendsPerson{
functionstudy(){
echo"我是".parent::$country."人<br/>";
}}//輸出成員屬性值echoPerson::$country."<br/>"; //輸出:中國$p1=newPerson();//echo$p1->country; //錯(cuò)誤寫法//訪問靜態(tài)成員方法Person::myCountry(); //輸出:我是中國人//靜態(tài)方法也可通過對(duì)象訪問:$p1->myCountry();//子類中輸出成員屬性值echoStudent::$country."<br/>"; //輸出:中國$t1=newStudent();$t1->study(); //輸出:我是中國人?>運(yùn)行該實(shí)例,輸出:中國我是中國人我是中國人中國我是中國人10.2靜態(tài)屬性方法在類內(nèi)部訪問靜態(tài)成員屬性或者方法,使用
self::(注意不是$slef),如:slef::$countryslef::myCountry()在子類訪問父類靜態(tài)成員屬性或方法,使用
parent::(注意不是$parent),如:parent::$countryparent::myCountry()外部訪問靜態(tài)成員屬性和方法為類名/子類名::,如:Person::$countryPerson::myCountry()Student::$country但靜態(tài)方法也可以通過普通對(duì)象的方式訪問。謝謝5.11PHP常量(const)演講人目錄01.11PHP常量(const)02.12PHP特殊方法03.12.1__set()04.12.2__get()05.12.3__isset()06.12.4__unset()11PHP常量(const)實(shí)例10:使用const關(guān)鍵字定義常量實(shí)例代碼如下:<?phpClassPerson{
//定義常量
constcountry="中國";
publicfunctionmyCountry(){
//內(nèi)部訪問常量
echo"我是".self::country."人<br/>";
}}//輸出常量echoPerson::country."<br/>";//訪問方法$p1=newPerson();$p1->myCountry();?>運(yùn)行該實(shí)例輸出:中國我是中國人常量的值一旦被定義后就不可在程序中更改。12PHP特殊方法PHP的類的特殊方法如下__set()方法用于設(shè)置私有屬性值。__get()方法用于獲取私有屬性值。__isset()方法用于檢測(cè)私有屬性值是否被設(shè)定。__unset()方法用于刪除私有屬性。實(shí)際應(yīng)用中,經(jīng)常會(huì)把類的屬性設(shè)置為私有(private),那么需要對(duì)屬性進(jìn)行訪問時(shí),就會(huì)變得麻煩。雖然可以將對(duì)屬性的訪問寫成一個(gè)方法來實(shí)現(xiàn),但PHP提供了一些特殊方法來方便此類操作。12.1__set()__set()方法用于設(shè)置私有屬性值:語法如下:function__set($property_name,$value){$this->$property_name=$value;}在類里面使用了__set()方法后,當(dāng)使用$p1->name="張三";這樣的方式去設(shè)置對(duì)象私有屬性的值時(shí),就會(huì)自動(dòng)調(diào)用__set()方法來設(shè)置私有屬性的值。12.2__get()__get()方法用于獲取私有屬性值:語法如下:function__set($property_name,$value){returnisset($this->$property_name)?$this->$property_name:null;}實(shí)例11:__合適get()方法獲取私有屬性值實(shí)例代碼如下:<?php12.2__get()classPerson{private$name;private$sex;private$age;//__set()方法用來設(shè)置私有屬性function__set($property_name,$value){echo"在直接設(shè)置私有屬性值的時(shí)候,自動(dòng)調(diào)用了這個(gè)__set()方法為私有屬性賦值<br/>";$this->$property_name=$value;}12.2__get()//__get()方法用來獲取私有屬性function__get($property_name){echo"在直接獲取私有屬性值的時(shí)候,自動(dòng)調(diào)用了這個(gè)__get()方法<br/>";returnisset($this->$property_name)?$this->$property_name:null;}}$p1=newPerson();//直接為私有屬性賦值的操作,會(huì)自動(dòng)調(diào)用__set()方法進(jìn)行賦值12.2__get()$p1->name="張三";//直接獲取私有屬性的值,會(huì)自動(dòng)調(diào)用__get()方法,返回成員屬性的值echo"我的名字叫:".$p1->name;?>運(yùn)行該實(shí)例,輸出:在直接設(shè)置私有屬性值的時(shí)候,自動(dòng)調(diào)用了這個(gè)__set()方法為私有屬性賦值在直接獲取私有屬性值的時(shí)候,自動(dòng)調(diào)用了這個(gè)__get()方法我的名字叫:張三12.3__isset()__isset()方法用于檢測(cè)私有屬性值是否被設(shè)定。如果對(duì)象里面成員是公有的,可以直接使用isset()函數(shù)。如果是私有的成員屬性,那就需要在類里面加上一個(gè)__isset()方法。語法如下:privatefunction__isset($property_name){returnisset($this->$property_name);}這樣當(dāng)在類外部使用isset()函數(shù)來測(cè)定對(duì)象里面的私有成員是否被設(shè)定時(shí),就會(huì)自動(dòng)調(diào)用__isset()方法來檢測(cè)。12.4__unset()__unset()方法用于刪除私有屬性。同isset()函數(shù)一樣,unset()函數(shù)只能刪除對(duì)象的公有成員屬性,當(dāng)要?jiǎng)h除對(duì)象內(nèi)部的私有成員屬性時(shí),需要使用__unset()方法。語法如下:privatefunction__unset($property_name){unset($this->$property_name);}謝謝PHP重載與重載方法陳學(xué)平13PHP重載0114PHP重載方法02目錄0113PHP重載13.1PHP重載一個(gè)類中的方法與另一個(gè)方法同名,但是參數(shù)不同,這種方法稱之為重載方法。因?yàn)镻HP是弱類型的語言,所以在方法的參數(shù)中本身就可以接收不同類型的數(shù)據(jù),又因?yàn)镻HP的方法可以接收不定個(gè)數(shù)的參數(shù),所以在PHP里面沒有嚴(yán)格意義上的方法重載。PHP中的重載是指在子類里面定義了一個(gè)和父類同名的方法,且該方法將在子類中將把父類的方法覆蓋。在子類中,因?yàn)閺母割惱^承過來的方法可能無法訪問子類定義的屬性或方法,所以有時(shí)候重載是必要的。13.1PHP重載實(shí)例12PHP的重載實(shí)例代碼如下:1classPerson{2var$name;3var$age;4functionsay(){5echo"我的名字叫:".$this->name."<br/>";6echo"我的年齡是:".$this->age;7}8}9<?php1013.1PHP重載實(shí)例12PHP的重載//類的繼承1var$school;//學(xué)生所在學(xué)校的屬性2functionsay(){3echo"我的名字叫:".$this->name."<br/>";4echo"我的年齡是:".$this->age."<br/>";5echo"我正在".$this->school."學(xué)習(xí)";6}7}8$t1=newStudent();9classStudentextendsPerson{1013.1PHP重載實(shí)例12PHP的重載$t1->name="張三";$t1->age="18";$t1->school="人民大學(xué)";$t1->say();?>運(yùn)行該實(shí)例,輸出:我的名子叫:張三我的年齡是:18我正在人民大學(xué)學(xué)習(xí)提示如果父類定義方法時(shí)使用了final關(guān)鍵字,則不允許被子類方法覆蓋。13.2訪問父類被覆蓋的方法可以通過::符號(hào)來訪問父類被覆蓋的方法或成員屬性。語法如下:functionsay(){parent::say();//或者Person::say();echo"我在".$this->school."上學(xué)<br/>";}范圍解析操作符::用法可以查看前面的相關(guān)介紹。0214PHP重載方法14PHP重載方法__call()方法用于監(jiān)視錯(cuò)誤的方法調(diào)用。為了避免當(dāng)調(diào)用的方法不存在時(shí)產(chǎn)生錯(cuò)誤,可以使用__call()方法來避免。該方法在調(diào)用的方法不存在時(shí)會(huì)自動(dòng)調(diào)用,程序仍會(huì)繼續(xù)執(zhí)行下去。語法如下:function__call(string$function_name,array$arguments){......}14PHP重載方法該方法有兩個(gè)參數(shù),第一個(gè)參數(shù)$function_name會(huì)自動(dòng)接收不存在的方法名,第二個(gè)$args則以數(shù)組的方式接收不存在方法的多個(gè)參數(shù)。在類里面加入:function__call($function_name,$args){echo"你所調(diào)用的函數(shù):$function_name(參數(shù):<br/>";var_dump($args);echo")不存在!";}當(dāng)調(diào)用一個(gè)不存在的方法時(shí)(如test()方法):14PHP重載方法$p1=newPerson();$p1->test(2,"test");輸出的結(jié)果如下:你所調(diào)用的函數(shù):test(參數(shù):array(2){
[0]=>int(2)
[1]=>string(4)"test"})不存在!
謝謝PHP抽象方法與抽象類、對(duì)象克隆演講人15PHP抽象方法與抽象類0116PHP對(duì)象克隆03抽象方法的實(shí)現(xiàn)02目錄0115PHP抽象方法與抽象類15.1抽象方法01抽象方法指沒有方法體的方法,具體就是在方法聲明的時(shí)候沒有{}括弧以及其中的內(nèi)容,而是直接在聲明時(shí)在方法名后加上分號(hào)結(jié)束。02abstract關(guān)鍵字用于定義抽象方法,語法如下:03abstractfunctionfunction_name();abstract關(guān)鍵字用于定義抽象方法與抽象類。15.2抽象類只要一個(gè)類里面有一個(gè)方法是抽象方法,那么這個(gè)類就要定義為抽象類。抽象類同樣用abstract關(guān)鍵字來定義。抽象類不能產(chǎn)生實(shí)例對(duì)象,通常是將抽象方法做為子類方法重載的模板使用的,且要把繼承的抽象類里的方法都實(shí)現(xiàn)。實(shí)際上抽象類是方便繼承而引入的。實(shí)例13:使用abstract關(guān)鍵字定義抽象類實(shí)例代碼如下:<?phpabstractclassAbstractClass{//定義抽象方法abstractprotectedfunctiongetValue();15.2抽象類//普通方法publicfunctionprintOut(){print$this->getValue()."<br/>";}}classConcreteClassextendsAbstractClass{protectedfunctiongetValue(){return"抽象方法的實(shí)現(xiàn)";}}}$class1=newConcreteClass;$class1->printOut();?>輸出結(jié)果抽象方法的實(shí)現(xiàn)在這個(gè)實(shí)例中,父類定義了抽象方法以及對(duì)于方法的實(shí)現(xiàn),但實(shí)際的內(nèi)容卻在子類里定義。02抽象方法的實(shí)現(xiàn)抽象方法的實(shí)現(xiàn)在這個(gè)實(shí)例中,父類定義了抽象方法以及對(duì)于方法的實(shí)現(xiàn),但實(shí)際的內(nèi)容卻在子類里定義。0316PHP對(duì)象克隆16PHP對(duì)象克隆clone關(guān)鍵字用于克隆一個(gè)完全一樣的對(duì)象,__clone()方法來重寫原本的屬性和方法。16.1對(duì)象克隆關(guān)鍵字需要在一個(gè)項(xiàng)目里面使用兩個(gè)或多個(gè)一樣的對(duì)象,如果使用new關(guān)鍵字重新創(chuàng)建對(duì)象,再賦值上相同的屬性,這樣做比較煩瑣而且也容易出錯(cuò)。PHP提供了對(duì)象克隆功能,可以根據(jù)一個(gè)對(duì)象完全克隆出一個(gè)一模一樣的對(duì)象,而且克隆以后,兩個(gè)對(duì)象互不干擾。使用關(guān)鍵字clone來克隆對(duì)象。語法:$object2=clone$object;實(shí)例14使用關(guān)鍵字clone來克隆對(duì)象實(shí)例代碼如下:<?phpclassPerson{private$name;16.1對(duì)象克隆關(guān)鍵字
private$age;
function__construct($name,$age){
$this->name=$name;
$this->age=$age;
}
functionsay(){
echo"我的名字叫:".$this->name."<br/>"; echo"我的年齡是:".$this->age;
}}$p1=newPerson("張三",20);$p2=clone$p1;$p2->say();?>運(yùn)行實(shí)例,輸出:我的名字叫:張三我的年齡是:2016.2__clone()方法如果想在克隆后改變?cè)瓕?duì)象的內(nèi)容,需要在類中添加一個(gè)特殊的__clone()方法來重寫原本的屬性和方法。__clone()方法只會(huì)在對(duì)象被克隆的時(shí)候自動(dòng)調(diào)用。實(shí)例15:使用_clone()方法重寫對(duì)象原來的屬性和方法實(shí)例代碼如下:<?phpclassPerson{private$name;private$age;function__construct($name,$age){16.2__clone()方法
$this->name=$name;
$this->age=$age;
}
functionsay(){
echo"我的名字叫:".$this->name; echo"我的年齡是:".$this->age."<br/>";
}
function__clone(){
$this->name="我是假的".$this->name;
$this->age=30;
}}$p1=newPerson("張三",20);$p1->say();$p2=clone$p1;$p2->say();?>16.2__clone()方法輸出結(jié)果我的名字叫:張三我的年齡是:20我的名字叫:我是假的張三我的年齡是:30謝謝PHP對(duì)象的存儲(chǔ)與傳輸、注冊(cè)為session變量陳學(xué)平0117PHP對(duì)象的存儲(chǔ)與傳輸17.1對(duì)象的存儲(chǔ)與傳輸在實(shí)際項(xiàng)目應(yīng)用中,有些任務(wù)在一兩個(gè)頁面是無法完成的,由于變量到腳本執(zhí)行完畢就釋放,本頁所生成的對(duì)象想在其它頁面使用時(shí)便碰到了麻煩。如果需要將對(duì)象及其方法傳遞到想使用對(duì)象的頁面,比較簡單可行的辦法是將對(duì)象序列化后存儲(chǔ)起來或直接傳輸給需要的頁面,另一種辦法是將對(duì)象注冊(cè)為session變量。17.2序列化對(duì)象對(duì)象序列化,就是將對(duì)象轉(zhuǎn)換成可以存儲(chǔ)的字節(jié)流。當(dāng)需要把一個(gè)對(duì)象在網(wǎng)絡(luò)中傳輸時(shí)或者要把對(duì)象寫入文件或是數(shù)據(jù)庫時(shí),就需要將對(duì)象進(jìn)行序列化。序列化完整過程包括兩個(gè)步驟:一個(gè)是序列化,就是把對(duì)象轉(zhuǎn)化為二進(jìn)制的字符串,serialize()函數(shù)用于序列化一個(gè)對(duì)象;另一個(gè)是反序列化,就是把對(duì)象被序列轉(zhuǎn)化的二進(jìn)制字
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 32151.31-2024溫室氣體排放核算與報(bào)告要求第31部分:木材加工企業(yè)
- 2024藕塘承包與農(nóng)業(yè)產(chǎn)業(yè)化發(fā)展合作合同范本3篇
- 2024房租租賃合同補(bǔ)充協(xié)議
- 2019年7月國家開放大學(xué)專科《高等數(shù)學(xué)基礎(chǔ)》期末紙質(zhì)考試試題及答案
- 焦慮癥健康宣教
- 2024年解除婚姻關(guān)系后贍養(yǎng)費(fèi)協(xié)議
- 2024水電安裝勞務(wù)分包合同協(xié)議書-農(nóng)村飲水安全工程專用3篇
- 2024某電子商務(wù)公司與社交媒體平臺(tái)廣告投放合同
- 福建省南平市太平鎮(zhèn)中學(xué)高三數(shù)學(xué)理期末試卷含解析
- 2024洗滌服務(wù)綠色環(huán)保材料采購合同書3篇
- 2025寒假散學(xué)典禮(休業(yè)式)上校長精彩講話:以董宇輝的創(chuàng)新、羅振宇的堅(jiān)持、馬龍的熱愛啟迪未來
- 2025年浙江中外運(yùn)有限公司招聘筆試參考題庫含答案解析
- 《皮膚病中成藥導(dǎo)引》課件
- 建筑公司2025年度工作總結(jié)和2025年工作安排計(jì)劃
- 2023-2024學(xué)年廣東省廣州市越秀區(qū)九年級(jí)(上)期末物理試卷(含答案)
- 太空軍事法律問題-洞察分析
- 2024年行政執(zhí)法人員資格考試必考知識(shí)題庫及答案(共250題)
- 電壓損失計(jì)算表
- 福建省福州市2023-2024學(xué)年高二上學(xué)期期末測(cè)試英語試卷(含答案)
- 二零二四年風(fēng)力發(fā)電項(xiàng)目EPC總承包合同
- 汽車維修開發(fā)票協(xié)議書
評(píng)論
0/150
提交評(píng)論