最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何理解PHP核心特性命名空間

 更新時(shí)間:2021年05月28日 09:01:25   作者:八重櫻  
在命名空間提出之前,不同的組件很容易碰到命名的沖突,例如Request、Response等常見的命名。本文將帶你理解PHP的核心特性命名空間。

提出

PHP 在 5.3 后提出了命名空間用來(lái)解決組件之間的命名沖突問題,主要參考了文件系統(tǒng)的設(shè)計(jì):

  • 同一個(gè)目錄下不允許有相同的文件名 - 同一個(gè)命名空間下不允許有相同的類;
  • 不同的目錄可以有同名文件 - 不同的命名空間可以有相同的類;

定義

使用namespace關(guān)鍵字來(lái)定義一個(gè)命名空間。其中,頂層命名空間通常為廠商名,不同開發(fā)者的廠商命名空間是唯一的。命名空間不需要與文件目錄一一對(duì)應(yīng),但是最好遵守PSR-4規(guī)范。

<?php

namespace Symfony\Component\HttpFoundation;

class Request {

}
命名空間必須在所有代碼之前聲明,唯一的例外就是 declare 關(guān)鍵字。

<?php

declare(strict_types=1);

namespace App;

命名空間內(nèi)可包含任意 PHP 代碼,但是僅對(duì)類 (包括抽象類和 Trait)、接口、函數(shù)和常量這四種類型生效。

<?php
namespace MyProject;

const CONNECT_OK = 1;
class FOO {}
interface Foo{}
function foo() {}

使用

使用use關(guān)鍵字來(lái)引入命名空間

<?php

namespace App;

use Symfony\Component\HttpFoundation\Request;
use Foo\Bar;

class Test {
    public function run()
    {
        $bar = new Bar();
    }
}

定義和使用推薦遵循PSR-2的規(guī)范

  • namespace之后必須存在一個(gè)空行;
  • 所有use聲明必須位于namespace聲明之后;
  • 每條use聲明必須只有一個(gè)use關(guān)鍵字。

use語(yǔ)句塊之后必須存在一個(gè)空行。

當(dāng)use引入的類出現(xiàn)同名時(shí),可使用as來(lái)定義別名

<?php

namespace App;

use Foo\Bar as BaseBar;

class Bar extends BaseBar {

}

限定符

除了使用use外,還可以直接使用\限定符來(lái)進(jìn)行解析,規(guī)則很簡(jiǎn)單:如果含有\(zhòng)前綴則代表從全局命名空間開始解析,否則則代表從當(dāng)前命名空間開始解析。

<?php

namespace App;

\Foo\Bar\foo();  // 解析成 \Foo\Bar\foo();
Foo\Bar\foo();  // 解析成 App\Foo\Bar\foo();
此規(guī)則也適用于函數(shù)、常量等

$a = \strlen('hi'); // 調(diào)用全局函數(shù) strlen
$b = \INI_ALL; // 訪問全局常量 INI_ALL
$c = new \Exception('error'); // 實(shí)例化全局類 Exception

有兩個(gè)需要特別注意的地方:

對(duì)于函數(shù)和常量而言,如果當(dāng)前命名空間不存在,則會(huì)自動(dòng)去全局命名空間去尋找,因此可省略\前綴。對(duì)于類而言,如果當(dāng)前命名空間解析不到,不會(huì)去全局空間尋找,因此,不可省略\

$a = strlen('hi');
$b = INI_ALL;
$c = new Exception('error'); // 錯(cuò)誤
$c = new \Exception('error'); // 正確

當(dāng)動(dòng)態(tài)調(diào)用命名空間時(shí),該命名空間始終會(huì)被當(dāng)成是全局命名空間,因此可以省略前綴\

$class1 = 'Foo\Bar';
$object1 = new $class1;  // 始終被解析成 \Foo\Bar

在內(nèi)部訪問命名空間

PHP 支持兩種抽象的訪問當(dāng)前命名空間內(nèi)部元素的方法,__NAMESPACE__魔術(shù)常量和namespace關(guān)鍵字。

__NAMESPACE__常量的值是包含當(dāng)前命名空間名稱的字符串,如果是在全局命名空間,則返回空字符串。

<?php
namespace MyProject;

function get($classname)
{
    $a = __NAMESPACE__ . '\\' . $classname;
    return new $a;
}

關(guān)鍵字namespace可用來(lái)顯式訪問當(dāng)前命名空間或子命名空間中的元素。它等價(jià)于類中的self操作符

namespace App;

use blah\blah as mine;

blah\mine(); // App\blah\mine()
namespace\blah\mine(); // App\blah\mine()

namespace\func(); // App\func()
namespace\sub\func(); // App\sub\func()
namespace\cname::method(); // App\cname::method()
$a = new namespace\sub\cname(); // App\sub\cname
$b = namespace\CONSTANT; // App\CONSTANT

轉(zhuǎn)義\符號(hào)

此外,推薦對(duì)所有的\進(jìn)行轉(zhuǎn)義,避免出現(xiàn)不可預(yù)期的后果

$class = "dangerous\name"; // \n 被解析成換行符
$obj = new $class;

$class = 'dangerous\name'; // 正確,但是不推薦
$class = 'dangerous\\name'; // 推薦
$class = "dangerous\\name"; // 推薦

以上就是如何理解PHP核心特性命名空間的詳細(xì)內(nèi)容,更多關(guān)于PHP命名空間的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 一個(gè)PHP的QRcode類與大家分享

    一個(gè)PHP的QRcode類與大家分享

    一個(gè)PHP的QRcode類與大家分享,需要的朋友可以參考下。
    2011-11-11
  • php設(shè)計(jì)模式介紹之編程慣用法

    php設(shè)計(jì)模式介紹之編程慣用法

    《PHP設(shè)計(jì)模式介紹》第一章 編程慣用法 學(xué)習(xí)一門新的語(yǔ)言意味著要采用新的慣用法。這章將介紹或者可能重新強(qiáng)調(diào)一些慣用法。你會(huì)發(fā)現(xiàn)這些慣用法在你要在代碼中實(shí)現(xiàn)設(shè)計(jì)模式時(shí)候是非常有用的。
    2008-04-04
  • 淺談PHP之ThinkPHP框架使用詳解

    淺談PHP之ThinkPHP框架使用詳解

    這篇文章主要介紹了淺談PHP之ThinkPHP框架使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • php通過(guò)ksort()函數(shù)給關(guān)聯(lián)數(shù)組按照鍵排序的方法

    php通過(guò)ksort()函數(shù)給關(guān)聯(lián)數(shù)組按照鍵排序的方法

    這篇文章主要介紹了php通過(guò)ksort()函數(shù)給關(guān)聯(lián)數(shù)組按照鍵排序的方法,實(shí)例分析了php中ksort()函數(shù)的使用技巧,需要的朋友可以參考下
    2015-03-03
  • PHP中4種常用的抓取網(wǎng)絡(luò)數(shù)據(jù)方法

    PHP中4種常用的抓取網(wǎng)絡(luò)數(shù)據(jù)方法

    這篇文章主要介紹了PHP中4種常用的抓取網(wǎng)絡(luò)數(shù)據(jù)方法,本文講解使用file_get_contents函數(shù)、fopen函數(shù)、curl庫(kù)三種常見方法抓取網(wǎng)絡(luò)數(shù)據(jù),并給出了代碼實(shí)例,需要的朋友可以參考下
    2015-06-06
  • 有關(guān)phpmailer的詳細(xì)介紹及使用方法

    有關(guān)phpmailer的詳細(xì)介紹及使用方法

    有關(guān)phpmailer的用法,有需要的朋友不妨參考下
    2013-01-01
  • php 基礎(chǔ)函數(shù)

    php 基礎(chǔ)函數(shù)

    本文主要介紹了php的基礎(chǔ)函數(shù)。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-02-02
  • php連接函數(shù)implode與分割explode的深入解析

    php連接函數(shù)implode與分割explode的深入解析

    本篇文章是對(duì)php連接函數(shù)implode與分割explode進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • php socket方式提交的post詳解

    php socket方式提交的post詳解

    php下POST報(bào)文到主機(jī) ,post提交利用代碼
    2008-07-07
  • PHP類中Static方法效率測(cè)試代碼

    PHP類中Static方法效率測(cè)試代碼

    因?yàn)橛泻脦讉€(gè)項(xiàng)目等著做,又不是很急,再加上目前成型的那些框架多多少少用著總是有點(diǎn)不太如意,所以決定先自己寫一個(gè)框架,然后再做項(xiàng)目。既然寫框架,自然要經(jīng)常做一些執(zhí)行效率上的測(cè)試,今天做了一個(gè)static效率的測(cè)試。
    2010-10-10

最新評(píng)論

楚雄市| 合阳县| 莱西市| 芒康县| 门头沟区| 丰台区| 黄龙县| 南江县| 喀喇沁旗| 三河市| 青岛市| 精河县| 崇仁县| 柯坪县| 谷城县| 梨树县| 沅江市| 吴旗县| 温州市| 奉节县| 顺平县| 措美县| 达日县| 枣阳市| 龙门县| 晋中市| 鄂尔多斯市| 绍兴县| 清新县| 乐清市| 江都市| 崇义县| 库伦旗| 兰西县| 德州市| 新安县| 共和县| 易门县| 崇阳县| 南通市| 沙田区|