PHP七天系列之命名空間

使用場(chǎng)景


大部分情況都需要多個(gè)文件才可以業(yè)務(wù),這就會(huì)出現(xiàn)類名沖突的情況發(fā)生蝶俱,命名空間可以解決這類問(wèn)題人实昨。

在操作系統(tǒng)中目錄用來(lái)將文件管理,它就扮演了命名空間的角色窗看。例如文件foo.txt 可以同時(shí)在目錄/home/greg 和 /home/other 中存在茸歧,但在同一個(gè)目錄中不能存在兩個(gè) foo.txt 文件。另外显沈,在目錄 /home/greg 外訪問(wèn) foo.txt 文件時(shí)软瞎,我們必須將目錄名以及目錄分隔符放在文件名之前得到/home/greg/foo.txt逢唤。這 個(gè)原理應(yīng)用到程序設(shè)計(jì)領(lǐng)域就是命名空間的概念。

基本使用


默認(rèn)情況下常量涤浇、類和函數(shù)名都放在全局空間下鳖藕。命名空間通過(guò)namespace 來(lái)聲明。
namespace 必須定義在文件頭部只锭,并在 declare(strict_types=1) 語(yǔ)句下面吊奢。

helper.php
function sum()
{
    return 'helper sum';
}
test.php
namespace PFinalClub;

include 'helper.php';
function sum()
{
    return 'pfinal sum';
}
# 使用當(dāng)前命名空間中的sum
echo sum();
# 使用 helper.php 中的sum
echo \sum();
  • 不指定命名空間時(shí)將使用當(dāng)前命名空間
  • 如果命名空間中的函數(shù)或常量未定義,將會(huì)使用全局命名空間

子命名空間


PHP 命名空間也允許指定層次化的命名空間的名稱纹烹,如 App\Controller 形式页滚,一般情況下我們將層次與目錄結(jié)構(gòu)匹配。

namespace App\Controller;

class Bootstrap
{
    public function make()
{
        return __METHOD__;
    }
}

引入方式


非限定名稱

調(diào)用類時(shí)沒有指定命名空間時(shí)铺呵,將使用當(dāng)前命名空間裹驰。
下面在使用 User 時(shí)沒有指定命名空間將使用當(dāng)前命名空間。

namespace App;

class User
{
    public function make()
{
        return __METHOD__;
    }
}

$user = new User;
echo $user->make();

限定名稱

限定名稱類似于文件系統(tǒng)中的相對(duì)路徑 片挂。

Order.php
namespace App\Controller;

class Order
{
    public static function make()
{
        return __METHOD__;
    }
}
Test.php
namespace App;

include 'Order.php';
class User
{
    public static function make()
{
        return __METHOD__;
    }
}
echo Controller\Order::make();

使用限定名稱調(diào)用 Order 類幻林,系統(tǒng)會(huì)使用當(dāng)前命名空間加上 Controller 做為 Order 類的命名空間。

完全限定名稱

類似于文件系統(tǒng)中的絕對(duì)路徑音念,以下面的代碼為例沪饺,調(diào)用Order類時(shí)可以使用以下的完全限定方式。

echo \App\Controller\Order::make();

常量


常量 NAMESPACE 的值是包含當(dāng)前命名空間名稱的字符串闷愤。

<?php
namespace App;

function factory($class)
{
    return __NAMESPACE__ . '\\' . $class;
}
class User
{
    public static function make()
{
        return __METHOD__;
    }
}
class Order
{
    public static function make()
{
        return __METHOD__;
    }
}
echo factory('Order')::make();

使用 namespace 關(guān)鍵字

<?php
namespace App;
class Order
{
    public static function make()
{
        return __METHOD__;
    }
}
echo namespace\Order::make();

別名引入


通過(guò)操作符 use 來(lái)為類或命名空間使用別名整葡。

基本使用

本實(shí)例使用的示例目錄結(jié)構(gòu)如下:

App
--Controller
  -- Comment.php
  -- User.php
boot.php
boot.php
namespace Houdunren;

use App\Controller\User;
include 'App/Controller/User.php';
echo User::make();

如果使用 use App\Controller,在引入 User 類時(shí)方法如下

Controller\User::make()

別名

在引入多個(gè)同名類時(shí)會(huì)有沖突情況發(fā)生讥脐,可以通過(guò)起別名的方式處理

namespace pfinal;

use App\Controller\User as Member;

include 'App/Controller/User.php';

echo Member::make();

多個(gè)引入

可以使用多行 use 或用逗號(hào)分隔多個(gè)類(空間)形式處理多個(gè)導(dǎo)入的情況

namespace pfinal;

use App\Controller\User as Member;
use App\Controller\Comment;

include 'App/Controller/User.php';
include 'App/Controller/Comment.php';

echo Member::make();

使用逗號(hào)分隔

<?php
...
use App\Controller\User as Member, App\Controller\Comment;
...

自動(dòng)加載


注冊(cè)加載

以往的 __autoload 自動(dòng)加載函數(shù)已經(jīng)在 php7.2 廢棄使用遭居,所以使用 spl_autoload_register 函數(shù)完成自動(dòng)加載處理。

spl_autoload_register(function (string $class) {
    $file = str_replace('\\', '/', $class) . '.php';
    if (!is_file($file)) {
        throw new \Exception("file don't exists");
    }
    require $file;
});

使用類方法實(shí)現(xiàn)

class Bootstrap
{
    public function autoload($class)
{
        $file = str_replace('\\', '/', $class) . '.php';
        if (!is_file($file)) {
            throw new \Exception("file don't exists");
        }
        require $file;
    }
}
spl_autoload_register([new Bootstrap, 'autoload']);

composer

使用composer 是PFinal社區(qū)建議使用的方式旬渠,下面簡(jiǎn)略介紹使用方法俱萍。

項(xiàng)目初始
$ composer init

直行上面命令并一直回車下去

修改配置文件

個(gè)性 composer.json 配置文件,其中 autoload 配置項(xiàng)是自動(dòng)加載設(shè)置告丢。

  • files 是自動(dòng)加載文件列表枪蘑,適合于加載函數(shù)
  • psr-4 自動(dòng)加載命名空間與目錄對(duì)應(yīng)關(guān)系
{
    "name": "pf/php",
    "authors": [
        {
            "name": "pf.com",
            "email": "lampxiezi@163.com"
        }
    ],
    "autoload": {
        "files": [
            "App/helper.php"
        ],
        "psr-4": {
            "App\\": "App"
        }
    },
    "require": {}
}

安裝與更新

修改配置文件后執(zhí)行 composer install 生成 vendor,如果修改過(guò)配置文件需要執(zhí)行 composer update岖免。

配置

在項(xiàng)目中使用以下代碼即可完成自動(dòng)加載岳颇。

include 'vendor/autoload.php';
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市觅捆,隨后出現(xiàn)的幾起案子赦役,更是在濱河造成了極大的恐慌麻敌,老刑警劉巖栅炒,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡赢赊,警方通過(guò)查閱死者的電腦和手機(jī)乙漓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)释移,“玉大人叭披,你說(shuō)我怎么就攤上這事⊥婊洌” “怎么了涩蜘?”我有些...
    開封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)熏纯。 經(jīng)常有香客問(wèn)我同诫,道長(zhǎng),這世上最難降的妖魔是什么樟澜? 我笑而不...
    開封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任误窖,我火速辦了婚禮,結(jié)果婚禮上秩贰,老公的妹妹穿的比我還像新娘霹俺。我一直安慰自己,他們只是感情好毒费,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開白布丙唧。 她就那樣靜靜地躺著,像睡著了一般觅玻。 火紅的嫁衣襯著肌膚如雪艇棕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天串塑,我揣著相機(jī)與錄音沼琉,去河邊找鬼。 笑死桩匪,一個(gè)胖子當(dāng)著我的面吹牛打瘪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播傻昙,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼闺骚,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了妆档?” 一聲冷哼從身側(cè)響起僻爽,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎贾惦,沒想到半個(gè)月后胸梆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體敦捧,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年碰镜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了兢卵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡绪颖,死狀恐怖秽荤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情柠横,我是刑警寧澤窃款,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站牍氛,受9級(jí)特大地震影響雁乡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜糜俗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一踱稍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧悠抹,春花似錦珠月、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至卵凑,卻和暖如春庆聘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背勺卢。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工伙判, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人黑忱。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓宴抚,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親甫煞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子菇曲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 提出問(wèn)題 解決問(wèn)題--命名空間的使用 PHP的命名空間(namespace)是php5.3之后才有的。這個(gè)概念在C...
    洞房花豬閱讀 2,844評(píng)論 0 3
  • 命名空間概述 什么是命名空間抚吠?從廣義上來(lái)說(shuō)常潮,命名空間是一種封裝事物的方法。在很多地方都可以見到這種抽象概念楷力。例如喊式,...
    天譴殘魂閱讀 454評(píng)論 0 2
  • PHP自動(dòng)加載 此篇文章主要介紹加載的php類的方式孵户,以及自動(dòng)加載的幾種模式;題外話:大家空了可以多看看別人寫的框...
    傅二毛閱讀 2,482評(píng)論 3 8
  • 一垃帅、簡(jiǎn)介 什么是命名空間延届?從廣義上來(lái)說(shuō)剪勿,命名空間是一種封裝事物的方法贸诚。例如,在操作系統(tǒng)中目錄用來(lái)將相關(guān)文件分組厕吉,對(duì)...
    四月不見閱讀 231評(píng)論 1 1
  • 對(duì)于命名空間酱固,官方文檔已經(jīng)說(shuō)得很詳細(xì)[查看],我在這里做了一下實(shí)踐和總結(jié)头朱。 命名空間一個(gè)最明確的目的就是解決重名問(wèn)...
    斯文小螞蟻閱讀 378評(píng)論 0 0