2013-11-02 69 views
2

我在使用來自命名空間的常量時遇到了一些問題。如果我定義常量並嘗試使用它,PHP似乎無法找到它。例如,在我和常量文件我的線沿線的代碼如下:命名空間常量和用作

namespace \my\namespace\for\constants; 

const DS = DIRECTORY_SEPARATOR; 

然後在消耗文件我有:

namespace \some\other\namespace; 

use \my\namespace\for\constants\DS as DS; 

echo (realpath (DS . 'usr' . DS 'local')); 

然而,除了呼應「的/ usr /本地'如預期我得到以下通知和一個空字符串。

注意:未定義的常量DS的使用 - 假設 'DS'

如果我改變代碼如下:

use \my\namespace\for\constants as cns; 

echo (realpath (cns\DS . 'usr' . cns\DS 'local')); 

我得到預期的結果,但它顯然是一個相當不僅僅是能夠直接拉入常量,這不太方便。

你可以在命名空間中別名一個類/接口/特性,你是否也不能爲一個常量別名?如果你能做到,那麼如何?

+0

命名空間和恆定的是不同的東西。 'use'命令映射命名空間,而不是常量。你可以使用一個定義宏,但我會考慮這種不好的風格:它會降低代碼的可讀性,因爲它不清楚'DS'是什麼解決的,它來自哪裏。 – arkascha

回答

4

您應該仔細閱讀文檔。

PHP名稱空間支持三種別名或導入:別名類別,別名接口名稱和別名名稱空間名稱。請注意,不支持導入函數或常量。在PHP 5.6的溶液中加入

http://php.net/manual/en/language.namespaces.importing.php

// trying to import constant -- not supported 
use \my\namespace\for\constants\DS as DS; 
// trying to import namespace -- it's works 
use \my\namespace\for\constants as cns; 
2

支持從名稱空間導入函數和常數:

namespace my\space; 

const CONSTANT_NAME = 123; 

function function_name() { 
    echo "Test\n"; 
} 

// elsewhere: 
use function my\space\function_name; 
function_name(); 

use function my\space\function_name as f;  
f(); 

use const my\space\CONSTANT_NAME; 
echo CONSTANT_NAME . "\n"; 

use const my\space\CONSTANT_NAME as C; 
echo C . "\n"; 

注意,在爲了導入的,常數必須使用const而定義比define

namespace my\space; 

const CONSTANT_NAME = 123; // this can be imported 
define('CONSTANT_NAME', 123); // this sets a global constant 

這是值得注意的,這是不可能導入類的常量:

namespace my\space; 

class Test { 
    const CONSTANT_NAME = 123; 
} 

use const my\space\Test\CONSTANT_NAME; // undefined constant 
use const my\space\Test::CONSTANT_NAME; // syntax error