溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

PHP中關(guān)于面向?qū)ο蟪绦蛟O(shè)計的相關(guān)簡介

發(fā)布時間:2020-09-04 17:06:35 來源:網(wǎng)絡(luò) 閱讀:325 作者:PXZ6603 欄目:web開發(fā)

PHP面向?qū)ο蟪绦蛟O(shè)計

面向?qū)ο蟮某绦蛟O(shè)計(Object Oriented Programming)

一、面向?qū)ο蟪绦蛟O(shè)計的概念

PHP引進的面向?qū)ο蟮脑O(shè)計方法,將數(shù)據(jù)及處理數(shù)據(jù)的相應(yīng)函數(shù)“封裝”到一個“類(class)”中。類的實例稱為“對象”。在一個對象內(nèi),只有屬于該對象的函數(shù)才可以存取該對象的數(shù)據(jù)。

面向?qū)ο蟮某绦蛟O(shè)計有三個主要特征:封裝、繼承和多態(tài)。

1.封裝

封裝是將數(shù)據(jù)和代碼捆綁到一起,避免外界的干擾和不確定性。在PHP中,封裝是通過類來實現(xiàn)的。類是抽象數(shù)據(jù)類型的實現(xiàn),一個類的所有對象都具有相同的數(shù)據(jù)結(jié)構(gòu),并且共享相同的實現(xiàn)操作的代碼,而各個對象又有著各自不同的狀態(tài),即私有的存儲。因此,類是所有對象的共同的行為和不同狀態(tài)的結(jié)合體。

由一個特定的類所創(chuàng)建的對象稱為這個類的實例,因此類是對象的抽象及描述,它是具有共同行為的若干對象的統(tǒng)一描述體。類中還包含生成對象的具體方法。

2.繼承

類提供了創(chuàng)建新類的一種方法,再借助于“繼承”,這一重要機制擴充了類的定義,實現(xiàn)了面向?qū)ο蟮膬?yōu)越性。

繼承提供了創(chuàng)建新類的方法:一個新類可以通過對已有的類進行修改或擴充來滿足新類的需求。新類共享已有類的行為,而自己還具有修改的或額外添加的行為。因此,可以說繼承的本質(zhì)特征是行為共享。

從一個類繼承定義的新類,將繼承已有類的所有方法和屬性,并且可以添加所需要的新的方法和屬性。新類被稱為已有類的子類,已有類稱為父類,又叫基類。

3.多態(tài)

不同的類對于不同的操作具有不同的行為,稱為多態(tài)。多態(tài)機制使具有不同的內(nèi)部結(jié)構(gòu)的對象可以共享相同的外部接口,通過這種方式減少代碼的負責(zé)度。

二、在PHP中創(chuàng)建類、屬性和方法

類是面向?qū)ο蟪绦蛟O(shè)計的核心,它是一種數(shù)據(jù)類型。類由變量和函數(shù)組成,在類里面,變量稱為屬性或成員變量,函數(shù)稱為方法。定義類的語法格式如下:

class classname
{
    [var $property[=value];...]
     [function functionname($args)
     {
         //代碼
     }
     ]
}

在PHP中,類需要使用class關(guān)鍵字來定義,后面跟類名classname。類的命名規(guī)則要符合PHP標記的命名規(guī)則,并且不能是PHP的保留字。類名后跟一對花括號,花括號里面包含類的屬性和方法。

在類中,使用關(guān)鍵字var來聲明變量,即類的屬性。使用關(guān)鍵字function來定義函數(shù),即類的方法。

注意:在定義屬性時,給屬性賦的值不能使用定界符,不能是表達式,不能包含括號,不能通過其他變量賦值。另外,在類的方法內(nèi)部的變量只是普通變量,不屬于類的屬性,因為它的作用范圍只限于方法內(nèi)部。不能將類的定義放到多個文件或多個PHP塊中。

三、類的實例化與訪問

在聲明一個類后,類只存在于文件中,程序不能調(diào)用。需要創(chuàng)建一個對象后程序才能使用,創(chuàng)建一個類對象的過程叫做類的實例化。類的實例化使用new關(guān)鍵字,關(guān)鍵字后面需要指定實例化的類名。

在一個類中,可以訪問一個特殊的指針“$this”。如果當(dāng)前類有一個屬性$attribute,則在類的內(nèi)部要訪問這個屬性時,可以使用“$this->attribute”來引用。

在對象唄創(chuàng)建之后,可以在類的外部對該對象的屬性和方法進行訪問,訪問的方法是在對象后面使用“->”符合加上要訪問的屬性和方法。注意屬性的前面沒有“$”。

說明:有的類對類中的屬性進行了訪問控制,如果設(shè)置了類外部不能訪問類中屬性時,直接訪問將會發(fā)生錯誤。

四、類的訪問控制

在PHP5中,訪問修飾符public、private和protected,它們可以控制屬性和方法的可見性,通常放置在屬性和方法的聲明之前。

①public。聲明為公用的屬性和方法,可以在類的外部或內(nèi)部進行訪問。public是默認選項,如果沒有為一個屬性或方法制定修飾符,那么它將是public的。

②private。聲明為私有的屬性和方法,只可以在類的內(nèi)部進行訪問,私有的屬性和方法將不會被繼承。

③protected。聲明為被保護的屬性和方法,只可以在類的內(nèi)部和子類的內(nèi)部進行訪問。

在進行類的設(shè)計時,通常將類的屬性設(shè)為私有的,而將大多數(shù)方法設(shè)為公有的。這樣,類以外的代碼不能直接訪問類的私有數(shù)據(jù),從而實現(xiàn)了數(shù)據(jù)的封裝,而公有的方法可為內(nèi)部的私有數(shù)據(jù)提供外部接口,但接口實現(xiàn)的細節(jié)在類外又是不可見的。

五、靜態(tài)屬性和方法

所謂“靜態(tài)”是指所定義的屬性和方法與類的實例無關(guān),只與類本身有關(guān)。靜態(tài)的屬性和方法一般用于包含類要封裝的數(shù)據(jù)和功能,可以由所有類的實例共享。在類里面可以使用static關(guān)鍵字定義靜態(tài)屬性和方法。

訪問靜態(tài)屬性和方法時需要使用到范圍解析符“::”,格式如下:

classname::$attribute;    //訪問靜態(tài)屬性

classname::Cfunction([$args,...])    //訪問靜態(tài)方法

注意:只有靜態(tài)的屬性和方法才能使用范圍解析符,不能使用范圍解析符訪問非靜態(tài)的屬性和方法。

六、構(gòu)造函數(shù)和析構(gòu)函數(shù)

構(gòu)造函數(shù)是類中的一個特殊函數(shù),當(dāng)創(chuàng)建一個類的實例時,構(gòu)造函數(shù)將被自動調(diào)用,主要功能通常是對類中的對象完成初始化工作。與構(gòu)造函數(shù)相對的是析構(gòu)函數(shù),析構(gòu)函數(shù)在類的對象被銷毀時被自動調(diào)用。

①構(gòu)造函數(shù)。在PHP5中,構(gòu)造函數(shù)的名稱為“__construct”,"contruct"前面是兩根下劃線。如果一個類同時擁有__contruct構(gòu)造函數(shù)和類名相同的函數(shù),PHP5將把__construct看做是構(gòu)造函數(shù)。PHP中的構(gòu)造函數(shù)可以帶參數(shù),也可以不帶參數(shù)。

②析構(gòu)函數(shù)。類的析構(gòu)函數(shù)的名稱是__destruct,如果在類中聲明了__destruct函數(shù),PHP將在對象被銷毀前調(diào)用析構(gòu)函數(shù)將對象從內(nèi)存中銷毀,節(jié)省服務(wù)器資源。

如果構(gòu)造函數(shù)中帶了參數(shù),在創(chuàng)建對象時也可以在類名后面為構(gòu)造函數(shù)指定參數(shù)。

七、類的繼承

1.子類訪問父類

在PHP中,允許通過繼承其他類的方法來調(diào)用這些類里已經(jīng)定義好的屬性和方法,PHP不支持多繼承,所以一個子類只能繼承一個父類。可以使用extends關(guān)鍵字來指明類與類之間的關(guān)系。

類B繼承與類A,所以類B的對象可以訪問類A的屬性和方法,但A中的private的屬性和方法將不能被繼承,A中protected的屬性和方法只能在B的內(nèi)部訪問,類B創(chuàng)建的對象無法訪問,否則將產(chǎn)生錯誤。B作為A的子類,具有類A一樣的數(shù)據(jù)和功能,此外B還可以聲明自己的屬性和方法。

繼承是單方向的,子類可以從父類中繼承特性,但父類卻無法從子類中繼承特性。

如果子類中沒有自己的構(gòu)造函數(shù),那么子類在實例化時會自動調(diào)用父類的構(gòu)造函數(shù)。如果子類中有自己的構(gòu)造函數(shù),則執(zhí)行自己的構(gòu)造函數(shù)。

如果要在子類中調(diào)用父類的方法,除了使用“$this->”外,還可以使用parent關(guān)鍵字加范圍解析符,如“parent::functionname()”。建議使用后一種方法,因為前面的方法容易造成子類和父類方法結(jié)構(gòu)不清。而對于父類的屬性,在子類中只能使用“$this->”來訪問,屬性是不區(qū)分父類和子類的。

繼承可以是多重的。例如:類B繼承了類A,類C繼承了類B,那么類C也就繼承了類A和類B的父類的所有特性。

2.重載

方法的重載是指在一個類中可以定義多個擁有相同名稱的方法,通過參數(shù)個數(shù)和類型來區(qū)分這些方法。在PHP中可以通過類的繼承,在子類中定義和父類中相同名稱的方法來實現(xiàn)類似方法重載的特性。

3.使用final關(guān)鍵字

PHP中final關(guān)鍵字,在聲明類時使用這個關(guān)鍵字,將使這個類不能被繼承。另外,如果將final關(guān)鍵字用于聲明類中的方法,該方法將不能在任何子類中重載。

注意:final關(guān)鍵字只能用于聲明類和方法。

八、抽象類和接口

1.抽象類

抽象類是一種特殊的類,使用關(guān)鍵字abstract來定義,不能被實例化。一個抽象類中至少包含一個抽象方法,抽象方法也是由abstract關(guān)鍵字來定義。抽象方法只提供了方法的聲明,不提供方法的實現(xiàn)。例如:

abstract function func($name,$number);

包含抽象方法的類必須是抽象類。

抽象類不能用于創(chuàng)建對象,所以只能通過繼承來使用。繼承抽象類的子類,必須重載抽象類中的所有抽象方法才能被實例化。

2.接口

PHP只能提供單繼承,即一個類只能有一個父類。接口是一個特殊的抽象類,使用interface關(guān)鍵字取代class關(guān)鍵字來定義。抽象類中允許存在非抽象的方法和屬性,而在接口中定義的方法都是抽象方法。在接口中不能使用屬性,但可以使用const關(guān)鍵字定義的常量。例如:

const con="tom";

接口的定義方法和定義類的方法類似,在接口中定義抽象方法不適用abstract關(guān)鍵字。

注意:接口中所有的方法都要求使用public定義,由于默認的訪問修飾符就是public,所以可以省略。

接口和類一樣,也支持繼承,接口之間的繼承也使用extends關(guān)鍵字。例如:

<?php
interface A
{
    const name="";
    function show();
}
interface B extends A
{
    function getname();
}
?>

定義了接口之后可以將其實例化,接口的實例化稱為接口的實現(xiàn)。要實現(xiàn)一個接口需要一個子類來實現(xiàn)接口的所有抽象方法。定義接口的子類使用implements關(guān)鍵字,另外,一個子類還可以實現(xiàn)多個接口,這樣就解決了多繼承的問題。

一個子類還可以同時繼承一個父類和多個接口。

九、類的魔術(shù)方法

PHP規(guī)定以兩個下劃線“__”開頭的方法都保留為魔術(shù)方法,所以在定義函數(shù)名時盡量不要用"__"開頭,除非是為了重載已有的魔術(shù)方法。

1.克隆對象

PHP使用clone關(guān)鍵字建立一個與原對象擁有相同屬性和方法的對象,這種方法用于通過一個類實例化兩個類的對象的情況下。例如:

$new_obj=clone $old_obj;

$new_obj是新的對象名,$old_obj是要克隆的對象名。

克隆后的對象擁有克隆對象的全部屬性,如果需要改變這些屬性,可以使用PHP提供的魔術(shù)方法__clone。這個方法在克隆一個對象時將被自動調(diào)用,類似于__construct和__destruct方法。在__clone方法中,可以定義確切的復(fù)制行為或執(zhí)行一些操作。

2.方法重載

PHP5中有一個魔術(shù)方法__call,該方法可以用于實現(xiàn)方法的重載。__call方法必須要有兩個參數(shù)。第一個參數(shù)包含被調(diào)用的方法名稱,第二個參數(shù)包含傳遞給該方法的參數(shù)數(shù)組。__call方法在類中的方法被訪問時被調(diào)用。

3.訪問類的屬性

通常情況下,從類的外部直接訪問類的屬性是不建議使用的方法。這時可以使用__get和__set方法來檢查和設(shè)置屬性的值,這樣就可以實現(xiàn)封裝性。

4.字符串轉(zhuǎn)換

如果要輸出對象,可以在類中定義一個__toString方法,在方法中返回一個可輸出的字符串。

5.自動加載對象

__autoload方法用于自動加載對象,它不是一個類方法,而是一個單獨的函數(shù)。如果腳本中定義了__autoload函數(shù),當(dāng)時用new關(guān)鍵字實例化一個沒有聲明的類時,這個類的名字將作為參數(shù)傳遞給__autoload函數(shù),__autoload函數(shù)根據(jù)參數(shù)自動包含有類的文件,并加載類文件中的同名類。

6.對象序列化

對象序列化是指將一個對象轉(zhuǎn)換成字節(jié)流的形式,將序列化后的對象在一個文件或網(wǎng)絡(luò)上傳輸,然后再反序列化還原為原數(shù)據(jù)。對象序列化使用serialize()函數(shù),反序列化使用unserialize()函數(shù)。在對象序列化時,如果存在魔術(shù)方法__sleep,PHP會調(diào)用__sleep方法,主要用于清楚如數(shù)據(jù)提交、關(guān)閉數(shù)據(jù)庫鏈接等工作,并返回一個數(shù)組,該數(shù)組包含需要序列化的所有變量;在反序列化一個對象后,PHP會調(diào)用__wakeup方法,主要用于重建對象序列化時丟失的資源。這兩個魔術(shù)方法都不接收參數(shù)。

十、實例類型的判斷

當(dāng)系統(tǒng)很大時,往往需要判斷某個對象是否是某個類創(chuàng)建的。這時可以使用instanceof關(guān)鍵字來實現(xiàn)。instanceof關(guān)鍵字可以檢查一個對象的類型,判斷一個對象是否是特定類的實例,是否繼承于某個類或?qū)崿F(xiàn)某個接口。用法如下:

$var instanceof class_name;

如果變量$var是類class_name創(chuàng)建的對象,則返回TRUE,否則返回FALSE。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI