亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > PHP > 正文

PHP中的命名空間詳細介紹

2024-05-04 23:37:11
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了PHP中的命名空間詳細介紹,本文講解了命名空間(namespace)的概念、正在使用命名空間、定義命名空間、子命名空間、從命名空間中調用代碼等內容,需要的朋友可以參考下
 

概述

PHP對于命名空間的支持,經歷了一段艱難的旅程。幸運的是,PHP從5.3開始引入了命名空間。自從PHP引入了命名空間,PHP代碼的適用結構也得到了大大的改善。許多編程語言早就有了命名空間的概念,相對于其他語言來說,PHP對于命名空間的支持,稍微有點晚了。不管如何,每一種新特性的引入都有其目的,和其他語言一樣,PHP引入命名空間也主要是為了解決名字沖突的問題。

命名空間(namespace)的概念

復制代碼代碼如下:

當在字符串中使用命名空間名字的時候,一定不要忘了轉義/

可以將命名空間想象成一個抽屜,你可以在抽屜里放入鉛筆、尺子、A4紙等,這些都是你自己的私有物品。在你的抽屜下面是別人的抽屜,別人也可以在抽屜里放入相同的物品。為了不拿錯物品,你們決定在自己的抽屜上貼上標簽,這樣就可以清晰的看到某個物品是屬于誰的了。

 

之前,開發者必須在類、函數和常量中添加下劃線,用來使自己的代碼獨立其他于代碼庫。這相當于所有人都給自己的物品貼上標簽之后,一起放入了一個更大的抽屜里。盡管這也是一種組織代碼的方式,但是這種方式是非常低效的。
命名空間的到來就是為了解決這個問題。我們可以在不同的命名空間里聲明相同的函數、類和常量,而不會造成名字上的沖突。本質上,命名空間無非是一種分等級標記PHP代碼的方式。

正在使用命名空間

有一點需要注意的是,我們正在間接的使用命名空間。從PHP 5.3開始,所有在非用戶定義的命名空間中的聲明(類、函數、常量),都默認的屬于全局命名空間。
全局命名空間中包含了所有PHP內部的定義,如echo()、mysqli_connect()和Exception類。由于全局命名空間并沒有獨立的標識名,所以它經常被成為全局空間(global space)。

定義命名空間

命名空間的定義必須是PHP文件的第一條語句。唯一允許在定義命名空間之前使用的語句是declare語句。
定義命名空間很簡單,只需要使用關鍵字namespace即可。命名空間的名字需要遵循PHP文件中其他標識符的命名規則。
下面是定義一個命名空間的示例:

復制代碼代碼如下:

namespace MyNamespace{
 class Test{
  
 }
}

 

如果想定義一個屬于全局空間的代碼塊,也是使用namespace關鍵字,但是后面不加命名空間的名字,如下:

復制代碼代碼如下:

namespace {
 class Test{
  
 }
}

我們甚至可以在一個文件中定義多個命名空間,如下:
復制代碼代碼如下:

<?php
namespace MyNamespace {
}
 
namespace MySecondNamespace {
}
 
namespace {
}

 

我們也可以將一個命名空間分散在不同的文件中,文件包含的處理程序會自動合并他們。因此,限制大量的命名空間在同一個文件中定義是一個很好的編程實踐,就像我們通常單獨為每個類定義一個單獨的文件一樣。

復制代碼代碼如下:

有一點需要注意的是,包含命名空間代碼塊的{是可選的,可以用也可以不用。事實上,只要我們堅持在一個文件中只定義一個命名空間,那么我們就可以完全省略{,這樣也可以使我們的代碼看起來更加簡潔。

 

子命名空間

命名空間可以遵循一個特定的層級,就像我們電腦文件系統中得目錄一樣。子命名空間對于將一個項目結構化尤其特別有用。例如,你的項目需要訪問數據庫,你可能會想將所有數據庫相關的代碼(如數據庫異常處理等)放在同一個子目錄下。

為了保持靈活性,將子命名空間放在子目錄中是非常明智的做法。這會使你的代碼結構更清晰,而且會使遵循PSR-0標準的autoloaders的使用變得更容易。

PHP使用反斜線/作為命名空間的分隔符,有趣的是,PHP甚至考慮過使用笑臉:)作為命名空間的分隔符。

子命名空間定義示例:

復制代碼代碼如下:

<?php 
namespace MyProject/Database
 
class Connection {
  }

可以使用盡可能多的子命名空間:
復制代碼代碼如下:

<?php 
namespace MyProject/Blog/Auth/Handler/Social;
 
class Twitter {
}

 

有一點需要注意的是,PHP并不支持命名空間的嵌套定義,下面的代碼會導致一個致命錯誤:Namespace declarations cannot be nested。

復制代碼代碼如下:

<?php
namespace MyProject {
    namespace Database {
        class Connection { }
    }
}

 

從命名空間中調用代碼

如果你想在不同的命名空間中實例化一個類、調用一個函數或者使用常量,需要使用反斜線/。他們可以從三個角度被解析:

1.未限定的名字
2.限定的名字
3.完全限定的名字

未限定的名字(Unqualified Name)

這是一個類的名稱,函數或常量,但是不包括任何命名的引用。如果命名空間對你來說還比較陌生,那么這就是你熟悉的角度。

復制代碼代碼如下:

<?php
namespace MyProject;
 
class MyClass {
    static function static_method()
    {
        echo 'Hello, world!';
    }
}
 
// Unqualified name, resolves to the namespace you are currently in (MyProject/MyClass)
MyClass:static_method();

 

限定的名字(Qualified Name)

這是我們如何使用子命名空間的方式。示例如下:

復制代碼代碼如下:

<?php
namespace MyProject;
 
require 'myproject/database/connection.php';
 
// Qualified name, instantiating a class from a sub-namespace of MyProject
$connection = new Database/Connection();

 

完全限定的名字(Fully Qualified Name)

前面所說的使用限定的名字和未限定的名字,都是相對于當前所處的命名空間來說的。以上兩種方式僅可以被用來訪問當前所處的命名空間和更深層次的子命名空間。

如果想訪問一個在比前命名空間更高的層級,那么就需要使用完全限定的名字—一個絕對路徑而不是相對路徑。這可以歸結為在命名空間的最前面加反斜杠/。使用完全限定的名字可以讓PHP知道,這次調用是從全局空間開始的,而不是相對于當前所處的命名空間。示例如下:

復制代碼代碼如下:

<?php
namespace MyProject/Database;
 
require 'myproject/fileaccess/input.php';
 
// Trying to access the MyProject/FileAccess/Input class
// This time it will work because we use the fully qualified name, note the leading backslash
$input = new /MyProject/FileAccess/Input();

對于PHP的內部函數來說,我們不必要使用完全限定的名字。在當前所處的命名空間中,調用一個不存在的未限定的名字的類或函數,PHP會搜索全局空間。
記住了這個規則,我們就可以像下面那樣重寫PHP的內部函數:
復制代碼代碼如下:

 

<?php
namespace MyProject;
 
var_dump($query); // Overloaded
/var_dump($query); // Internal
 
// We want to access the global Exception class
// The following will not work because there's no class called Exception in the MyProject/Database namespace and unqualified class names do not have a fallback to global space
// throw new Exception('Query failed!');
 
// Instead, we use a single backslash to indicate we want to resolve from global space
throw new /Exception('ailed!');
 
function var_dump() {
    echo 'Overloaded global var_dump()!<br />';
}

 

動態調用
PHP是一門動態語言,也可以將PHP的這種特性用來調用命名空間。這在本質上與實例化一個變量類和包含一個變量文件是相同的。在字符串中,PHP使用的命名空間分隔符(/)也是一個元字符,因此需要轉義。

復制代碼代碼如下:

<?php
namespace OtherProject;
 
$project_name = 'MyProject';
$package_name = 'Database';
$class_name = 'Connection';
 
// Include a variable file
require strtolower($project_name . '/'. $package_name .  '/' . $class_name) . '.php';
 
// Name of a variable class in a variable namespace. Note how the backslash is escaped to use it properly
$fully_qualified_name = $project_name . '//' . $package_name . '//' . $class_name;
 
$connection = new $fully_qualified_name();

 

namespace關鍵字
關鍵字namespace不僅僅可以用來定義一個命名空間,它也可以用來顯示的表示當前命名空間,它此時的作用相當于類中的self關鍵字。

復制代碼代碼如下:

<?php
namespace MyProject;
 
function run() 
{
    echo 'Running from a namespace!';
}
 
// Resolves to MyProject/run
run();
// Explicitly resolves to MyProject/run
namespace/run();

 

__NAMESPACE__常量
就像self關鍵字不能表示當前類的名字一樣,namespace關鍵字也不能用來表示當前命名空間的名字。__NAMESPACE__關鍵字就是用來解決這個問題的。

復制代碼代碼如下:

<?php
namespace MyProject/Database;
 
// 'MyProject/Database'
echo __NAMESPACE__;

這個關鍵字對于判斷當前代碼是否從命名空間開始時非常有用,而且也可以用來調試代碼。

 

導入或別名
PHP中得命名空間也支持導入,導入也被成為別名。只有類、接口和命名空間可以被導入(別名)。導入是命名空間中一個非常有用和基礎的功能。它使我們可以使用外部的代碼包,而不用擔心名字的沖突。使用use關鍵字可以實現導入功能。也可以使用as關鍵字,在導入的時候指定一個別名。

復制代碼代碼如下:

use [name of class, interface or namespace] as [optional_custom_alias]

 

一個完全限定的名字可以用一個未限定的別名來代替,這樣我們就不用在每次使用的時候都使用完全限定的名字,達到簡化代碼的目的。導入應該在命名空間的最高層或者全局空間中使用,在函數作用域內使用導入功能是非法的語法。

復制代碼代碼如下:

<?php
namespace OtherProject;
 
// This holds the MyProject/Database namespace with a Connection class in it
require 'myproject/database/connection.php';
 
// If we want to access the database connection of MyProject, we need to use its fully qualified name as we're in a different name space
$connection = new /MyProject/Database/Connection();
 
// Import the Connection class (it works exactly the same with interfaces)
use MyProject/Database/Connection;
 
// Now this works too! Before the Connection class was aliased PHP would not have found an OtherProject/Connection class
$connection = new Connection();
 
// Import the MyProject/Database namespace
use MyProject/Database;
 
$connection = new Database/Connection()

我們可以通過使用別名來簡化上面的代碼:
復制代碼代碼如下:

<?php
namespace OtherProject;
 
require 'myproject/database/connection.php';
 
use MyProject/Database/Connection as MyConnection;
 
$connection = new MyConnection();
 
use MyProject/Database as MyDatabase;
 
$connection = new MyDatabase/Connection();

 

總結

命名空間是用來避免定義沖突,并且為代碼引入了更加靈活和組織的方式。有一點需要注意的時,我們并沒有義務去使用命名空間,它是和面向對象結合使用的一種工作方式。但是,如果使用了命名空間,我們的代碼可能會達到一種新的層次,逼格也會顯得更高吧。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩亚洲第一页| 欧美片一区二区三区| 成人字幕网zmw| 国产欧美精品一区二区| 日本人成精品视频在线| 国产中文日韩欧美| 国产成人一区二区三区| 国产欧美久久久久久| 狠狠躁夜夜躁人人爽超碰91| 国产在线拍揄自揄视频不卡99| 日本电影亚洲天堂| 欧美超级免费视 在线| 欧美亚洲第一页| 国产日韩欧美一二三区| 中文国产亚洲喷潮| 亚洲国产欧美一区二区三区久久| 亚洲乱码一区av黑人高潮| 国精产品一区一区三区有限在线| 成人美女免费网站视频| 欧美国产日韩在线| 91美女片黄在线观| 国产91网红主播在线观看| 91精品免费久久久久久久久| 黑人巨大精品欧美一区二区一视频| 国产精品久久久久久久av电影| 91精品国产777在线观看| 欧美第一黄色网| 久久久国产精品亚洲一区| 川上优av一区二区线观看| 亚洲第一精品电影| 国产精品美女主播| 性色av一区二区三区在线观看| 国产精品亚洲欧美导航| 宅男66日本亚洲欧美视频| 日韩在线欧美在线国产在线| 6080yy精品一区二区三区| 欧美xxxx综合视频| 精品福利在线观看| 久久久精品久久| 成人信息集中地欧美| 国产mv免费观看入口亚洲| 黑人巨大精品欧美一区免费视频| 亚洲va久久久噜噜噜久久天堂| 91九色在线视频| 国产在线不卡精品| 国产脚交av在线一区二区| 久久精品国产2020观看福利| 欧美在线视频在线播放完整版免费观看| 黑人巨大精品欧美一区二区免费| 麻豆国产精品va在线观看不卡| 日韩性xxxx爱| 亚洲福利在线播放| 欧美日韩亚洲成人| 少妇久久久久久| 国产区精品在线观看| 欧美成人午夜视频| 深夜福利亚洲导航| 欧美国产第二页| 欧美日韩爱爱视频| 国产精品视频播放| 色噜噜久久综合伊人一本| 亚洲第一av在线| 国产精品日韩一区| 亚洲va码欧洲m码| 国产精品一区二区久久久久| 日韩免费高清在线观看| 亚洲欧美福利视频| 91香蕉国产在线观看| 欧美午夜视频一区二区| 这里精品视频免费| 亚洲免费视频观看| 97色在线播放视频| 中文字幕久热精品视频在线| 国产欧美欧洲在线观看| 国产精品视频精品视频| 97精品久久久中文字幕免费| 久久成人精品一区二区三区| 欧美福利视频在线| 欧美性猛交xxxx乱大交3| 日韩中文字幕视频在线观看| 日韩视频永久免费观看| 亚洲性线免费观看视频成熟| 一区二区在线免费视频| 国产精品成人av在线| 国产亚洲精品va在线观看| 美女av一区二区| 国产精品综合久久久| 欧美日韩国产一区中文午夜| 这里精品视频免费| 久久成人国产精品| 在线观看视频亚洲| 欧美性jizz18性欧美| 亚洲男人天堂2019| 成人黄色免费在线观看| 亚洲精品720p| 成人免费视频97| 日韩视频中文字幕| 九九久久综合网站| 亚洲色图日韩av| 色综合视频网站| 欧美大片在线影院| 亚洲欧美制服综合另类| 狠狠爱在线视频一区| 中文字幕av一区二区三区谷原希美| 亚洲乱码国产乱码精品精| 成人免费在线网址| 国产精品一区二区三区成人| 777国产偷窥盗摄精品视频| 亚洲午夜激情免费视频| 狠狠色狠色综合曰曰| 91精品国产高清自在线看超| 日韩高清免费观看| 亚洲精品自拍第一页| 欧美精品做受xxx性少妇| 91在线视频精品| 欧美性猛交xxxx| 国产日韩欧美91| 久久影院资源网| 欧美激情视频在线观看| 日韩免费电影在线观看| 中文日韩在线观看| 精品在线观看国产| 国产一区二区三区视频在线观看| 国产91免费观看| 久久香蕉国产线看观看av| 久久久午夜视频| 在线观看精品自拍私拍| 伊人久久综合97精品| 久久99精品久久久久久琪琪| 97久久精品在线| 欧美日韩一区二区三区在线免费观看| 永久免费精品影视网站| 国产成人亚洲综合青青| 国产精品美女在线| 成人av番号网| 美日韩精品视频免费看| 欧美又大又粗又长| 人人澡人人澡人人看欧美| 久久精品免费播放| 2020欧美日韩在线视频| 国产精品丝袜白浆摸在线| 国产精品扒开腿做爽爽爽视频| 国产精品嫩草视频| 国产成人高潮免费观看精品| 国产精品九九久久久久久久| 5278欧美一区二区三区| 热re99久久精品国产66热| 久久久久久久影视| 庆余年2免费日韩剧观看大牛| 日韩有码在线视频| 久久99久久99精品免观看粉嫩| 欧美国产精品人人做人人爱| 欧美整片在线观看| 色七七影院综合| 日韩精品在线观看视频| 欧美日韩中国免费专区在线看| 精品国偷自产在线视频99| 欧美俄罗斯乱妇| 亚洲性线免费观看视频成熟| 麻豆乱码国产一区二区三区| 国产亚洲精品综合一区91| 欧美激情免费在线| 96sao精品视频在线观看| 国产成人97精品免费看片|