覺得這可能會對像我一樣的其他新手有幫助...
名稱衝突是指
您建立一個名為 db_connect 的函式,而您在檔案中使用的其他人的程式碼(例如 include)具有相同名稱的相同函式。
為了規避這個問題,您將您的函式重新命名為 SteveWa_db_connect,這會使您的程式碼更長且更難以閱讀。
現在您可以使用命名空間來將您的函式名稱與其他人的函式名稱分開,並且您不必建立額外長名稱的函式來規避名稱衝突問題。
因此,命名空間就像是指向檔案路徑的指標,您可以在其中找到您正在使用的函式的來源
(PHP 5 >= 5.3.0, PHP 7, PHP 8)
什麼是命名空間?在最廣泛的定義中,命名空間是一種封裝項目的方式。這可以在許多地方被視為抽象概念。例如,在任何作業系統中,目錄都用於對相關檔案進行分組,並作為其中檔案的命名空間。舉一個具體的例子,檔案 foo.txt
可以同時存在於目錄 /home/greg
和 /home/other
中,但是兩個 foo.txt
的副本不能存在於同一個目錄中。此外,若要存取 /home/greg
目錄外的 foo.txt
檔案,我們必須使用目錄分隔符將目錄名稱附加到檔案名稱,以取得 /home/greg/foo.txt
。同樣的原則也適用於程式設計領域中的命名空間。
在 PHP 世界中,命名空間旨在解決程式庫和應用程式的作者在建立可重複使用的程式碼元素(例如類別或函式)時遇到的兩個問題
PHP 命名空間提供了一種分組相關類別、介面、函式和常數的方式。以下是 PHP 中命名空間語法的範例
範例 #1 命名空間語法範例
<?php
namespace my\name; // 請參閱「定義命名空間」章節
class MyClass {}
function myfunction() {}
const MYCONST = 1;
$a = new MyClass;
$c = new \my\name\MyClass; // 請參閱「全域空間」章節
$a = strlen('hi'); // 請參閱「使用命名空間:回退到全域
// 函式/常數」章節
$d = namespace\MYCONST; // 請參閱「命名空間運算子和 __NAMESPACE__
// 常數」章節
$d = __NAMESPACE__ . '\MYCONST';
echo constant($d); // 請參閱「命名空間與動態語言功能」章節
?>
注意: 命名空間名稱不區分大小寫。
注意:
命名空間名稱
PHP
,以及以此名稱開頭的複合名稱(例如PHP\Classes
)保留給內部語言使用,不應在使用者空間程式碼中使用。
覺得這可能會對像我一樣的其他新手有幫助...
名稱衝突是指
您建立一個名為 db_connect 的函式,而您在檔案中使用的其他人的程式碼(例如 include)具有相同名稱的相同函式。
為了規避這個問題,您將您的函式重新命名為 SteveWa_db_connect,這會使您的程式碼更長且更難以閱讀。
現在您可以使用命名空間來將您的函式名稱與其他人的函式名稱分開,並且您不必建立額外長名稱的函式來規避名稱衝突問題。
因此,命名空間就像是指向檔案路徑的指標,您可以在其中找到您正在使用的函式的來源
只是提醒一下:命名空間(即使是巢狀或子命名空間)不能只是數字,它必須以字母開頭。
例如,假設您想要使用命名空間來版本化您的套件或版本化您的 API
namespace Mynamespace\1; // 非法
請改用此
namespace Mynamespace\v1; // 確定
對於透過搜尋命名空間來到這裡的人,請知道一個聯盟已經研究過 PHP 的最佳實務,以便讓開發人員擁有共同的程式碼撰寫標準。
這些最佳實務稱為「PHP 標準建議」,也稱為 PSR。
它們可以在此連結中看到:http://www.php-fig.org/psr
實際上,有 5 個程式碼撰寫標準類別
PSR-0:自動載入標準,其目標是使命名空間的使用更容易,以便將命名空間轉換為檔案路徑。
PSR-1:基本程式碼撰寫標準,基本上是標準:)
PSR-2:程式碼樣式指南,其中放置大括號、如何撰寫類別等等。
PSR-3:記錄器介面,如何撰寫標準記錄器
PSR-4:改進的自動載入,將更多命名空間解析為路徑。
我想指出的是 PSR-0 和 PSR-4:它們使用命名空間將 FQCN(完全限定類別名稱 = 完整命名空間 + 類別名稱)解析為檔案路徑。
基本範例,您有這個目錄結構
./src/Pierstoval/Tools/MyTool.php
命名空間 PSR-0 或 PSR-4 標準表示您可以將此路徑轉換為 FQCN。
如果您需要知道它的含義,請閱讀自動載入的原則,因為它幾乎是強制性的 ;) 。
結構
{path}/autoloader.php
{path}/index.php
{path}/src/Pierstoval/Tools/MyTool.php
檔案
<?php
// {path}/index.php
include 'autoloader.php';
$tool = new Pierstoval/Tools/MyTool();
?>
<?php
// {path}/src/Pierstoval/Tools/MyTool.php
namespace Pierstoval\Tools;
class MyTool {}
?>
<?php
// {path}/autoloader.php
function loadClass($className) {
$fileName = '';
$namespace = '';
// 設定 include 路徑為 "src" 目錄
$includePath = dirname(__FILE__).DIRECTORY_SEPARATOR.'src';
if (false !== ($lastNsPos = strripos($className, '\\'))) {
$namespace = substr($className, 0, $lastNsPos);
$className = substr($className, $lastNsPos + 1);
$fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
}
$fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
$fullFileName = $includePath . DIRECTORY_SEPARATOR . $fileName;
if (file_exists($fullFileName)) {
require $fullFileName;
} else {
echo 'Class "'.$className.'" 不存在。';
}
}
spl_autoload_register('loadClass'); // 註冊自動載入器
?>
一個標準化的自動載入器會取得你想要實例化的類別 (MyTool) 並取得 FQCN (完全限定類別名稱),將其轉換為檔案路徑,並檢查檔案是否存在。如果存在,它會 <?php include(); ?> 該檔案,如果你正確地編寫了你的類別,該類別將在其正確的命名空間中可用。
接著,如果你有以下的程式碼
<?php $tool = new Pierstoval/Tools/MyTool(); ?>
自動載入器會將 FQCN 轉換為以下路徑
{path}/src/Pierstoval/Tools/MyTool.php
這可能是 PHP 框架開發中最棒的實務,像是 Symfony 或其他框架。
<?php
// 這是命名空間的簡單用例。看看我們如何在命名空間的幫助下使用相同名稱的類別。這就是命名空間如何解決命名衝突。
namespace Mobile;
class User
{
public $name = '行動使用者';
}
$user = new \Mobile\User;
echo $user->name;
namespace TV ;
class User
{
public static $name = '電視使用者';
}
echo \TV\User::$name;