【问题标题】:PHP Declaring constant in namespacePHP在命名空间中声明常量
【发布时间】:2012-11-15 17:42:56
【问题描述】:

我想在命名空间内声明常量。我当然希望它们在它之外不可见。

使用define() 不起作用,因为它使常量全局化,而不管它在哪个命名空间中执行(如果我理解得很好的话)。

我可以这样做:

namespace paths;

const models  = 'Models/';
const views   = 'Views/';
const classes = 'Classes/';

还有其他地方:

require_once(paths\models.'user.php'); // works
require_once(models.'user.php');       // fails

如果我这样做:

namespace ns;
namespace subNs;

我是在 ns\subNs 中还是在 subNs 中?

PS:我知道做 require_once('Models/user.php');会更简单,但这只是一个例子。

【问题讨论】:

    标签: php namespaces constants


    【解决方案1】:

    广告 1。是的,你可以。可以通过运行示例脚本来检查; (但您可能必须先使用\paths\constantuse paths;

    Ad 2. subNs 可以通过echo __NAMESPACE__;查看

    【讨论】:

    • 请注意,如果您将命名空间跨目录树移动到单独的文件中,您可能必须手动将其包含在内,命名空间常量/函数/不会触发自动加载
    • 你的意思是我必须先要求我声明命名空间内容的文件才能使用name\myConstant
    【解决方案2】:

    你不能做你想做的。

    如果您声明不想这样做,那么您可以在 require 函数中使用常量“模型”的唯一方法。

    你为什么不写一个类来做这个?

    <?php
    class PATHS {
    
        public $models = null;
        public $views = null;
        public $classes = null;
    
        public function __construct($namespace) {
    
             switch ($namespace) {
                case 'path1' :
                    $this->models = 'my_custom_path/models';
                    $this->$views = 'my_custom_path/views';
                    $this->classes = 'my_custom_path/classes';
                 break;
                 case 'path2' :
                    $this->models = 'my_custom_path/models';
                    $this->$views = 'my_custom_path/views';
                    $this->classes = 'my_custom_path/classes';
                 break;
                 default :
                    $this->models = 'my_custom_path/models';
                    $this->$views = 'my_custom_path/views';
                    $this->classes = 'my_custom_path/classes';
                 break;
             }
    
        }
    
    }
    
    $paths =new PATHS('my_namespace');
    
    echo $paths->models;
    echo $paths->views;
    echo $paths->classes;
    
    ?>
    

    我不完全理解你的最终目标是什么,但我想我明白了它的要点,一个类似的类变成一个对象应该可以完成你想要的。

    您可以在必要时将该类简单地包含在您的框架中。

    希望有帮助

    【讨论】:

    • 我有包含类和命名的文件夹:模型、视图和类。在使用 PHP 5.3 之前,我只是简单地使用 define() 定义了常量,并拥有诸如 MODELS_DIR、VIEWS_DIR、CLASSES_DIR 等之类的东西……我想使用命名空间和常量来使代码更简洁,并且在某些情况下更短。
    • 是的,dev-null-dweller 有正确的答案。一开始我没看懂你的问题。但我的帖子可能对其他人有所帮助,所以我将其留在那里。
    • 感谢您的帮助
    【解决方案3】:

    您可以使用 define 来声明命名空间常量,如下所示:

    <?php namespace paths;
    // Preferred way in a file that does not declare the namespace:
    define('paths\\models', 'Models/');
    define('paths\\views', 'Views/');
    define('paths\\classes', 'Classes/');
    
    // Preferred way in file with the namespace declared:
    const models  = 'Models/';
    const views   = 'Views/';
    const classes = 'Classes/';
    ?>
    

    在 PHP 5.6 中,您将能够通过“use”关键字自动加载常量,请参见此处:http://php.net/manual/en/migration56.new-features.php

    【讨论】:

      猜你喜欢
      • 2012-10-29
      • 2012-07-19
      • 1970-01-01
      • 1970-01-01
      • 2013-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多