PHP程序設(shè)計基礎(chǔ)(微課版)(第2版)課件 第5章 PHP 面向?qū)ο缶幊蘝第1頁
PHP程序設(shè)計基礎(chǔ)(微課版)(第2版)課件 第5章 PHP 面向?qū)ο缶幊蘝第2頁
PHP程序設(shè)計基礎(chǔ)(微課版)(第2版)課件 第5章 PHP 面向?qū)ο缶幊蘝第3頁
PHP程序設(shè)計基礎(chǔ)(微課版)(第2版)課件 第5章 PHP 面向?qū)ο缶幊蘝第4頁
PHP程序設(shè)計基礎(chǔ)(微課版)(第2版)課件 第5章 PHP 面向?qū)ο缶幊蘝第5頁
已閱讀5頁,還剩121頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

5.1PHP類與對象陳學(xué)平1PHP類與對象01類的定義及應(yīng)用02目錄011PHP類與對象基本概念面向?qū)ο缶幊蹋∣bjectOrientedProgramming,OOP,面向?qū)ο蟪绦蛟O(shè)計)是一種計算機編程架構(gòu)。OOP的一條基本原則是計算機程序是由單個能夠起到子程序作用的單元或?qū)ο蠼M合而成。OOP達到了軟件工程的三個目標(biāo):重用性、靈活性和擴展性。PHP在4.0版本之后完善了對OOP的支持了。對于小型的應(yīng)用,使用傳統(tǒng)的過程化編程可能更簡單也更有效率。然而對于大型的復(fù)雜應(yīng)用時,OOP就是一個不得不考慮的選擇。類類是具有相同屬性和服務(wù)的一組對象的集合。它為屬于該類的所有對象提供了統(tǒng)一的抽象描述,其內(nèi)部包括屬性和服務(wù)兩個主要部分。在面向?qū)ο蟮木幊陶Z言中,類是一個獨立的程序單位,它應(yīng)該有一個類名并包括屬性說明和服務(wù)說明兩個主要部分。對象對象是系統(tǒng)中用來描述客觀事物的一個實體,它是構(gòu)成系統(tǒng)的一個基本單位。一個對象由一組屬性和對這組屬性進行操作的一組服務(wù)組成。01類與對象的關(guān)系就如模具和鑄件的關(guān)系,類的實例化結(jié)果就是對象,而對一類對象的抽象就是類。02關(guān)于面向?qū)ο蟮木幊躺婕暗膬?nèi)容很廣泛,本章只介紹基本的概念與在PHP中的應(yīng)用。03對象1.1類使用關(guān)鍵字class來聲明一個類,后面緊跟類的名字,主體用{}符號括起來。語法:classclass_name{......}類里面包含了屬性和方法。對象1.2屬性通過在類定義中使用關(guān)鍵字var來聲明變量,即創(chuàng)建了類的屬性,也叫類的成員屬性。語法:classclass_name{var$var_name;}舉個實例說明,如果定義一個人的類,那么人的姓名、年齡、性別等等便可以看做人這個類的屬性。對象1.3方法01通過在類定義中聲明函數(shù),即創(chuàng)建了類的方法。02語法:03classclass_name{04functionfunction_name(arg1,arg2,……)05{06函數(shù)功能代碼07}08}對象1.4類的應(yīng)用一個定義了屬性和方法的類就是一個完整的類了,可以在一個類里面包含一個完整的處理邏輯。使用new關(guān)鍵字來實例化一個對象以便應(yīng)用類里面的邏輯??梢酝瑫r實例化多個對象。語法:object=newclass_name();實例化一個對象后,使用->操作符來訪問對象的成員屬性和方法。語法:object->var_name;object->function_name;如果要在定義的類里面訪問成員的屬性或者方法,可以使用偽變量$this。$this用于表示當(dāng)前對象或?qū)ο蟊旧怼?2類的定義及應(yīng)用實例1:類的定義及應(yīng)用<?phpclassPerson{

//人的成員屬性

var$name;

//人的名字

var$age;

//人的年齡

//人的成員say()方法

functionsay(){

echo"我的名字叫:".$this->name."<br/>"; echo"我的年齡是:".$this->age;

}}

//類定義結(jié)束//實例化一個對象$p1=newPerson();//給$p1對象屬性賦值$p1->name="張三";

$p1->age=20;//調(diào)用對象中的say()方法$p1->say();?>實例1:類的定義及應(yīng)用運行該實例,輸出:我的名字叫:張三我的年齡是:20上面的實例演示了一個簡單的基于面向?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類的繼承是指建立一個新的派生類,從一個或多個先前定義的類中繼承數(shù)據(jù)和方法,而且可以重新定義或加進新數(shù)據(jù)和方法,從而建立了類的層次或等級。將已存在的用來派生新類的類為父類,由已存在的類派生出的新類為子類。繼承是面向?qū)ο蟮娜筇匦灾?。在PHP中,一個類只能直接從一個類中繼承數(shù)據(jù),即單繼承。使用extends關(guān)鍵字來定義類的繼承:class子類extends父類{}2PHP類的繼承extends關(guān)鍵字實例2使用

extends關(guān)鍵字來定義類的繼承實例代碼如下:<?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()允許在實例化一個類之前先執(zhí)行構(gòu)造方法。構(gòu)造方法是類中的一個特殊方法。當(dāng)使用new操作符創(chuàng)建一個類的實例時,構(gòu)造方法將會自動調(diào)用,其名稱必須是__construct()。在一個類中只能聲明一個構(gòu)造方法,而是只有在每次創(chuàng)建對象的時候都會去調(diào)用一次構(gòu)造方法,不能主動的調(diào)用這個方法,所以通常用它執(zhí)行一些有用的初始化任務(wù)。該方法無返回值。語法:function__construct(arg1,arg2,...){......PHP構(gòu)造方法實例3:PHP構(gòu)造方法

__construct()的使用實例代碼如下:<?phpclassPerson{

var$name;

var$age;

//定義一個構(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)造方法運行該實例,輸出:我的名字叫:張三我的年齡是:20在該實例中,通過構(gòu)造方法對對象屬性進行初始化賦值。提示PHP不會在本類的構(gòu)造方法中再自動的調(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()允許在銷毀一個類之前執(zhí)行執(zhí)行析構(gòu)方法。析構(gòu)方法與構(gòu)造方法對應(yīng)的就是析構(gòu)方法,析構(gòu)方法允許在銷毀一個類之前執(zhí)行的一些操作或完成一些功能,比如說關(guān)閉文件、釋放結(jié)果集等。析構(gòu)函數(shù)不能帶有任何參數(shù),其名稱必須是__destruct()。語法:function__destruct(){......}4PHP析構(gòu)方法__destruct()在上面的實例中加入下面的析構(gòu)方法://定義一個析構(gòu)方法function__destruct(){

echo"再見".$this->name;}4PHP析構(gòu)方法__destruct()提示和構(gòu)造方法一樣,PHP不會在本類中自動的調(diào)用父類的析構(gòu)方法。要執(zhí)行父類的析構(gòu)方法,必須在子類的析構(gòu)方法體中手動調(diào)用parent::__destruct()。試圖在析構(gòu)函數(shù)中拋出一個異常會導(dǎo)致致命錯誤。在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)鍵字的實例:finalclassPerson{......}final定義的類被繼承時會提示如下錯誤:Fatalerror:ClassStudentmaynotinheritfromfinalclass(Person)in...5PHPfinal關(guān)鍵字classPerson{

finalfunctionsay()

{

......

}}025PHP類的接口6.1PHP接口PHP類是單繼承,也就是不支持多繼承,當(dāng)一個類需要多個類的功能時,繼承就無能為力了,為此PHP引入了類的接口技術(shù)。如果一個抽象類里面的所有方法都是抽象方法,且沒有聲明變量,而且接口里面所有的成員都是public權(quán)限的,那么這種特殊的抽象類就叫接口。接口使用關(guān)鍵字interface來定義,并使用關(guān)鍵字implements來實現(xiàn)接口中的方法,且必須完全實現(xiàn)。實例4使用關(guān)鍵字interface定義接口,并使用關(guān)鍵字implements實現(xiàn)接口中的方法實例代碼如下:<?php6.1PHP接口<?php//定義接口interfaceUser{

functiongetDiscount();

functiongetUserType();}//VIP用戶接口實現(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ù),這時并不知道是什么用戶

functionrun(User$vc){

$this->vc=$vc;

$discount=$this->vc->getDiscount(); $usertype=$this->vc->getUserType();

echo$usertype."商品價格:".$this->price*$discount;

}}$display=newGoods();$display->run(newVipUser); //可以是更多其他用戶類型?>6.1PHP接口運行該實例,輸出:VIP用戶商品價格:80元該實例演示了一個PHP接口的簡單應(yīng)用。該實例中,User接口實現(xiàn)用戶的折扣,而在VipUser類里面實現(xiàn)了具體的折扣系數(shù)。最后商品類Goods根據(jù)User接口來實現(xiàn)不同的用戶報價。該實例僅限于演示PHP接口的用法,不涉及其科學(xué)與否。6.2實現(xiàn)多個接口PHP也可以在繼承一個類的時候同時實現(xiàn)多個接口:class子類extends父類implemtns接口1,接口2,...{......}6.3抽象類和接口的區(qū)別接口是特殊的抽象類,也可以看做是一個模型的規(guī)范。接口與抽象類大致區(qū)別如下:一個子類如果implements一個接口,就必須實現(xiàn)接口中的所有方法(不管是否需要);如果是繼承一個抽象類,只需要實現(xiàn)需要的方法即可。如果一個接口中定義的方法名改變了,那么所有實現(xiàn)此接口的子類需要同步更新方法名;而抽象類中如果方法名改變了,其子類對應(yīng)的方法名將不受影響,只是變成了一個新的方法而已(相對老的方法實現(xiàn))。抽象類只能單繼承,當(dāng)一個子類需要實現(xiàn)的功能需要繼承自多個父類時,就必須使用接口。謝謝5.7PHP類的訪問控制與封裝陳學(xué)平

017PHP類的訪問控制與封裝7PHP類的訪問控制與封裝PHP中通過在前面添加訪問修飾符public、protected或private來實現(xiàn)對屬性或方法的訪問控制。7.1訪問控制類型的訪問修飾符允許開發(fā)人員對類成員的訪問進行控制,這是面向?qū)ο驩OP語言的一個特性。PHP支持如下三種訪問修飾符:public(公有的):類中的成員將沒有訪問限制,所有的外部成員都可以訪問(讀和寫)這個類成員(包括成員屬性和成員方法)。如果類的成員沒有指定成員訪問修飾符,將被視為public。protected(受保護的):被定義為protected的成員不能被該類的外部代碼訪問,但該類的子類具有訪問權(quán)限。private(私有的):被定義為private的成員,允許同一個類里的所有成員訪問,但對于該類的外部代碼和子類都不允許訪問。7.1訪問控制提示在子類覆蓋父類的方法時,子類中方法的訪問權(quán)限不能低于父類被覆蓋方法的訪問權(quán)限。7.2封裝封裝,就是把類(對象)的屬性和服務(wù)結(jié)合成一個獨立的單位,并盡可能隱藏內(nèi)部的細(xì)節(jié),只保留必要的接口與外部發(fā)生聯(lián)系。這種封裝特性,有效的保證了對象的獨立性,使軟件錯誤能夠局部化,大大減少查錯和排錯的難度。使用private關(guān)鍵字來對屬性和方法進行封裝:實例5使用private關(guān)鍵字對屬性和方法進行封裝實例代碼如下:<?phpclassPerson{//將成員屬性定義為privateprivate$name;7.2封裝

private$age;

//定義一個構(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自動加載類、范圍操作解析符陳學(xué)平8PHP自動加載類9.3::訪問父類覆蓋成員和方法的實例9.2::訪問靜態(tài)成員、方法實例9范圍解析操作符(::)目錄018PHP自動加載類8PHP自動加載類__autoload()方法用于自動加載類。在實際項目中,不可能把所有的類都寫在一個PHP文件中,當(dāng)在一個PHP文件中需要調(diào)用另一個文件中聲明的類時,就需要通過include把這個文件引入。不過有的時候,在文件眾多的項目中,要一一將所需類的文件都include進來,需要在每個類文件開頭寫一個長長的包含文件的列表。那么能不能在使用類的時候,再把這個類所在的php文件導(dǎo)入呢?為此,PHP提供了__autoload()方法,它會在試圖使用尚未被定義的類時自動調(diào)用。通過調(diào)用此函數(shù),腳本引擎在PHP出錯失敗前有了最后一個機會加載所需的類。8PHP自動加載類__autoload()方法接收的一個參數(shù),就是欲加載的類的類名,所以這時候需要類名與文件名對應(yīng),如Person.php,對應(yīng)的類名就是Pserson。實例6_使用_autoload()方法自動加載類實例代碼如下: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自動加載類test.php<?phpfunction__autoload($class_name){require_once$class_name.'.php';}//當(dāng)前頁面Pserson類不存在則自動調(diào)用__autoload()方法,傳入?yún)?shù)Person$p1=newPerson("張三","20");$p1->say();?>運行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范圍解析操作符(::)范圍解析操作符(::)是一對冒號,可以用于訪問靜態(tài)成員、方法和常量,以及被覆蓋類中的成員和方法。當(dāng)在類的外部使用::符號訪問這些靜態(tài)成員、方法和常量時,必須使用類的名字,如下面實例所示。039.2::訪問靜態(tài)成員、方法實例9.2::訪問靜態(tài)成員、方法實例<?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é)果中國我是中國人使用

::符號訪問靜態(tài)成員及方法參考PHP靜態(tài)(static)。049.3::訪問父類覆蓋成員和方法的實例9.3::訪問父類覆蓋成員和方法的實例實例8使用::訪問父類覆蓋成員和方法實例代碼如下:<?phpclassPerson{

var$name;

var$sex;

var$age;

functionsay(){

echo"我的名字叫:".$this->name."<br/>";

echo"性別:".$this->sex."<br/>";

echo"我的年齡是:".$this->age;

}}9.3::訪問父類覆蓋成員和方法的實例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,就可以不實例化類而直接訪問,不能通過一個對象來訪問其中的靜態(tài)成員(靜態(tài)方法除外)。靜態(tài)成員屬于類,不屬于任何對象實例,但類的對象實例都能共享。10.1靜態(tài)static實例9使用static聲明類成員或方法實例9使用static聲明類成員或方法實例代碼如下:<?phpClassPerson{

//定義靜態(tài)成員屬性

publicstatic$country="中國";

//定義靜態(tài)成員方法

publicstaticfunctionmyCountry(){

//內(nèi)部訪問靜態(tài)成員屬性

echo"我是".self::$country."人<br/>";

}}10.1靜態(tài)static實例9使用static聲明類成員或方法classStudentextendsPerson{

functionstudy(){

echo"我是".parent::$country."人<br/>";

}}//輸出成員屬性值echoPerson::$country."<br/>"; //輸出:中國$p1=newPerson();//echo$p1->country; //錯誤寫法//訪問靜態(tài)成員方法Person::myCountry(); //輸出:我是中國人//靜態(tài)方法也可通過對象訪問:$p1->myCountry();//子類中輸出成員屬性值echoStudent::$country."<br/>"; //輸出:中國$t1=newStudent();$t1->study(); //輸出:我是中國人?>運行該實例,輸出:中國我是中國人我是中國人中國我是中國人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)方法也可以通過普通對象的方式訪問。謝謝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)實例10:使用const關(guān)鍵字定義常量實例代碼如下:<?phpClassPerson{

//定義常量

constcountry="中國";

publicfunctionmyCountry(){

//內(nèi)部訪問常量

echo"我是".self::country."人<br/>";

}}//輸出常量echoPerson::country."<br/>";//訪問方法$p1=newPerson();$p1->myCountry();?>運行該實例輸出:中國我是中國人常量的值一旦被定義后就不可在程序中更改。12PHP特殊方法PHP的類的特殊方法如下__set()方法用于設(shè)置私有屬性值。__get()方法用于獲取私有屬性值。__isset()方法用于檢測私有屬性值是否被設(shè)定。__unset()方法用于刪除私有屬性。實際應(yīng)用中,經(jīng)常會把類的屬性設(shè)置為私有(private),那么需要對屬性進行訪問時,就會變得麻煩。雖然可以將對屬性的訪問寫成一個方法來實現(xiàn),但PHP提供了一些特殊方法來方便此類操作。12.1__set()__set()方法用于設(shè)置私有屬性值:語法如下:function__set($property_name,$value){$this->$property_name=$value;}在類里面使用了__set()方法后,當(dāng)使用$p1->name="張三";這樣的方式去設(shè)置對象私有屬性的值時,就會自動調(diào)用__set()方法來設(shè)置私有屬性的值。12.2__get()__get()方法用于獲取私有屬性值:語法如下:function__set($property_name,$value){returnisset($this->$property_name)?$this->$property_name:null;}實例11:__合適get()方法獲取私有屬性值實例代碼如下:<?php12.2__get()classPerson{private$name;private$sex;private$age;//__set()方法用來設(shè)置私有屬性function__set($property_name,$value){echo"在直接設(shè)置私有屬性值的時候,自動調(diào)用了這個__set()方法為私有屬性賦值<br/>";$this->$property_name=$value;}12.2__get()//__get()方法用來獲取私有屬性function__get($property_name){echo"在直接獲取私有屬性值的時候,自動調(diào)用了這個__get()方法<br/>";returnisset($this->$property_name)?$this->$property_name:null;}}$p1=newPerson();//直接為私有屬性賦值的操作,會自動調(diào)用__set()方法進行賦值12.2__get()$p1->name="張三";//直接獲取私有屬性的值,會自動調(diào)用__get()方法,返回成員屬性的值echo"我的名字叫:".$p1->name;?>運行該實例,輸出:在直接設(shè)置私有屬性值的時候,自動調(diào)用了這個__set()方法為私有屬性賦值在直接獲取私有屬性值的時候,自動調(diào)用了這個__get()方法我的名字叫:張三12.3__isset()__isset()方法用于檢測私有屬性值是否被設(shè)定。如果對象里面成員是公有的,可以直接使用isset()函數(shù)。如果是私有的成員屬性,那就需要在類里面加上一個__isset()方法。語法如下:privatefunction__isset($property_name){returnisset($this->$property_name);}這樣當(dāng)在類外部使用isset()函數(shù)來測定對象里面的私有成員是否被設(shè)定時,就會自動調(diào)用__isset()方法來檢測。12.4__unset()__unset()方法用于刪除私有屬性。同isset()函數(shù)一樣,unset()函數(shù)只能刪除對象的公有成員屬性,當(dāng)要刪除對象內(nèi)部的私有成員屬性時,需要使用__unset()方法。語法如下:privatefunction__unset($property_name){unset($this->$property_name);}謝謝PHP重載與重載方法陳學(xué)平13PHP重載0114PHP重載方法02目錄0113PHP重載13.1PHP重載一個類中的方法與另一個方法同名,但是參數(shù)不同,這種方法稱之為重載方法。因為PHP是弱類型的語言,所以在方法的參數(shù)中本身就可以接收不同類型的數(shù)據(jù),又因為PHP的方法可以接收不定個數(shù)的參數(shù),所以在PHP里面沒有嚴(yán)格意義上的方法重載。PHP中的重載是指在子類里面定義了一個和父類同名的方法,且該方法將在子類中將把父類的方法覆蓋。在子類中,因為從父類繼承過來的方法可能無法訪問子類定義的屬性或方法,所以有時候重載是必要的。13.1PHP重載實例12PHP的重載實例代碼如下:1classPerson{2var$name;3var$age;4functionsay(){5echo"我的名字叫:".$this->name."<br/>";6echo"我的年齡是:".$this->age;7}8}9<?php1013.1PHP重載實例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重載實例12PHP的重載$t1->name="張三";$t1->age="18";$t1->school="人民大學(xué)";$t1->say();?>運行該實例,輸出:我的名子叫:張三我的年齡是:18我正在人民大學(xué)學(xué)習(xí)提示如果父類定義方法時使用了final關(guān)鍵字,則不允許被子類方法覆蓋。13.2訪問父類被覆蓋的方法可以通過::符號來訪問父類被覆蓋的方法或成員屬性。語法如下:functionsay(){parent::say();//或者Person::say();echo"我在".$this->school."上學(xué)<br/>";}范圍解析操作符::用法可以查看前面的相關(guān)介紹。0214PHP重載方法14PHP重載方法__call()方法用于監(jiān)視錯誤的方法調(diào)用。為了避免當(dāng)調(diào)用的方法不存在時產(chǎn)生錯誤,可以使用__call()方法來避免。該方法在調(diào)用的方法不存在時會自動調(diào)用,程序仍會繼續(xù)執(zhí)行下去。語法如下:function__call(string$function_name,array$arguments){......}14PHP重載方法該方法有兩個參數(shù),第一個參數(shù)$function_name會自動接收不存在的方法名,第二個$args則以數(shù)組的方式接收不存在方法的多個參數(shù)。在類里面加入:function__call($function_name,$args){echo"你所調(diào)用的函數(shù):$function_name(參數(shù):<br/>";var_dump($args);echo")不存在!";}當(dāng)調(diào)用一個不存在的方法時(如test()方法):14PHP重載方法$p1=newPerson();$p1->test(2,"test");輸出的結(jié)果如下:你所調(diào)用的函數(shù):test(參數(shù):array(2){

[0]=>int(2)

[1]=>string(4)"test"})不存在!

謝謝PHP抽象方法與抽象類、對象克隆演講人15PHP抽象方法與抽象類0116PHP對象克隆03抽象方法的實現(xiàn)02目錄0115PHP抽象方法與抽象類15.1抽象方法01抽象方法指沒有方法體的方法,具體就是在方法聲明的時候沒有{}括弧以及其中的內(nèi)容,而是直接在聲明時在方法名后加上分號結(jié)束。02abstract關(guān)鍵字用于定義抽象方法,語法如下:03abstractfunctionfunction_name();abstract關(guān)鍵字用于定義抽象方法與抽象類。15.2抽象類只要一個類里面有一個方法是抽象方法,那么這個類就要定義為抽象類。抽象類同樣用abstract關(guān)鍵字來定義。抽象類不能產(chǎn)生實例對象,通常是將抽象方法做為子類方法重載的模板使用的,且要把繼承的抽象類里的方法都實現(xiàn)。實際上抽象類是方便繼承而引入的。實例13:使用abstract關(guān)鍵字定義抽象類實例代碼如下:<?phpabstractclassAbstractClass{//定義抽象方法abstractprotectedfunctiongetValue();15.2抽象類//普通方法publicfunctionprintOut(){print$this->getValue()."<br/>";}}classConcreteClassextendsAbstractClass{protectedfunctiongetValue(){return"抽象方法的實現(xiàn)";}}}$class1=newConcreteClass;$class1->printOut();?>輸出結(jié)果抽象方法的實現(xiàn)在這個實例中,父類定義了抽象方法以及對于方法的實現(xiàn),但實際的內(nèi)容卻在子類里定義。02抽象方法的實現(xiàn)抽象方法的實現(xiàn)在這個實例中,父類定義了抽象方法以及對于方法的實現(xiàn),但實際的內(nèi)容卻在子類里定義。0316PHP對象克隆16PHP對象克隆clone關(guān)鍵字用于克隆一個完全一樣的對象,__clone()方法來重寫原本的屬性和方法。16.1對象克隆關(guān)鍵字需要在一個項目里面使用兩個或多個一樣的對象,如果使用new關(guān)鍵字重新創(chuàng)建對象,再賦值上相同的屬性,這樣做比較煩瑣而且也容易出錯。PHP提供了對象克隆功能,可以根據(jù)一個對象完全克隆出一個一模一樣的對象,而且克隆以后,兩個對象互不干擾。使用關(guān)鍵字clone來克隆對象。語法:$object2=clone$object;實例14使用關(guān)鍵字clone來克隆對象實例代碼如下:<?phpclassPerson{private$name;16.1對象克隆關(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();?>運行實例,輸出:我的名字叫:張三我的年齡是:2016.2__clone()方法如果想在克隆后改變原對象的內(nèi)容,需要在類中添加一個特殊的__clone()方法來重寫原本的屬性和方法。__clone()方法只會在對象被克隆的時候自動調(diào)用。實例15:使用_clone()方法重寫對象原來的屬性和方法實例代碼如下:<?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對象的存儲與傳輸、注冊為session變量陳學(xué)平0117PHP對象的存儲與傳輸17.1對象的存儲與傳輸在實際項目應(yīng)用中,有些任務(wù)在一兩個頁面是無法完成的,由于變量到腳本執(zhí)行完畢就釋放,本頁所生成的對象想在其它頁面使用時便碰到了麻煩。如果需要將對象及其方法傳遞到想使用對象的頁面,比較簡單可行的辦法是將對象序列化后存儲起來或直接傳輸給需要的頁面,另一種辦法是將對象注冊為session變量。17.2序列化對象對象序列化,就是將對象轉(zhuǎn)換成可以存儲的字節(jié)流。當(dāng)需要把一個對象在網(wǎng)絡(luò)中傳輸時或者要把對象寫入文件或是數(shù)據(jù)庫時,就需要將對象進行序列化。序列化完整過程包括兩個步驟:一個是序列化,就是把對象轉(zhuǎn)化為二進制的字符串,serialize()函數(shù)用于序列化一個對象;另一個是反序列化,就是把對象被序列轉(zhuǎn)化的二進制字

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論