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

首頁 > 網站 > 建站經驗 > 正文

PHP中的命名空間詳細介紹

2024-04-25 20:38:07
字體:
來源:轉載
供稿:網友

概述

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 MyProjectDatabase

class Connection {

}

可以使用盡可能多的子命名空間:

代碼如下:

<?php

namespace MyProjectBlogAuthHandlerSocial;

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

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

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

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

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

代碼如下:

<?php

namespace MyProjectDatabase;

require 'myproject/fileaccess/input.php';

// Trying to access the MyProjectFileAccessInput class

// This time it will work because we use the fully qualified name, note the leading backslash

$input = new MyProjectFileAccessInput();

對于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 MyProjectDatabase 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 MyProjectrun

run();

// Explicitly resolves to MyProjectrun

namespacerun();

__NAMESPACE__常量

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

代碼如下:

<?php

namespace MyProjectDatabase;

 

// 'MyProjectDatabase'

echo __NAMESPACE__;

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

導入或別名

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

代碼如下:

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

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

代碼如下:

<?php

namespace OtherProject;

// This holds the MyProjectDatabase 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 MyProjectDatabaseConnection();

// Import the Connection class (it works exactly the same with interfaces)

use MyProjectDatabaseConnection;

// Now this works too! Before the Connection class was aliased PHP would not have found an OtherProjectConnection class

$connection = new Connection();

// Import the MyProjectDatabase namespace

use MyProjectDatabase;

$connection = new DatabaseConnection()

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

代碼如下:

<?php

namespace OtherProject;

require 'myproject/database/connection.php';

use MyProjectDatabaseConnection as MyConnection;

$connection = new MyConnection();

use MyProjectDatabase as MyDatabase;

$connection = new MyDatabaseConnection();

總結

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕av一区| 久久久精品2019中文字幕神马| 久久综合免费视频影院| 久久久久久亚洲精品不卡| 亚洲欧美中文日韩在线| 精品久久久久久久久久ntr影视| 亚洲少妇中文在线| 中文字幕日韩高清| 色悠久久久久综合先锋影音下载| 亚洲精品理论电影| 欧美午夜丰满在线18影院| 亚洲成人av片在线观看| 日本免费久久高清视频| 亚洲国产精品热久久| 欧美黄网免费在线观看| 日本一区二区在线免费播放| 成人性生交大片免费看视频直播| 国产在线视频欧美| 久久久久久久网站| 欧美激情极品视频| 欧美老女人性视频| 欧美色播在线播放| 国产在线视频91| 精品久久久999| 欧美电影免费观看高清| 亚洲第一视频网站| 国产一区二区三区在线播放免费观看| 亚洲a在线观看| 日韩大陆欧美高清视频区| 日本道色综合久久影院| 日韩欧美中文字幕在线播放| 日韩小视频在线| 欧美日韩国产中文字幕| 国产国产精品人在线视| 日韩av在线直播| 亚洲免费视频一区二区| 黑丝美女久久久| 性日韩欧美在线视频| 精品成人国产在线观看男人呻吟| 欧美做爰性生交视频| 国产精品免费一区二区三区都可以| 亚洲欧洲在线看| 中文字幕在线看视频国产欧美在线看完整| 欧美性猛交xxxx乱大交极品| 久久九九精品99国产精品| 欧美国产激情18| 国产一区二区三区直播精品电影| 日韩av成人在线| 亚洲欧美精品中文字幕在线| 日本精品中文字幕| 91美女片黄在线观| 日韩高清欧美高清| 欧洲日本亚洲国产区| 成人a在线观看| 亚洲精品wwww| 久久精品免费播放| 欧美交受高潮1| 欧美激情一区二区三区在线视频观看| 欧美电影电视剧在线观看| 亚洲欧美综合精品久久成人| 亚洲国产精品人人爽夜夜爽| 久久精品2019中文字幕| 韩国美女主播一区| 欧美在线观看日本一区| 亚洲国产精品久久精品怡红院| 国产精品成av人在线视午夜片| 日韩电影中文字幕av| 国产精品中文在线| 91亚洲一区精品| 国产一区二区三区毛片| 136fldh精品导航福利| 韩国一区二区电影| 国产美女主播一区| 一区二区国产精品视频| 97超碰蝌蚪网人人做人人爽| 亚洲电影免费观看高清完整版在线| 亚洲无亚洲人成网站77777| 久久精品国产电影| 国产一区欧美二区三区| 欧美激情伊人电影| 欧美性在线视频| 欧美日韩免费观看中文| 欧美日韩在线一区| 91精品久久久久久久久青青| 欧美又大又粗又长| 成人国产精品色哟哟| 国产精品99久久久久久人| 国产99视频在线观看| 日韩国产精品亚洲а∨天堂免| 亚洲影院污污.| 国产精品一区二区在线| 欧美日韩国产第一页| 亚洲影院色无极综合| 欧美夫妻性生活视频| 亚洲精品久久视频| 中文字幕av一区二区| 国产福利精品av综合导导航| 成人欧美一区二区三区在线| 国产精品国产亚洲伊人久久| 不卡av在线网站| 亚洲欧美成人在线| 欧美亚洲视频在线看网址| 国产在线拍揄自揄视频不卡99| 国产日韩换脸av一区在线观看| 亚洲精品在线不卡| 91在线免费观看网站| 欧美激情视频一区二区| 欧美一区亚洲一区| 精品国产区一区二区三区在线观看| 国产69精品久久久久99| 日韩视频在线观看免费| 性欧美亚洲xxxx乳在线观看| 国产日韩欧美日韩| 亚洲欧美资源在线| 久久综合伊人77777| 北条麻妃一区二区在线观看| 97超碰国产精品女人人人爽| 91国内免费在线视频| 午夜精品久久久久久久99黑人| 国产小视频国产精品| 日本免费久久高清视频| 美女精品久久久| 日韩中文综合网| 97视频在线观看免费高清完整版在线观看| 欧美一区二区影院| 综合136福利视频在线| 91九色在线视频| 亚洲偷欧美偷国内偷| 伊人伊成久久人综合网小说| 亚洲精品福利免费在线观看| 91日本在线观看| 欧美激情一二区| www.美女亚洲精品| 久久成年人视频| 欧美日韩国产丝袜另类| 7m第一福利500精品视频| 91精品国产91久久久久久不卡| 欧美日韩在线视频一区二区| 九九九久久国产免费| 97精品视频在线观看| 亚洲精品国产精品国自产在线| 欧美日韩中文字幕在线视频| 亚洲国产又黄又爽女人高潮的| 成人观看高清在线观看免费| 欧美成人中文字幕| www.欧美精品| 亚洲丝袜一区在线| 日韩av最新在线观看| 欧美激情喷水视频| 亚洲天堂一区二区三区| 欧美区二区三区| 日韩欧美视频一区二区三区| 国产在线拍揄自揄视频不卡99| 欧美日韩精品二区| 欧美成人国产va精品日本一级| 色综合伊人色综合网| 欧美日韩精品中文字幕| 日韩电影免费在线观看| 精品亚洲男同gayvideo网站| 最近2019中文免费高清视频观看www99| 国产精品无av码在线观看| 久久久久久久97| 91在线观看免费观看| 亚洲国产精品va在线看黑人动漫|