php面試筆記(9)-php基礎知識-面向對象考點

本文是根據慕課網Jason老師的課程進行的PHP面試知識點總結和昇華,如有侵權請聯繫我進行刪除,email:[email protected]

在上一篇博文中,冷月爲大家分享了會話控制的考點,其中 Cookie 和 Session 是其中的重點,對於客戶端和服務端中的會話管理,各位小夥伴一定要勤加練習。今天,冷月爲大家分享面向對象考點。

回顧真題

請寫出 PHP 類權限控制修飾符

答案:

public:公有類型

在類、子類、外部都可以訪問

protected:受保護類型

在類、子類可以訪問

private:私有類型

只要在子類可以訪問

考點分析

本考點主要是考察php中類中的權限控制修飾符,已經面向對象的特性、魔術方法、設計模式等考點

面向對象內容

繼承

繼承性是子類自動共享父類數據結構和方法的機制,這是類之間的一種關係。在定義和實現一個類的時候,可以在一個已經存在的類的基礎之上來進行,把這個已經存在的類所定義的內容作爲自己的內容,並加入若干新的內容。

在php中類是單一繼承,即一個類只能繼承一個父類。

方法重寫

子類在繼承了父類後,可以重寫父類的方法,即寫一個與父類重名的方法將其覆蓋。final修飾的類方法不可被子類重寫。也可以使用parent::方法名()來調用父類的方法。

<?php
/**
 * Created by 冷月小白.
 * 微信公衆號: 學長冷月
 */

class Dog
{
    public function name()
    {
        echo "i am a dog";
    }
}

class XiaoHuang extends Dog
{
    public function name()
    {
        echo "i am xiaohuang";
    }
}

$xiaohuang = new XiaoHuang();
$xiaohuang->name(); //輸出 "i am xiaohuang"

封裝

封裝是指將現實世界中存在的某個客體的屬性與行爲綁定在一起,並放置在一個邏輯單元內。

多態

多態性是指相同的函數或方法可作用於多種類型的對象上並獲得不同的結果。不同的對象,收到同一消息可以產生不同的結果,這種現象稱爲多態性。

抽象類的定義

任何一個類,如果它裏面至少有一個方法是被聲明爲抽象的,那麼這個類就必須被聲明爲抽象的。

定義爲抽象的類不能被實例化。

繼承一個抽象類的時候,子類必須定義父類中的所有抽象方法;另外,這些方法的訪問控制必須和父類中一樣(或者更爲寬鬆)。例如某個抽象方法被聲明爲受保護的,那麼子類中實現的方法就應該聲明爲受保護的或者公有的,而不能定義爲私有的。

<?php
/**
 * Created by 冷月小白.
 * 微信公衆號: 學長冷月
 */

abstract class AbstractClass
{
    // 強制要求子類定義這些方法
    abstract protected function getValue();
    abstract protected function prefixValue($prefix);

    // 普通方法(非抽象方法)
    public function printOut() {
        print $this->getValue() . PHP_EOL;
    }
}

class ConcreteClass1 extends AbstractClass
{
    protected function getValue() {
        return "ConcreteClass1";
    }

    public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass1";
    }
}

class ConcreteClass2 extends AbstractClass
{
    public function getValue() {
        return "ConcreteClass2";
    }

    public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass2";
    }
}

$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') . PHP_EOL;

$class2 = new ConcreteClass2;
$class2->printOut();
echo $class2->prefixValue('FOO_') . PHP_EOL;
?>

接口的定義

使用接口(interface),可以指定某個類必須實現哪些方法,但不需要定義這些方法的具體內容。

接口是通過 interface 關鍵字來定義的,就像定義一個標準的類一樣,但其中定義所有的方法都是空的。

接口中定義的所有方法都必須是公有,這是接口的特性。

要實現一個接口,使用 implements 操作符。類中必須實現接口中定義的所有方法,否則會報一個致命錯誤。類可以實現多個接口,用逗號來分隔多個接口的名稱。

<?php
/**
 * Created by 冷月小白.
 * 微信公衆號: 學長冷月
 */

// 聲明一個'iTemplate'接口
interface Name
{
    public function setName($name,$value);
    public function getName($name);
}


// 實現接口
class myName implements Name
{
    private $vars = array();

    public function setName($name, $var)
    {
        $this->vars[$name] = $var;
    }

    public function getName($name)
    {
        return $this->vars[$name];
    }
}

$my = new myName();
$my -> setName('a','b');
echo $my -> getName('a'); //b

魔術方法

__construct() 函數

構造函數,在實例化類的時候自動執行

__destruct()函數

析構函數,析構函數會在到某個對象的所有引用都被刪除或者當對象被顯式銷燬時執行。

__call()函數

在對象中調用一個不可訪問方法時,__call() 會被調用。

__callStatic()函數

在靜態上下文中調用一個不可訪問方法時,__callStatic() 會被調用。

__get()

讀取不可訪問屬性的值時,__get() 會被調用。

__set()

在給不可訪問屬性賦值時,__set() 會被調用。

__isset()

當對不可訪問屬性調用 isset() 或 empty() 時,__isset() 會被調用。

__usset()

當對不可訪問屬性調用 unset() 時,__unset() 會被調用。

__sleep()

serialize() 函數會檢查類中是否存在一個魔術方法 __sleep()。如果存在,則該方法會優先被調用,然後才執行序列化操作。

__wakeup()

unserialize()會檢查是否存在一個__wakeup方法。如果存在,則會先調用 __wakeup方法,預先準備對象數據。

__toString()

__toString() 的具體用途是當一個對象被當作字符串對待的時候,會觸發這個魔術方法。

__clone()

當對象被clone時,會觸發這個方法

設計模式

工廠模式

單例模式

註冊樹模式

設配器模式

觀察者模式

策略模式

一網打盡

請寫出PHP的構造函數和析構函數

答案

<?php
/**
 * Created by 冷月小白.
 * 微信公衆號: 學長冷月
 */

class A
{
    public function __construct() //實例化時觸發
    {
        echo "我被實例化拉";
    }
    
    public function __destruct() //對象被銷燬時觸發
    {
        echo "我被撤銷啦";
    }
}

如果這篇博文有幫助到您,可以幫冷月點一個贊或者加一個關注哦!

歡迎關注我的公衆號:學長冷月,獲得獨家整理的學習資源和日常乾貨推送。
如果您對我的專題內容感興趣,也可以關注我的博客:guoyu7.com

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章