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

本文是根據慕課網Jason老師的課程進行的PHP面試知識點總結和昇華,若有侵權請聯繫我進行刪除,email:guoyugygy@163.com

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

回顧真題

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

答案:面試

public:公有類型設計模式

在類、子類、外部均可以訪問微信

protected:受保護類型數據結構

在類、子類能夠訪問函數

private:私有類型學習

只要在子類能夠訪問this

考點分析

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

面向對象內容code

繼承

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

在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
若是這篇博文有幫助到您,能夠幫冷月點一個贊或者加一個關注哦!
歡迎關注個人公衆號:學長冷月,得到獨家整理的學習資源和平常乾貨推送。
若是您對個人專題內容感興趣,也能夠關注個人博客: guoyu7.com
相關文章
相關標籤/搜索