版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、PHP程序設計基礎教程教學設計課程名稱: PHP程序設計基礎教程 授課年級: 2014年級 授課學期: 2015學年第二學期教師姓名: 陸啟軍 課題名稱第5章 面向?qū)ο缶幊逃媱潓W時7課時內(nèi)容分析和一些面向?qū)ο蟮恼Z言有所不同,PHP并不是一種純面向?qū)ο蟮恼Z言。但PHP也支持面向?qū)ο蟮某绦蛟O計,并可以用于開發(fā)大型的商業(yè)程序。因此學好面向?qū)ο缶幊虒HP程序員來說也是至關重要的。本章將針對面向?qū)ο缶幊淘赑HP語言中的使用進行詳細地講解。教學目標及基本要求要求學生能夠熟悉面向?qū)ο笏枷?、掌握類與對象的使用、掌握構造方法與析構方法的使用、掌握繼承與多態(tài)的使用、掌握接口與抽象類的使用。重點及措施教學重點:類
2、的定義、對象的創(chuàng)建、類的封裝、特殊的$this、構造方法、繼承、自動加載、魔術方法、單例模式。難點及措施教學難點:類與對象的創(chuàng)建和使用、靜態(tài)成員與靜態(tài)方法、抽象類、接口、多態(tài)、命名空間、設計模式。教學方式教學采用教師課堂講授為主,使用教學PPT講解教學過程第一課時(面向?qū)ο蟮母拍?、類與對象、類的定義、對象的創(chuàng)建、類的封裝、特殊的$this)l 面向?qū)ο蟮母拍?#178; 什么是面向?qū)ο竺嫦驅(qū)ο笫且环N符合人類思維習慣的編程思想?,F(xiàn)實生活中存在各種形態(tài)不同的事物,這些事物之間存在著各種各樣的聯(lián)系。在程序中使用對象來映射現(xiàn)實中的事物,使用對象的關系來描述事物之間的聯(lián)系,這種思想就是面向?qū)ο?。面向?qū)ο?/p>
3、則是把解決的問題按照一定規(guī)則劃分為多個獨立的對象,然后通過調(diào)用對象的方法來解決問題。當然,一個應用程序會包含多個對象,通過多個對象的相互配合來實現(xiàn)應用程序的功能,這樣當應用程序功能發(fā)生變動時,只需要修改個別的對象就可以了,從而使代碼更容易維護。面向?qū)ο蟮奶攸c主要可以概括為封裝性、繼承性和多態(tài)性。l 類與對象的關系² 用具體的例子引導。例如:玩具和玩具模型的關系。在圖中,可以將玩具模型看作是一個類,將一個個玩具看作對象,從玩具模型和玩具之間的關系便可以看出類與對象之間的關系。類用于描述多個對象的共同特征,它是對象的模板。對象用于描述現(xiàn)實中的個體,它是類的實例。從圖中可以明顯看出對象是根
4、據(jù)類創(chuàng)建的,并且一個類可以對應多個對象。 l 類的定義² 為什么定義類在面向?qū)ο蟮乃枷胫凶詈诵牡木褪菍ο螅瑸榱嗽诔绦蛑袆?chuàng)建對象,首先需要定義一個類。類是對象的抽象,它用于描述一組對象的共同特征和行為。通過一個案例來演示如何定義一個類。 1 <?php 2 /定義一個Person類 3 class Person 4 public $name; 5 public $age; 6 public function speak() 7 echo "大家好!我叫".$this->name.",今年".$this->age."歲。
5、<br>" 8 9 10 ?>其中,Person是類名,name和age是成員屬性,speak()是成員方法。在成員方法speak()中可以使用$this訪問成員屬性name和age。需要注意的是,$this表示當前對象,這里是指Person。l 對象的創(chuàng)建和使用應用程序想要完成具體的功能,僅有類是遠遠不夠的,還需要根據(jù)類創(chuàng)建實例對象。在PHP程序中可以使用new關鍵字來創(chuàng)建對象,具體格式如下:$對象名 = new 類名(參數(shù)1,參數(shù)2,); 上述語法格式中,“$對象名”表示一個對象的引用名稱,通過這個引用就可以訪問對象中的成員,其中$符號是固定寫法,對象名是自定義
6、的。“new”表示要創(chuàng)建一個新的對象,“類名”表示新對象的類型?!皡?shù)1,參數(shù)2”中的參數(shù)是可選的。對象創(chuàng)建成功后,就可以通過“對象->成員”的方式來訪問類中的成員。需要注意的是,如果在創(chuàng)建對象時,不需要傳遞參數(shù),則可以省略類名后面的括號,即“new 類名;”。l 類的封裝在設計一個類時,應該對成員變量的訪問做出一些限定,不允許外界隨意訪問,此時就需要實現(xiàn)類的封裝。所謂類的封裝是指在定義一個類時,將類中的屬性私有化,即使用private關鍵字來修飾。私有化的屬性只能在它所在類中被訪問,為了能讓外界訪問私有屬性,PHP提供了兩種形式。² 1、通過getXxx()和setXxx()
7、方法訪問私有屬性² 2、通過_get()和_set ()方法訪問私有屬性l 特殊的$this對象一旦被創(chuàng)建,在對象的每個成員方法中都會存在一個特殊的對象引用“$this”,它代表當前對象,用于完成對象內(nèi)部成員之間的訪問。其語法格式如下:$this-> 屬性名; 注意:this不能在類定義的外部使用,只能在類定義的方法中使用。 第二課時(構造方法、析構方法、類常量、靜態(tài)成員)l 構造方法和析構方法實例化一個類的對象后,如果要為這個對象的屬性賦值,需要直接訪問該對象的屬性。如果想要在實例化對象的同時就為這個對象的屬性進行賦值,則可以通過構造方法來實現(xiàn)。² 構造方法在每個類
8、中,都有一個構造方法,在創(chuàng)建對象時會被自動調(diào)用。如果在類中沒有顯式的聲明它,PHP會自動生成一個沒有參數(shù),且沒有任何操作的默認構造方法。當在類中顯式聲明了構造方法時默認構造方法將不存在。需要注意的是構造方法的名稱必須為_construct(),修飾符可以省略,默認為public。值得一提的是,在PHP5之前的版本中,構造方法名和類名相同,這種方式在PHP5中仍然可以使用,但應該盡量將構造方法命名為_construct(),其優(yōu)點是可以使構造方法獨立于類名,當類名發(fā)生變化時不需要更改相應的構造方法名稱。為了向下兼容,創(chuàng)建對象時,如果一個類中沒有名為_constuct()的構造方法,PHP將尋找與
9、類名同名的構造方法執(zhí)行,如果找不到,則執(zhí)行默認的空構造方法。注意:1、 構造方法沒有返回值。2、 構造方法的作用是完成對新對象的初始化,并不是創(chuàng)建對象本身。3、 在創(chuàng)建新對象后,系統(tǒng)會自動調(diào)用該類的構造方法,不需要手動調(diào)用。 4、 一個類有且只有一個構造方法,在php5后雖然_construct()和類名()可以共存,但只能使用一個。5、 構造方法和普通方法一樣,可以訪問類屬性和方法,也有訪問控制修飾符,還可以被其它方法調(diào)用。² 析構方法析構方法是PHP5中新添加的內(nèi)容,它在對象銷毀之前會被自動調(diào)用,用于釋放內(nèi)存。需要注意的是,析構方法的名稱必須為“_destruct()”,且析構方
10、法不帶任何參數(shù)。² 垃圾回收在PHP中使用了一種“垃圾回收”機制,即自動清理不再使用的對象,釋放內(nèi)存,析構方法也會自動被調(diào)用。所以在一般情況下不需要手動調(diào)用析構方法,只需明確析構方法的在何時被調(diào)用的即可。l 類常量和靜態(tài)成員類在實例化對象時,該對象中的成員只被當前對象所有。如果希望在類中定義的成員被所有實例共享,此時可以使用類常量或靜態(tài)成員來實現(xiàn),接下來將針對類常量和靜態(tài)成員的相關知識進行詳細地講解。l 類常量在類中,有些屬性的值不能改變,并且希望被所有對象所共享,例如圓周率,它是一個數(shù)學常數(shù),在數(shù)學物理計算中廣泛使用,此時可以將表示圓周率的成員屬性定義為常量。類常量在定義時需要使用
11、const關鍵字來申明,示例代碼如下:const PI = 3.1415926; /定義一個常量屬性PIl 靜態(tài)成員類常是屬于類的,可以實現(xiàn)類的所有對象共享一份數(shù)據(jù)。在類中使用靜態(tài)成員也可以達到同樣的效果,靜態(tài)成員被static關鍵字修飾,它不屬于任何對象,只屬于類。靜態(tài)成員包括靜態(tài)屬性和靜態(tài)方法。² 1、靜態(tài)屬性有時候,我們希望某些特定的數(shù)據(jù)在內(nèi)存中只有一份,并且可以被類的所有實例對象所共享。例如某個學校所有學生共享一個學校名稱,此時完全不必在每個學生對象所占用的內(nèi)存空間都定義一個字段來存儲這個學校名稱,可使用靜態(tài)屬性來表示學校名稱讓所有對象來共享。static關鍵字寫在訪問修飾符
12、的后面,訪問修飾符可以省略,默認為public。需要注意的是,靜態(tài)屬性是屬于類而非對象,所以不能使用“對à屬性”的方式來訪問,而應該通過“類名:屬性”的方式來訪問,如果是在類的內(nèi)部,還可以使用self關鍵字代替類名。² 2、靜態(tài)方法有時我們希望在不創(chuàng)建對象的情況下就可以調(diào)用某個方法,也就是使該方法不必和對象綁在一起。靜態(tài)方法在定義時只需在方法名前加上static關鍵字。靜態(tài)方法的使用規(guī)則和靜態(tài)屬性相同,即通過類名稱和范圍解析操作符(:)來訪問靜態(tài)方法。注意:在靜態(tài)方法中,不要使用$this。因為靜態(tài)方法是屬于類的,而$this則是指對象上下文。在靜態(tài)方法中,一般只對靜態(tài)屬性
13、進行操作。第三課時(繼承、繼承的概念、重寫父類方法、final關鍵字)l 繼承的概念在現(xiàn)實生活中,繼承一般指的是子女繼承父輩的財產(chǎn)。在程序中,繼承描述的是事物之間的所屬關系,通過繼承可以使多種事物之間形成一種關系體系。例如貓和狗都屬于動物,程序中便可以描述為貓和狗繼承自動物。同理,波斯貓和巴厘貓繼承自貓,而沙皮狗和斑點狗繼承自狗。這些動物之間會形成一個繼承體系,具體如圖所示。在PHP中,類的繼承是指在一個現(xiàn)有類的基礎上去構建一個新的類,構建出來的新類被稱作子類,現(xiàn)有類被稱作父類,子類會自動擁有父類所有可繼承的屬性和方法。注意: 在PHP中只能實現(xiàn)單繼承,也就是說子類只能繼承一個父類(是指直接繼
14、承)。l 重寫父類方法有時在子類中需要對繼承的方法進行一些修改,即對父類的方法進行重寫。需要注意的是,在子類中重寫的方法需要和父類被重寫的方法具有相同的方法名、參數(shù)。注意:子類方法重寫父類方法時,訪問權限不能小于父類方法的訪問權限。例如父類的方法是public的,在子類中重寫時只能是public的,不能聲明為protected或者private。l final關鍵字繼承為程序編寫帶來了巨大的靈活性,但有時可能需要在繼承的過程中保證某些類或方法不被改變,此時就需要使用final關鍵字。² 1、final關鍵字修飾類PHP中的類被final關鍵字修飾后,該類將不可以被繼承,也就是不能夠派
15、生子類。² 2、final關鍵字修飾方法當一個類的方法被final關鍵字修飾后,這個類的子類將不能重寫該方法。第四課時(自動加載、魔術方法、抽象類、接口)l 自動加載在PHP開發(fā)過程中,如果希望從外部引入一個class,通常會使用include和require方法把定義這個class的文件包含進來。但是,在大型的開發(fā)項目中,這么做會產(chǎn)生大量的require或者include方法的調(diào)用,這樣不僅會降低效率,而且使代碼難以維護。如果不小心忘記引入某個類的定義文件,PHP就會報告一個致命錯誤,導致整個應用程序崩潰。為了解決上述問題,PHP提供了類的自動加載機制,即定義一個_autoload
16、()函數(shù),它會在試圖使用尚未被定義的類時自動調(diào)用。這樣,PHP在報告錯誤之前會有最后一個機會加載所需的類。接下來通過一個案例來說明_autoload()是如何實現(xiàn)自動加載的。首先在當前目錄下,定義類定義文件MyClass1.class.php,示例代碼如下:<?php class MyClass1 ?>定義類定義文件MyClass2.class.php,示例代碼如下:<?php class MyClass2 ?>需要注意的是,對于類定義文件,通常使用類名.class.php這種形式的文件名,這樣便于程序的編寫。_autoload()方法的使用如下所示。<?phpf
17、unction _autoload($classname)require_once $classname . ".class.php"$obj1 = new MyClass1();$obj2 = new MyClass2();var_dump($obj1);var_dump($obj2);?>² spl_autoload_register()實現(xiàn)類的自動加載除了_autoload()函數(shù)之外,spl_autoload_register()提供了一種更加靈活的方式來實現(xiàn)類的自動加載。將上面的示例改用spl_autoload_regiser()函數(shù)來實現(xiàn)。 1
18、<?php 2 function loader($classname) 3 require $classname . ".class.php" 4 5 spl_autoload_ register('loader'); 6 $obj1 = new MyClass1(); 7 $obj2 = new MyClass2(); 8 var_dump($obj1); 9 var_dump($obj2); 10 ?>從圖可以看出,spl_autoload_register()也可以實現(xiàn)類的自動加載。l 魔術方法PHP中有很多以兩個下劃線開頭的方法,如前面介
19、紹的_construct()、_autoload()、_get()和_set(),這些方法被稱為魔術方法。l 抽象類與接口當定義一個類時,常常需要定義一些方法來描述該類的行為特征,但有時這些方法的實現(xiàn)方式是無法確定的,此時就可以使用抽象類和接口。抽象類和接口用于提高程序的靈活性,抽象類是一種特殊的類,而接口又是一種特殊的抽象類。l 抽象類當在定義一個類的時候,其中所需的某些方法暫時并不能完全定義出來,而是讓其繼承的類來實現(xiàn),此時就可以用到抽象類。比如定義一個動物類,每種動物有“叫”方法,而每種動物叫的方式不同,因此可以將動物類定義為一個抽象類。由于每種動物叫的方式不同,所以需要將動物叫的sho
20、ut()方法定義成抽象的,即只有方法聲明而沒有方法體的方法,在子類繼承時再來編寫該方法的具體實現(xiàn),這種特殊的方法稱為抽象方法。注意:1、 抽象類不能被實例化。2、 抽象類可以沒有抽象方法,但有抽象方法的抽象類才有意義。一旦類包含了抽象方法,則這個類必須聲明為abstract。3、 抽象類中可以有非抽象方法, 成員屬性和常量。4、 抽象方法不能有函數(shù)體,它只能存在于抽象類中。5、 如果一個類繼承了某個抽象類,則它必須實現(xiàn)該抽象類的所有抽象方法,除非它自己也聲明為抽象類。l 接口如果一個抽象類中的所有方法都是抽象的,則可以將這個類用另外一種方式來定義,即接口。定義接口與定義一個標準的類類似,但其中
21、定義所有的方法都是空的。需要注意的是接口中的所有方法都是公有的,也不能使用final關鍵字來修飾。由于接口中定義的都是抽象方法,沒有具體實現(xiàn),需要通過類來實現(xiàn)接口。實現(xiàn)接口使用implements關鍵字。在PHP中類是單繼承的,但一個類卻可以實現(xiàn)多個接口,并且這些接口之間用逗號分隔開,接下來通過一個具體的案例來學習。<?php/定義Animal接口interface Animalpublic function run();public function shout();/定義LandAnimal接口interface LandAnimalpublic function LiveOnLan
22、d(); /定義Dog類,實現(xiàn)了Animal和LandAnimal接口class Dog implements Animal,LandAnimalpublic function LiveOnLand()echo"狗在陸地上生活<br>"public function run()echo "狗在奔跑<br>"public function shout()echo "汪汪<br>"$dog=new Dog();$dog->LiveOnLand();$dog->run();$dog->s
23、hout();?>運行結果如圖。第五課時(多態(tài)、設計模式、單例模式、工廠模式)l 多態(tài)在設計一個成員方法時,通常希望該方法具備一定的通用性。例如要實現(xiàn)一個動物叫的方法,由于每個動物的叫聲是不同的,因此可以在方法中接收一個動物類型的參數(shù)的對象。當傳入貓類對象時就發(fā)出貓類的叫聲,傳入犬類對象時就發(fā)出犬類的叫聲,這種向方法中傳入不同的對象,方法執(zhí)行效果各異的現(xiàn)象就是多態(tài)。 <?php/定義Animal接口abstract class Animalpublic abstract function shout();/定義Dog類,實現(xiàn)了Animal接口class Dog extends An
24、imalpublic function shout()echo "汪汪<br>"/定義Cat類,實現(xiàn)了Animal接口class Cat extends Animalpublic function shout()echo "喵喵<br>"function AnimalShout($obj) if($obj instanceof Animal)$obj->shout();elseecho "Error: 對象錯誤!"$cat=new Cat();$dog=new Dog();AnimalShout($cat
25、);AnimalShout($dog);?>l 設計模式在編寫程序時經(jīng)常會遇到一些典型的問題或需要完成某種特定需求,設計模式就是針對這些問題和需求,在大量的實踐中總結和理論化之后優(yōu)選的代碼結構、編程風格、以及解決問題的思考方式。設計模式就像是經(jīng)典的棋譜,不同的棋局,使用不同的棋譜,免得自己再去思考和摸索。l 單例模式單例模式是PHP中的一種設計模式,它是指在設計一個類時,需要保證在整個程序運行期間針對該類只存在一個實例對象。就像世界上只有一個月亮,假設現(xiàn)在要設計一個類表示月亮,該類只能有一個實例對象,否則就違背了事實。在講解單例設計模式之前,通過一個案例來演示在什么情況時需要使用單例模式
26、。 1 <?php 2 class dbHelper 3 private $conn = null; 4 public function _construct() 5 /打開一個到 MySQL 服務器的連接 6 $this->conn = mysql_connect("localhost","root","root"); 7 echo "得到一個conn<br/>" 8 9 10 $db1 = new dbHelper(); 11 $db2 = new dbHelper(); 12 if($
27、db1 = $db2) 13 echo "一個對象<br/>" 14 else 15 echo "兩個對象<br/>" 16 17 ?>從圖中可以看出,實例化類dbHelper的兩個對象請求的數(shù)據(jù)庫連接是兩個不同的連接,而在實際開發(fā)中,有時會有這樣的需求,在一次HTTP請求中,保證某個類的對象實例只能有一個,這樣可以節(jié)省資源開銷,此時可以使用單例模式。單例模式(Singleton)用于為一個類生成一個唯一的對象。將上面的dbHelper類使用單例模式來實現(xiàn)。 1 <?php 2 class dbHelper 3 pri
28、vate static $instance = null;/定義一個私有的靜態(tài)屬性$instance 4 /聲明一個構造方法 5 private function _construct() 6 $this->conn = mysql_connect("localhost","root","root"); 7 echo "得到一個conn<br/>" 8 9 /只有通過這個方法才能返回本類的對象,該方法是靜態(tài)方法 10 public static function getInstance() 11
29、/如果本類中的$instance為空,說明它還沒有被實例化過 12 if(self:$instance = null) 13 self:$instance = new self();/實例化本類對象 14 15 return self:$instance;/返回本類的對象 16 17 /阻止用戶復制對象實例 18 public function _clone() 19 20 21 $db1 = dbHelper:getInstance(); 22 $db2 = dbHelper:getInstance(); 23 if($db1 = $db2) 24 echo "同一個對象"
30、; 25 else 26 echo "不是同一個對象" 27 28 ?>dbHelper類的構造方法使用了private關鍵字進行了修飾,即不能在類定義之外使用new來創(chuàng)建對象。如此一來就可以通過類名直接調(diào)用getInstance()靜態(tài)方法來創(chuàng)建對象。在第3行代碼聲明了一個私有的靜態(tài)屬性$instance,將實例化的對象賦值給它,再判斷該屬性,如果已經(jīng)有值,就直接返回,如果其值為null,就先實例化對象,這樣就能保證dbHelper類只能被實例化一次。最后增加了一個私有的魔術方法_clone(),用于防止用戶通過clone方法復制對象。l 工廠模式工廠模式的作用就是
31、“生產(chǎn)”對象。工廠方法的參數(shù)是要生成對象的類名。為了理解工廠模式的作用,接下來通過一個案例來演示如何使用工廠模式獲取MySQL和SQLite的驅(qū)動對象。首先在根目錄下創(chuàng)建MySQL.php文件,示例代碼如下:<?php class MySQL /操作MySQL的驅(qū)動類 ?> 然后在根目錄下創(chuàng)建.php文件,示例代碼如下:<?php class SQLite &
32、#160; /操作SQLite的驅(qū)動類 ?>最后定義一個工廠方法來獲取各驅(qū)動對象。 1 <?php 2 header('Content-Type: textml;charset=utf-8'); 3 class Db 4 /工廠方法 5 public static function factory($type) 6 if (include_once $type . '.php') 7 $classname = $type; 8 return new $classname(); 9 else 10 echo "出錯了!&
33、quot; 11 12 13 14 /獲取MySQL驅(qū)動對象 15 $mysql = Db:factory('MySQL'); 16 /獲取SQLite驅(qū)動對象 17 $sqlite = Db:factory('SQLite'); 18 var_dump($mysql); 19 var_dump($sqlite); 20 ?> 第5行代碼定義了一個靜態(tài)方法factory(),這就是工廠方法,該方法的參數(shù)為類名。第6-11行代碼用于判斷類名與參數(shù)是否相同,如果相同則創(chuàng)建該類的對象,否則輸出“出錯了!”。第15、17行代碼分別調(diào)用factory()方法獲取對應
34、的驅(qū)動對象。從運行結果可以看出,工廠方法成功的創(chuàng)建了兩個驅(qū)動類對象。第六課時(命名空間、為何使用命名空間、命名空間的定義與使用)l 為什么使用命名空間在程序開發(fā)過程中經(jīng)常會涉及到大量的代碼,而代碼在編寫時不可避免的可能會出現(xiàn)重名問題,當這些重名的類被調(diào)用時就會導致錯誤。因此在PHP語言中提出了命名空間這一概念,來解決在編寫類庫或應用程序時出現(xiàn)的重名問題。以評論管理模塊為案例:<?php class Clean public function FilterTitle($text) return ucfirst(trim($text); ?>上述代碼中將評論標題第一個詞首字母轉換為大寫
35、,其中該代碼的類庫名為Library.inc.php,類名為Clean。而在實際開發(fā)中對評論的管理當然不止上述一個處理功能,通常還包括敏感詞過濾的模塊,具體代碼如下所示。<?php class Clean public function removeProfanity($text) $badwords = array( "idiotic" => "shortsighted", "moronic" => "unreasonable", "insane" => "i
36、llogical" ); return strtr($text,$badwords); ?>上述代碼實現(xiàn)了將評論中一些敏感詞過濾的功能。其中類庫名為DataCleaner.inc.php,類名為Clean。此時當需要在項目中同時添加上述兩個功能時,可以通過include關鍵字引入這兩個類庫到目標頁面,具體代碼如下:include Library.inc.php; include DataCleaner.inc.php;在對類庫引入成功后將這個程序加載到瀏覽器時會出現(xiàn)錯誤消息,具體如下所示。 Fatal error:Cannot redeclare class
37、;Clean經(jīng)過詳細分析才發(fā)現(xiàn)引入的兩個類庫中都存在一個Clean類,當類庫引入完畢后在該程序中就可以訪問這兩個類庫中的Clean類,此時編譯器就不清楚去調(diào)用哪個類,所以就會提示錯誤消息。通過上述的一個綜合的實例分析,可以看出程序在使用過程中出現(xiàn)同名問題是很正常的,而且當代碼復雜時還是不能避免的,為了能提高代碼的靈活性和穩(wěn)定性,命名空間的概念就被提出來了用于解決同名問題。同時還可以為標識符很長的名稱創(chuàng)建別名,提高程序的可讀性。l 命名空間的定義命名空間是用關鍵字namespace來聲明,定義一個命名空間的代碼如下:<?php namespace MyProject; const CONN
38、ECT_OK = 1; class Connection /* . */ function connect() /* . */ ?> 上述代碼中namespace是表示命名空間的關鍵字,MyProject是表示命名空間名,需要注意的是命名空間的聲明必須在其他所有代碼之前。接下來就對命名沖突問題進行解決,首先需要為各個類指定一個命名空間,具體步驟如下所示:(1)打開Library.inc.php文件,定義命名空間Library,代碼如下所示。<?php namespace Library; /定義命名空間 class Clean public function FilterTitle
39、($text) return ucfirst(trim($text); ?>(2)打開DataCleaner.inc.php文件,定義命名空間DataCleaner,代碼如下所示。<?php namespace DataCleaner; /定義命名空間 class Clean public function removeProfanity($text) $badwords = array( "idiotic" => "shortsighted", "moronic" => "unreasonable&
40、quot;, "insane" => "illogical" ); return strtr($text,$badwords); ?>通過對上述兩個代碼文件中命名空間的定義,當在程序中包含這兩個類庫時,就不會出現(xiàn)錯誤信息了,此時就可以在程序中正常調(diào)用。 l 命名空間的使用在上面小節(jié)中對類庫Library.php和Library.inc.php 定義了命名空間,當在程序中通過include引入這兩個命名空間后,程序不會報錯,此時就可以正常引用這兩個類庫中的類或方法等。接下來就可以對命名空間中的類、方法等成員進行引用。PHP命名空間中類名可以通過
41、以下三種方式引用:l 非限定名稱:l 限定名稱:l 完全限定名稱:在代碼中是如何使用命名空間:<?php include "Library.php" include "DataCleaner.php" /使用各自的命名空間并實例化對象 $filter = new LibraryClean(); /使用完全限定名稱 $profanity = new DataCleanerClean(); /使用限定名稱?>上述代碼中使用完全限定名稱和限定名稱的方式來分別對類Clean的引用。需要注意的是,如果當前文件中聲明了命名空間,此時使用限定名的方式引用成
42、員可能會出錯。命名空間除了可以用于解決命名沖突之外,還可以用來定義別名。當在程序中多次使用某個類或命名空間時,每次不得不寫一長串的單詞,使程序閱讀性變差。為此,PHP提供了別名機制,允許通過別名引用或?qū)胪獠康耐耆薅Q。在PHP中,別名的定義是通過namespace關鍵字來實現(xiàn)的,別名的使用是通過use關鍵字來實現(xiàn)的。PHP命名空間支持兩種使用別名或?qū)敕绞?,一是為類名稱使用別名,二是為命名空間使用別名。<?php namespace foo; include "Library.php" include "DataCleaner.php" us
43、e LibraryClean as L; /為Library中的Clean類定義別名為L use DataCleanerClean; /為DataCleaner中的Clean類定義別名為Clean use DataCleaner as D; /為命名空間DataCleaner定義別名D $filter = new L(); /實例化LibraryClean 對象 $profanity = new Clean(); /DataCleanerClean 對象 $profanity1 = new DClean(); /實例化DataCleanerClean 對象?>在使用別名時需要注意以下幾點
44、:l 使用別名機制只能導入類,不支持導入函數(shù)或常量。 l 對命名空間的名稱來說,前面的反斜杠不是必須的,因為導入的名稱必須是完全限定的,它不會根據(jù)當前的命名空間作相對解析。如果使用了反斜杠開始,則表示訪問的是全局命名空間中的類。l 如果省略了as,如上例中的第6行代碼,實際上它隱式地為其使用了別名Clean。l 導入操作只影響非限定名稱和限定名稱。由于完全限定名稱是確定的,所以不受導入的影響。 注意:1、 PHP 在 5.3.0 以后的版本才開始支持命名空間。2、 雖然任意合法的PHP代碼都可以包含在命名空間中,但只有三種類型的代碼受命名空間的影響,它們是:類,函數(shù)和常量。 3、 所有非PHP
45、代碼包括空白符都不能出現(xiàn)在命名空間的聲明之前,下面的用法是錯誤的:<html><?phpnamespace MyProject; / 致命錯誤 -命名空間必須是程序腳本的第一條語句?> 第七課時上機練習(總結,測試題)1、 總結本章內(nèi)容2、 通過題庫發(fā)放相關測試題,檢查學生掌握情況。上機練習主要針對本章中需要重點掌握的知識點,以及在程序中容易出錯的內(nèi)容進行練習,通過上機練習可以考察同學對知識點的掌握情況,對代碼的熟練程度。上機一:(考察知識點為類的定義)請按照以下要求設計一個Student類。要求如下:1) Student類中定義兩個成員變量$name和$age,分別表示學生的姓名和年齡,其中,變量$name初始值是“張三”,變量$age初始值是19。2) Student類中定義一個成員方法speak(),表示學生說話的行為,在方法中訪問$name和$age兩個成員變量,輸出學生的姓名和年齡。示例代碼如下:<?phpclass Studentpublic $name = 張三; public $age = 19; public function speak() echo 我的名字是 .$this-&
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 建筑工程電力工程建設
- 建筑工程水利工程建設
- 2025銀行房屋抵押按揭合同
- 2025景觀設計標準合同
- 2025年外研版七年級物理下冊月考試卷含答案
- 2025發(fā)展對象考試題庫附含參考答案
- 建筑工程中的電氣安裝要點講解
- 新郎父親婚禮上經(jīng)典致辭集錦15篇
- 2025紀檢監(jiān)察業(yè)務知識考試題及參考答案
- 妥善安置殘疾人的工傷事故保障
- 2018注冊環(huán)保工程師考試公共基礎真題及答案
- 勞務經(jīng)紀人培訓
- 如何提高售后服務的快速響應能力
- ?;愤\輸安全緊急救援與處理
- Unit-3-Reading-and-thinking課文詳解課件-高中英語人教版必修第二冊
- 高數(shù)(大一上)期末試題及答案
- 婚介公司紅娘管理制度
- 煤礦電氣試驗規(guī)程
- JCT796-2013 回彈儀評定燒結普通磚強度等級的方法
- 物業(yè)客服培訓課件PPT模板
- 火力發(fā)電廠節(jié)能管理制度實施細則
評論
0/150
提交評論