PHP面向?qū)ο蟪绦蛟O計
我們提供的服務有:成都網(wǎng)站設計、成都網(wǎng)站建設、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、輪臺ssl等。為上千企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術的輪臺網(wǎng)站制作公司面向?qū)ο蟮某绦蛟O計(Object Oriented Programming)
一、面向?qū)ο蟪绦蛟O計的概念
PHP引進的面向?qū)ο蟮脑O計方法,將數(shù)據(jù)及處理數(shù)據(jù)的相應函數(shù)“封裝”到一個“類(class)”中。類的實例稱為“對象”。在一個對象內(nèi),只有屬于該對象的函數(shù)才可以存取該對象的數(shù)據(jù)。
面向?qū)ο蟮某绦蛟O計有三個主要特征:封裝、繼承和多態(tài)。
1.封裝
封裝是將數(shù)據(jù)和代碼捆綁到一起,避免外界的干擾和不確定性。在PHP中,封裝是通過類來實現(xiàn)的。類是抽象數(shù)據(jù)類型的實現(xiàn),一個類的所有對象都具有相同的數(shù)據(jù)結構,并且共享相同的實現(xiàn)操作的代碼,而各個對象又有著各自不同的狀態(tài),即私有的存儲。因此,類是所有對象的共同的行為和不同狀態(tài)的結合體。
由一個特定的類所創(chuàng)建的對象稱為這個類的實例,因此類是對象的抽象及描述,它是具有共同行為的若干對象的統(tǒng)一描述體。類中還包含生成對象的具體方法。
2.繼承
類提供了創(chuàng)建新類的一種方法,再借助于“繼承”,這一重要機制擴充了類的定義,實現(xiàn)了面向?qū)ο蟮膬?yōu)越性。
繼承提供了創(chuàng)建新類的方法:一個新類可以通過對已有的類進行修改或擴充來滿足新類的需求。新類共享已有類的行為,而自己還具有修改的或額外添加的行為。因此,可以說繼承的本質(zhì)特征是行為共享。
從一個類繼承定義的新類,將繼承已有類的所有方法和屬性,并且可以添加所需要的新的方法和屬性。新類被稱為已有類的子類,已有類稱為父類,又叫基類。
3.多態(tài)
不同的類對于不同的操作具有不同的行為,稱為多態(tài)。多態(tài)機制使具有不同的內(nèi)部結構的對象可以共享相同的外部接口,通過這種方式減少代碼的負責度。
二、在PHP中創(chuàng)建類、屬性和方法
類是面向?qū)ο蟪绦蛟O計的核心,它是一種數(shù)據(jù)類型。類由變量和函數(shù)組成,在類里面,變量稱為屬性或成員變量,函數(shù)稱為方法。定義類的語法格式如下:
class classname { [var $property[=value];...] [function functionname($args) { //代碼 } ] }在PHP中,類需要使用class關鍵字來定義,后面跟類名classname。類的命名規(guī)則要符合PHP標記的命名規(guī)則,并且不能是PHP的保留字。類名后跟一對花括號,花括號里面包含類的屬性和方法。
在類中,使用關鍵字var來聲明變量,即類的屬性。使用關鍵字function來定義函數(shù),即類的方法。
注意:在定義屬性時,給屬性賦的值不能使用定界符,不能是表達式,不能包含括號,不能通過其他變量賦值。另外,在類的方法內(nèi)部的變量只是普通變量,不屬于類的屬性,因為它的作用范圍只限于方法內(nèi)部。不能將類的定義放到多個文件或多個PHP塊中。
三、類的實例化與訪問
在聲明一個類后,類只存在于文件中,程序不能調(diào)用。需要創(chuàng)建一個對象后程序才能使用,創(chuàng)建一個類對象的過程叫做類的實例化。類的實例化使用new關鍵字,關鍵字后面需要指定實例化的類名。
在一個類中,可以訪問一個特殊的指針“$this”。如果當前類有一個屬性$attribute,則在類的內(nèi)部要訪問這個屬性時,可以使用“$this->attribute”來引用。
在對象唄創(chuàng)建之后,可以在類的外部對該對象的屬性和方法進行訪問,訪問的方法是在對象后面使用“->”符合加上要訪問的屬性和方法。注意屬性的前面沒有“$”。
說明:有的類對類中的屬性進行了訪問控制,如果設置了類外部不能訪問類中屬性時,直接訪問將會發(fā)生錯誤。
四、類的訪問控制
在PHP5中,訪問修飾符public、private和protected,它們可以控制屬性和方法的可見性,通常放置在屬性和方法的聲明之前。
①public。聲明為公用的屬性和方法,可以在類的外部或內(nèi)部進行訪問。public是默認選項,如果沒有為一個屬性或方法制定修飾符,那么它將是public的。
②private。聲明為私有的屬性和方法,只可以在類的內(nèi)部進行訪問,私有的屬性和方法將不會被繼承。
③protected。聲明為被保護的屬性和方法,只可以在類的內(nèi)部和子類的內(nèi)部進行訪問。
在進行類的設計時,通常將類的屬性設為私有的,而將大多數(shù)方法設為公有的。這樣,類以外的代碼不能直接訪問類的私有數(shù)據(jù),從而實現(xiàn)了數(shù)據(jù)的封裝,而公有的方法可為內(nèi)部的私有數(shù)據(jù)提供外部接口,但接口實現(xiàn)的細節(jié)在類外又是不可見的。
五、靜態(tài)屬性和方法
所謂“靜態(tài)”是指所定義的屬性和方法與類的實例無關,只與類本身有關。靜態(tài)的屬性和方法一般用于包含類要封裝的數(shù)據(jù)和功能,可以由所有類的實例共享。在類里面可以使用static關鍵字定義靜態(tài)屬性和方法。
訪問靜態(tài)屬性和方法時需要使用到范圍解析符“::”,格式如下:
classname::$attribute; //訪問靜態(tài)屬性
classname::Cfunction([$args,...]) //訪問靜態(tài)方法
注意:只有靜態(tài)的屬性和方法才能使用范圍解析符,不能使用范圍解析符訪問非靜態(tài)的屬性和方法。
六、構造函數(shù)和析構函數(shù)
構造函數(shù)是類中的一個特殊函數(shù),當創(chuàng)建一個類的實例時,構造函數(shù)將被自動調(diào)用,主要功能通常是對類中的對象完成初始化工作。與構造函數(shù)相對的是析構函數(shù),析構函數(shù)在類的對象被銷毀時被自動調(diào)用。
①構造函數(shù)。在PHP5中,構造函數(shù)的名稱為“__construct”,"contruct"前面是兩根下劃線。如果一個類同時擁有__contruct構造函數(shù)和類名相同的函數(shù),PHP5將把__construct看做是構造函數(shù)。PHP中的構造函數(shù)可以帶參數(shù),也可以不帶參數(shù)。
②析構函數(shù)。類的析構函數(shù)的名稱是__destruct,如果在類中聲明了__destruct函數(shù),PHP將在對象被銷毀前調(diào)用析構函數(shù)將對象從內(nèi)存中銷毀,節(jié)省服務器資源。
如果構造函數(shù)中帶了參數(shù),在創(chuàng)建對象時也可以在類名后面為構造函數(shù)指定參數(shù)。
七、類的繼承
1.子類訪問父類
在PHP中,允許通過繼承其他類的方法來調(diào)用這些類里已經(jīng)定義好的屬性和方法,PHP不支持多繼承,所以一個子類只能繼承一個父類??梢允褂胑xtends關鍵字來指明類與類之間的關系。
類B繼承與類A,所以類B的對象可以訪問類A的屬性和方法,但A中的private的屬性和方法將不能被繼承,A中protected的屬性和方法只能在B的內(nèi)部訪問,類B創(chuàng)建的對象無法訪問,否則將產(chǎn)生錯誤。B作為A的子類,具有類A一樣的數(shù)據(jù)和功能,此外B還可以聲明自己的屬性和方法。
繼承是單方向的,子類可以從父類中繼承特性,但父類卻無法從子類中繼承特性。
如果子類中沒有自己的構造函數(shù),那么子類在實例化時會自動調(diào)用父類的構造函數(shù)。如果子類中有自己的構造函數(shù),則執(zhí)行自己的構造函數(shù)。
如果要在子類中調(diào)用父類的方法,除了使用“$this->”外,還可以使用parent關鍵字加范圍解析符,如“parent::functionname()”。建議使用后一種方法,因為前面的方法容易造成子類和父類方法結構不清。而對于父類的屬性,在子類中只能使用“$this->”來訪問,屬性是不區(qū)分父類和子類的。
繼承可以是多重的。例如:類B繼承了類A,類C繼承了類B,那么類C也就繼承了類A和類B的父類的所有特性。
2.重載
方法的重載是指在一個類中可以定義多個擁有相同名稱的方法,通過參數(shù)個數(shù)和類型來區(qū)分這些方法。在PHP中可以通過類的繼承,在子類中定義和父類中相同名稱的方法來實現(xiàn)類似方法重載的特性。
3.使用final關鍵字
PHP中final關鍵字,在聲明類時使用這個關鍵字,將使這個類不能被繼承。另外,如果將final關鍵字用于聲明類中的方法,該方法將不能在任何子類中重載。
注意:final關鍵字只能用于聲明類和方法。
八、抽象類和接口
1.抽象類
抽象類是一種特殊的類,使用關鍵字abstract來定義,不能被實例化。一個抽象類中至少包含一個抽象方法,抽象方法也是由abstract關鍵字來定義。抽象方法只提供了方法的聲明,不提供方法的實現(xiàn)。例如:
abstract function func($name,$number);
包含抽象方法的類必須是抽象類。
抽象類不能用于創(chuàng)建對象,所以只能通過繼承來使用。繼承抽象類的子類,必須重載抽象類中的所有抽象方法才能被實例化。
2.接口
PHP只能提供單繼承,即一個類只能有一個父類。接口是一個特殊的抽象類,使用interface關鍵字取代class關鍵字來定義。抽象類中允許存在非抽象的方法和屬性,而在接口中定義的方法都是抽象方法。在接口中不能使用屬性,但可以使用const關鍵字定義的常量。例如:
const con="tom";
接口的定義方法和定義類的方法類似,在接口中定義抽象方法不適用abstract關鍵字。
注意:接口中所有的方法都要求使用public定義,由于默認的訪問修飾符就是public,所以可以省略。
接口和類一樣,也支持繼承,接口之間的繼承也使用extends關鍵字。例如:
定義了接口之后可以將其實例化,接口的實例化稱為接口的實現(xiàn)。要實現(xiàn)一個接口需要一個子類來實現(xiàn)接口的所有抽象方法。定義接口的子類使用implements關鍵字,另外,一個子類還可以實現(xiàn)多個接口,這樣就解決了多繼承的問題。
一個子類還可以同時繼承一個父類和多個接口。
九、類的魔術方法
PHP規(guī)定以兩個下劃線“__”開頭的方法都保留為魔術方法,所以在定義函數(shù)名時盡量不要用"__"開頭,除非是為了重載已有的魔術方法。
1.克隆對象
PHP使用clone關鍵字建立一個與原對象擁有相同屬性和方法的對象,這種方法用于通過一個類實例化兩個類的對象的情況下。例如:
$new_obj=clone $old_obj;
$new_obj是新的對象名,$old_obj是要克隆的對象名。
克隆后的對象擁有克隆對象的全部屬性,如果需要改變這些屬性,可以使用PHP提供的魔術方法__clone。這個方法在克隆一個對象時將被自動調(diào)用,類似于__construct和__destruct方法。在__clone方法中,可以定義確切的復制行為或執(zhí)行一些操作。
2.方法重載
PHP5中有一個魔術方法__call,該方法可以用于實現(xiàn)方法的重載。__call方法必須要有兩個參數(shù)。第一個參數(shù)包含被調(diào)用的方法名稱,第二個參數(shù)包含傳遞給該方法的參數(shù)數(shù)組。__call方法在類中的方法被訪問時被調(diào)用。
3.訪問類的屬性
通常情況下,從類的外部直接訪問類的屬性是不建議使用的方法。這時可以使用__get和__set方法來檢查和設置屬性的值,這樣就可以實現(xiàn)封裝性。
4.字符串轉換
如果要輸出對象,可以在類中定義一個__toString方法,在方法中返回一個可輸出的字符串。
5.自動加載對象
__autoload方法用于自動加載對象,它不是一個類方法,而是一個單獨的函數(shù)。如果腳本中定義了__autoload函數(shù),當時用new關鍵字實例化一個沒有聲明的類時,這個類的名字將作為參數(shù)傳遞給__autoload函數(shù),__autoload函數(shù)根據(jù)參數(shù)自動包含有類的文件,并加載類文件中的同名類。
6.對象序列化
對象序列化是指將一個對象轉換成字節(jié)流的形式,將序列化后的對象在一個文件或網(wǎng)絡上傳輸,然后再反序列化還原為原數(shù)據(jù)。對象序列化使用serialize()函數(shù),反序列化使用unserialize()函數(shù)。在對象序列化時,如果存在魔術方法__sleep,PHP會調(diào)用__sleep方法,主要用于清楚如數(shù)據(jù)提交、關閉數(shù)據(jù)庫鏈接等工作,并返回一個數(shù)組,該數(shù)組包含需要序列化的所有變量;在反序列化一個對象后,PHP會調(diào)用__wakeup方法,主要用于重建對象序列化時丟失的資源。這兩個魔術方法都不接收參數(shù)。
十、實例類型的判斷
當系統(tǒng)很大時,往往需要判斷某個對象是否是某個類創(chuàng)建的。這時可以使用instanceof關鍵字來實現(xiàn)。instanceof關鍵字可以檢查一個對象的類型,判斷一個對象是否是特定類的實例,是否繼承于某個類或?qū)崿F(xiàn)某個接口。用法如下:
$var instanceof class_name;
如果變量$var是類class_name創(chuàng)建的對象,則返回TRUE,否則返回FALSE。
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。