欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

提出

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

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

定義

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

<?php

namespace Symfony\Component\HttpFoundation;

class Request {

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

<?php

declare(strict_types=1);

namespace App;

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

<?php
namespace MyProject;

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

使用

使用use關鍵字來引入命名空間

<?php

namespace App;

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

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

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

  • namespace之后必須存在一個空行;
  • 所有use聲明必須位于namespace聲明之后;
  • 每條use聲明必須只有一個use關鍵字。

use語句塊之后必須存在一個空行。

當use引入的類出現(xiàn)同名時,可使用as來定義別名

<?php

namespace App;

use Foo\Bar as BaseBar;

class Bar extends BaseBar {

}

限定符

除了使用use外,還可以直接使用\限定符來進行解析,規(guī)則很簡單:如果含有\(zhò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'); // 實例化全局類 Exception

有兩個需要特別注意的地方:

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

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

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

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

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

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

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

<?php
namespace MyProject;

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

關鍵字namespace可用來顯式訪問當前命名空間或子命名空間中的元素。它等價于類中的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)義\符號

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

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

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

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

相關文章

  • php5.6不能擴展redis.so的解決方法

    php5.6不能擴展redis.so的解決方法

    這篇文章主要為大家介紹了php5.6不能擴展redis.so的解決方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • 過濾掉PHP數(shù)組中的重復值的實現(xiàn)代碼

    過濾掉PHP數(shù)組中的重復值的實現(xiàn)代碼

    去除一個數(shù)組中的重復值,可以使用foreach方法,也可以使用array_unique方法,下面的代碼兩種方法都使用了。
    2011-07-07
  • PHP隊列用法實例

    PHP隊列用法實例

    這篇文章主要介紹了PHP隊列用法,以實例形式詳細講述了PHP隊列的實現(xiàn)與各種常用的操作,非常具有參考借鑒價值,需要的朋友可以參考下
    2014-11-11
  • 應用開發(fā)中涉及到的css和php筆記分享

    應用開發(fā)中涉及到的css和php筆記分享

    最近一周使用SAE開發(fā)一個簡單的微博應用。應用本身很簡單,使用php算法可以輕松實現(xiàn)。但是在調(diào)用新浪API的時候遇到很多各種各樣的麻煩。應用到現(xiàn)在還有些不穩(wěn)定。
    2011-08-08
  • PHP使用PhpSpreadsheet操作Excel實例詳解

    PHP使用PhpSpreadsheet操作Excel實例詳解

    這篇文章主要介紹了PHP使用PhpSpreadsheet操作Excel,結合實例形式詳細分析了PHP使用PhpSpreadsheet操作Excel的相關組件下載、函數(shù)功能與操作技巧,需要的朋友可以參考下
    2020-03-03
  • PHP 字符串操作入門教程

    PHP 字符串操作入門教程

    PHP 字符串操作入門教程...
    2006-12-12
  • 用php實現(xiàn)批量查詢清除一句話后門的代碼

    用php實現(xiàn)批量查詢清除一句話后門的代碼

    一句話后門一般簡單,容易隱藏危害大,查找麻煩等。今天發(fā)現(xiàn)了這個Xall.php專門批量查詢干掉一句話后門的代碼,大家可以省去不少麻煩了
    2008-01-01
  • PHP實現(xiàn)顯示照片exif信息的方法

    PHP實現(xiàn)顯示照片exif信息的方法

    這篇文章主要介紹了PHP實現(xiàn)顯示照片exif信息的方法,需要的朋友可以參考下
    2014-07-07
  • php中實現(xiàn)記住密碼自動登錄的代碼

    php中實現(xiàn)記住密碼自動登錄的代碼

    記得登錄QQ的時候,我們可以選記住密碼自動登錄,這個功能確實很方便、實用。其實在我們登錄網(wǎng)站后臺的時候,瀏覽器就會有提示是否記住登錄狀態(tài)。
    2011-03-03
  • PHP 錯誤之引號中使用變量

    PHP 錯誤之引號中使用變量

    當看到錯誤提示 syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING
    2009-05-05

最新評論