PHP七天系列之命名空間

使用場景


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

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

基本使用


默認(rèn)情況下常量、類和函數(shù)名都放在全局空間下。命名空間通過namespace 來聲明。
namespace 必須定義在文件頭部,并在 declare(strict_types=1) 語句下面。

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();
  • 不指定命名空間時將使用當(dāng)前命名空間
  • 如果命名空間中的函數(shù)或常量未定義,將會使用全局命名空間

子命名空間


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

namespace App\Controller;

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

引入方式


非限定名稱

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

namespace App;

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

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

限定名稱

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

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)會使用當(dāng)前命名空間加上 Controller 做為 Order 類的命名空間。

完全限定名稱

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

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();

別名引入


通過操作符 use 來為類或命名空間使用別名。

基本使用

本實例使用的示例目錄結(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 類時方法如下

Controller\User::make()

別名

在引入多個同名類時會有沖突情況發(fā)生,可以通過起別名的方式處理

namespace pfinal;

use App\Controller\User as Member;

include 'App/Controller/User.php';

echo Member::make();

多個引入

可以使用多行 use 或用逗號分隔多個類(空間)形式處理多個導(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();

使用逗號分隔

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

自動加載


注冊加載

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

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

使用類方法實現(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ū)建議使用的方式,下面簡略介紹使用方法。

項目初始
$ composer init

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

修改配置文件

個性 composer.json 配置文件,其中 autoload 配置項是自動加載設(shè)置。

  • files 是自動加載文件列表,適合于加載函數(shù)
  • psr-4 自動加載命名空間與目錄對應(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,如果修改過配置文件需要執(zhí)行 composer update

配置

在項目中使用以下代碼即可完成自動加載。

include 'vendor/autoload.php';
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 提出問題 解決問題--命名空間的使用 PHP的命名空間(namespace)是php5.3之后才有的。這個概念在C...
    洞房花豬閱讀 2,968評論 0 3
  • 命名空間概述 什么是命名空間?從廣義上來說,命名空間是一種封裝事物的方法。在很多地方都可以見到這種抽象概念。例如,...
    天譴殘魂閱讀 543評論 0 2
  • PHP自動加載 此篇文章主要介紹加載的php類的方式,以及自動加載的幾種模式;題外話:大家空了可以多看看別人寫的框...
    傅二毛閱讀 2,709評論 3 8
  • 一、簡介 什么是命名空間?從廣義上來說,命名空間是一種封裝事物的方法。例如,在操作系統(tǒng)中目錄用來將相關(guān)文件分組,對...
    四月不見閱讀 262評論 1 1
  • 對于命名空間,官方文檔已經(jīng)說得很詳細[查看],我在這里做了一下實踐和總結(jié)。 命名空間一個最明確的目的就是解決重名問...
    斯文小螞蟻閱讀 449評論 0 0

友情鏈接更多精彩內(nèi)容