【问题标题】:Namespace constants and use as命名空间常量并用作
【发布时间】:2013-11-13 11:19:35
【问题描述】:

我在使用命名空间中的常量时遇到了一些问题。如果我定义常量并尝试使用它,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/local”,而是收到以下通知和一个空字符串。

注意:使用未定义的常量 DS - 假定为 'DS'

如果我将代码更改如下:

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

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

我得到了预期的结果,但它显然比直接拉入常量要方便得多。

您可以在命名空间中为类/接口/特征起别名,您是否也不能为常量起别名?如果你能做到,那怎么做?

【问题讨论】:

  • 命名空间和常量是不同的。 use 命令映射命名空间,而不是常量。您可以使用定义宏,但我认为这种风格不好:它降低了代码的可读性,因为不清楚“DS”解析为什么,它来自哪里。

标签: php namespaces constants alias


【解决方案1】:

您应该仔细阅读文档。

PHP 命名空间支持三种别名或导入:类名别名、接口名别名和命名空间名别名。请注意,不支持导入函数或常量。

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; 

更新。

PHP 5.6+ 还允许别名或导入函数和常量 名字。

现在您可以导入常量了。

【讨论】:

    【解决方案2】:

    PHP 5.6 添加了对从命名空间导入函数和常量的支持:

    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
    

    【讨论】:

      猜你喜欢
      • 2011-12-08
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 2014-01-24
      • 2014-01-20
      • 2013-06-03
      • 2013-06-12
      • 1970-01-01
      相关资源
      最近更新 更多