溫馨提示×

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

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

PHP的面向?qū)ο蟮挠梅ń榻B

發(fā)布時(shí)間:2021-09-13 17:45:45 來(lái)源:億速云 閱讀:103 作者:chen 欄目:編程語(yǔ)言

本篇內(nèi)容主要講解“PHP的面向?qū)ο蟮挠梅ń榻B”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“PHP的面向?qū)ο蟮挠梅ń榻B”吧!

面向?qū)ο?/strong>

早期編程由于受電腦硬件限制,程序都是追求效率,而忽略可理解性,擴(kuò)充性,隨著硬件技術(shù)的發(fā)展,編程越來(lái)越重視多人開(kāi)發(fā),程序員越來(lái)越重視程序的可靠性,可擴(kuò)展性,可維護(hù)性,所以刺激了程序語(yǔ)言的發(fā)展

面向過(guò)程

  • 程序員設(shè)計(jì)好程序代碼流程圖,輔助程序設(shè)計(jì)。優(yōu)點(diǎn):用什么功能就編寫(xiě)什么函數(shù) 缺點(diǎn):數(shù)據(jù)管理上比較混亂 ,主要集中在函數(shù)成面上,面向?qū)ο蟀褜傩院头椒ㄟM(jìn)行封裝,更好的可重用性和可擴(kuò)展性

面向?qū)ο?/p>

  • 萬(wàn)物皆對(duì)象,將構(gòu)成問(wèn)題的事務(wù)分解到各個(gè)對(duì)象上,建立對(duì)象的目的不是為了完成一個(gè)工作,而是為了描述某個(gè)事務(wù)在解決問(wèn)題中的行為,更符合人的思維習(xí)慣,代碼重用性高,可擴(kuò)展性好

面向?qū)ο蠛兔嫦蜻^(guò)程的核心區(qū)別是如何分配職責(zé)。

類(lèi)和對(duì)象

面向?qū)ο笫怯梢幌到y(tǒng)具有屬性和方法的對(duì)象構(gòu)成,對(duì)象之間相互交互 ,從而實(shí)現(xiàn)業(yè)務(wù)需求。

屬性

  • 在類(lèi)中定義的變量,即為成員屬性,用于描述對(duì)象靜態(tài)特性的數(shù)據(jù)。如人的姓名,性別,首字母小寫(xiě)

方法

  • 函數(shù)定義在類(lèi)中即為成員方法,用于描述對(duì)象動(dòng)態(tài)特性的操作行為,方法名不區(qū)分大小寫(xiě),不可重名,首字母小寫(xiě)

對(duì)象生命周期

  • 創(chuàng)建后,生命周期開(kāi)始,當(dāng)程序結(jié)束后或程序員清除對(duì)象后即銷(xiāo)毀,PHP會(huì)自動(dòng)銷(xiāo)毀對(duì)象

類(lèi)是一種抽象的概念,是具有相同語(yǔ)義定義對(duì)象的集合(具有相同屬性和方法的集體),使用具體的類(lèi)是不可行的,只能實(shí)例化。拿汽車(chē)舉例,汽車(chē)的設(shè)計(jì)圖紙就是類(lèi),汽車(chē)是對(duì)象。設(shè)計(jì)中重點(diǎn)是類(lèi)的創(chuàng)建

類(lèi)名書(shū)寫(xiě)規(guī)范

  • 類(lèi)名首字母大寫(xiě)

  • 一個(gè)類(lèi)定義在一個(gè)文件中

$this

對(duì)象中使用 $this 指針可以訪問(wèn)屬性或方法。

class Code
{
    protected $len = 5;
    public function make()
    {
        return $this->len . $this->show();
    }
    public function show()
    {
        return ' : is show';
    }
}
echo (new Code)->make();

繼承

通過(guò)使用 extends 可以繼承父類(lèi)的屬性與方法,在PHP中繼承是單一的。

class Notify
{
    public function message()
    {
        return 'notify message';
    }
}
class User extends Notify
{ }
echo (new User)->message();

父類(lèi)調(diào)用

子類(lèi)可以使用 parent 關(guān)鍵字調(diào)用父類(lèi)方法

...
public function message()
{
	return parent::message();
}
...

方法重寫(xiě)

子類(lèi)可以重寫(xiě)父類(lèi)的方法,除非父類(lèi)的方法沒(méi)有使用 final 修飾。

class Notify
{
    public function message()
    {
        return 'notify message';
    }
}
class User extends Notify
{
    public function message()
    {
        return 'user notify';
    }
}
echo (new User)->message();

禁止重寫(xiě)

使用final聲明的方法,將禁止在子類(lèi)中重寫(xiě)父類(lèi)方法。

public final function message()
{
	return 'notify message';
}

封裝

public 公有

  • 在類(lèi)的內(nèi)部與外部或子類(lèi)都可以訪問(wèn),是最開(kāi)放的權(quán)限

private 私有

  • 定義類(lèi)的屬性和方法,在類(lèi)的內(nèi)部可以訪問(wèn),在類(lèi)的外部或子類(lèi)都不可以訪問(wèn)

protected 受保護(hù)

  • 定義類(lèi)的屬性和方法,在類(lèi)的內(nèi)部或子類(lèi)可以訪問(wèn),類(lèi)的外部不可以訪問(wèn)

模塊設(shè)計(jì)

  • 強(qiáng)內(nèi)聚(功能盡量在類(lèi)的內(nèi)部完成),弱耦合(開(kāi)放盡量少的方法給外部調(diào)用)。例:公司銷(xiāo)售接項(xiàng)目,具體工作交給公司內(nèi)部程序員,設(shè)計(jì)人員,服務(wù)器管理人員協(xié)同完成

trait

使用trait 機(jī)制可以變相的使用多重繼承。

class Alipay
{
    use Pay;
}
class WePay
{
    use Pay;
}

trait Pay
{
    public function sn()
    {
        return 'ABCDEF';
    }
}
echo (new WePay)->sn();

如果本類(lèi)與 trait 中存在同名的屬性和方法時(shí),將使用本類(lèi)中的屬性與方法。

...
class WePay
{
    use Pay;
    public function sn()
    {
        return __METHOD__;
    }
}

trait Pay
{
    public function sn()
    {
        return 'ABCDEF';
    }
}
...

多個(gè)trait

可以使用多個(gè) trait 用逗號(hào)連接

...
use Pay,Site;
...

解決沖突

class WePay
{
    use Pay, Email {
    Pay::notify insteadof Email;
    Email::notify as EmailNotify;
}
trait Pay
{
    public function notify()
    {
        return __METHOD__;
    }
}
trait Email
{
    public function notify()
    { 
    	return __METHOD__;
    }
}
echo (new WePay)->notify();

Pay::notify insteadof Email 表示使用 Pay::notify 方法替代 Email::notify 方法。

Email::notify as EmailNotify` 將`Email:notify` 別名為 `EmailNotify

訪問(wèn)控制

可以為繼承的 trait 方法重新定義訪問(wèn)控制

class WePay
{
    use Pay, Email {
    Pay::notify insteadof Email;
    Email::notify as protected EmailNotify;
    ...
}

多重trait

可以通過(guò)多個(gè)trait 組合來(lái)使用。

trait Notify
{
    public function response()
    {
        return 'notify response';
    }
}
trait Pay
{
    use Notify;
}

class User
{
    use Pay;
}
echo (new User)->response();

抽象方法

trait Notify
{
    public function response()
    {
        return 'notify response' . $this->sn();
    }
    abstract protected function sn();
}
trait Pay
{
    use Notify;
}

class User
{
    use Pay;
    protected function sn()
    {
        return 'SN999';
    }
}
echo (new User)->response();

靜態(tài)方法

trait 中可以使用靜態(tài)方法、抽象方法、靜態(tài)屬性。

...
trait Pay
{
    public function sn()
    {
        return 'ABCDEF';
    }
    public static function notify()
    {
        return __METHOD__;
    }
}
class WePay
{
    use Pay;
    ...
}
echo WePay::notify();

static

static:

  • 需要一個(gè)數(shù)據(jù)對(duì)象只服務(wù)于類(lèi),即類(lèi)內(nèi)部可用,對(duì)外不可用時(shí)。建對(duì)象是極其耗費(fèi)資源的,因此當(dāng)一個(gè)方法具有比較強(qiáng)的公用性的時(shí)候,沒(méi)有必要為了調(diào)用這個(gè)方法而重新再生成該類(lèi)的實(shí)例。定義的方法或變量在程序第一次加載時(shí)即駐留內(nèi)存,程序結(jié)束釋放。

static變量:

  • 通過(guò)static聲明的成員變量為靜態(tài)變量或叫類(lèi)變量,是該類(lèi)的公共變量,在第一次使用時(shí)即生成,對(duì)于該類(lèi)的所有對(duì)象只有一份,是屬于類(lèi)的,不是屬于對(duì)象的。static變量是屬于類(lèi)而不屬于對(duì)象,可以在任何地方通地類(lèi)來(lái)訪問(wèn),是類(lèi)的全局變量,類(lèi)創(chuàng)建時(shí)即存入內(nèi)存。對(duì)多個(gè)對(duì)象來(lái)說(shuō),靜態(tài)數(shù)據(jù)成員只存儲(chǔ)一處,可以節(jié)省內(nèi)存。只要對(duì)靜態(tài)數(shù)據(jù)成員的值更新一次,保證所有對(duì)象存取更新后的相同的值。

static方法:

  • 用static聲明的方法為靜態(tài)方法或叫類(lèi)方法,執(zhí)行該方法時(shí)不會(huì)將對(duì)象引用傳給函數(shù),所以我們不能訪問(wèn)非靜態(tài)成員,只能訪問(wèn)靜態(tài)方法或靜態(tài)變量。只能使用關(guān)于類(lèi)的方式如self static parent等。使用時(shí)不用生成對(duì)象即可執(zhí)行

類(lèi)常量

使用 const 來(lái)定義類(lèi)常量,常量使用 self::來(lái)調(diào)用。

class Model implements ArrayAccess, Iterator
{
    use ArrayIterator, Relation, Validate, Auto, Filter;
    //----------自動(dòng)驗(yàn)證----------
    //有字段時(shí)驗(yàn)證
    const EXIST_VALIDATE = 1;
    //值不為空時(shí)驗(yàn)證
    const NOT_EMPTY_VALIDATE = 2;
    ...
}

$this self:: parent::

$this

  • 是當(dāng)前對(duì)象的引用, 一般出現(xiàn)在方法里,用于獲取類(lèi)的成員屬性,或執(zhí)行類(lèi)的成員方法

self::

  • 對(duì)本類(lèi)的引用 ,用于獲取當(dāng)前類(lèi)的表態(tài)成員屬性或靜態(tài)成員方法self::run()

parent::

  • 對(duì)父類(lèi)的引用,調(diào)用父類(lèi)的方法或?qū)傩浴?/p>

魔術(shù)方法

構(gòu)造方法&析構(gòu)方法

構(gòu)造方法__construct()

  • 在創(chuàng)建對(duì)象時(shí)自動(dòng)執(zhí)行,沒(méi)有返回值,用于執(zhí)行類(lèi)的一些初始化工作,如對(duì)象屬性的初始化工作,構(gòu)造方法為_(kāi)_construct()。

  • 可以在構(gòu)造方法中傳遞參數(shù),用于定義屬性,在父類(lèi)和子類(lèi)都定義構(gòu)造方法時(shí),執(zhí)行子類(lèi)的構(gòu)造方法

析構(gòu)方法__destruct():

  • 當(dāng)所有對(duì)象的引用被銷(xiāo)毀時(shí)執(zhí)行。

__get 與__set

讀取不可訪問(wèn)或不存在的屬性時(shí),__get() 會(huì)被調(diào)用,同理獲取不可訪問(wèn)或不存的的屬性時(shí)會(huì)執(zhí)行 __set() 方法。

<?php
abstract class Query
{
    abstract protected function record(array $data);
    public function select()
    {
        return $this->record(['name' => '后盾人', 'age' => 33]);
    }
}
class Model extends Query
{
    protected $field = [
        'name'
    ];
		public function all(){
			$this->select();
			return $this->field;
		}
    protected function record(array $data)
    {
        $this->field = $data;
    }
    public function __get($name)
    {
        return $this->field[$name] ?? null;
    }
    public function __set($name, $value)
    {
        $this->field[$name] = $value;
    }
}

$user = new Model;
$user->all();
echo $user->name;
$user->name = '向軍大叔';
echo $user->name;ry

### __isset() 與 __unset()

當(dāng)使用 isset()函數(shù)或者empty()函數(shù) 判斷屬性是否存在或者是否為空的時(shí)候會(huì)自動(dòng)觸發(fā)。

當(dāng)使用 unset() 函數(shù)判斷屬性時(shí),如果存在__unset() 方法將會(huì)執(zhí)行。

...
public function __unset($name)
{
	if (!isset($this->field[$name]) || in_array($name, $this->deny)) {
		throw new Exception('禁止操作');
	}
}
public function __isset($name)
{
	return isset($this->field[$name]);
}
...

抽象類(lèi)&抽象方法

具有抽象方法的類(lèi)為抽象類(lèi),抽象方法即為沒(méi)有內(nèi)容的空方法,要求子類(lèi)進(jìn)行完善內(nèi)容,抽象類(lèi)不能實(shí)例化,只能繼承,通過(guò)extends來(lái)實(shí)現(xiàn),抽象類(lèi)中也可以定義普通方法

父類(lèi)方法執(zhí)行方式不確定,但子類(lèi)還都有這個(gè)方法

  • 例1:如交通工具類(lèi):定義抽象方法控制交通工具運(yùn)行方式,這樣每個(gè)交通工具如飛機(jī),汽車(chē)都要重寫(xiě)父類(lèi)方法。如果在父類(lèi)工具類(lèi)定義該方法(比如在地上走)沒(méi)有任何意義,因?yàn)槊總€(gè)交通工具都要重寫(xiě)(飛機(jī)要重寫(xiě)方法,船要重寫(xiě)方法),所以針對(duì)你類(lèi)方法的不確定性,我們需要抽象方法,實(shí)現(xiàn)多態(tài)。

例2:定義動(dòng)物類(lèi),每個(gè)動(dòng)物都有叫聲方法,但是表面不同,所以要定義為抽象類(lèi),讓每種動(dòng)物類(lèi)去實(shí)現(xiàn)功能。

  • 當(dāng)父類(lèi)為抽象類(lèi)時(shí),子類(lèi)必須重寫(xiě)父類(lèi)的抽象方法

  • 抽象類(lèi)里不一定非要寫(xiě)抽象方法,但有抽象方法的類(lèi)必須定義為抽象類(lèi)

  • 抽象類(lèi)必須繼承使用

  • 抽象方法不能有主體即{}

  • <?php abstract class AbstractClass { // 強(qiáng)制要求子類(lèi)定義這些方法 abstract protected function getValue(); abstract protected function prefixValue($prefix); // 普通方法(非抽象方法) public function printOut() { print $this->getValue(); } }

接口

接口是一組成員聲明方法的集合,包含空的成員方法和常量,空的方法要求繼承類(lèi)去具體實(shí)現(xiàn)。成員方法為public,屬性為常量。


    • 例如:現(xiàn)實(shí)中的電腦USB或PCI插槽,插線板等都有接口例子

繼承是一級(jí)一級(jí)層次式,如果某一層出現(xiàn)問(wèn)題,整個(gè)繼承就會(huì)出現(xiàn)意外。而接口只影響實(shí)現(xiàn)接口的類(lèi),接口可以在破壞原來(lái)的繼承基礎(chǔ)上對(duì)類(lèi)擴(kuò)展。接口可以實(shí)現(xiàn)多繼承。

  • 例:電腦USB接口,規(guī)定各個(gè)廠商必須構(gòu)造合適的接口方法,比如手機(jī),數(shù)碼相機(jī),網(wǎng)銀U盾。要讓各個(gè)廠商寫(xiě)自己的方法如U盾插到USB上他會(huì)自動(dòng)安裝網(wǎng)銀驅(qū)盾,彈出網(wǎng)頁(yè),手機(jī)裝上后可以打開(kāi)手機(jī)里的內(nèi)容,同時(shí)可以充電

抽象類(lèi)及普通類(lèi)都可以實(shí)現(xiàn)接口,通過(guò)關(guān)鍵字implements

接口與抽象類(lèi)的區(qū)別:

  • 1 接口只能用implements實(shí)現(xiàn) 抽象類(lèi)用extends繼承實(shí)現(xiàn)
    2 接口沒(méi)有數(shù)據(jù)成員,可以定義常量,抽象類(lèi)可以有
    3 接口沒(méi)有構(gòu)造函數(shù),抽象類(lèi)可以定義構(gòu)造函數(shù)
    4 接口方法都是public 抽象類(lèi)方法可以用protected private public來(lái)修飾
    5 一個(gè)類(lèi)可以實(shí)現(xiàn)多個(gè)接口,但只能繼承一個(gè)抽象類(lèi)
    6 接口中不可以有成員方法,抽象類(lèi)可以有成員方法

interface DbInterface {
    public function connectDb(); //獲得連接   參數(shù)為表名
    public function close(); //關(guān)閉數(shù)據(jù)庫(kù)
    public function exe($sql); //發(fā)送沒(méi)有返回值的sql
    public function query($sql); //有返回值的sql
}
class Db implements DbInterface
{
	public function exe($sql){
	}
	public function query($sql{
	}
}

到此,相信大家對(duì)“PHP的面向?qū)ο蟮挠梅ń榻B”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

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

php
AI