PHP在命名空间中声明常量

时间:2012-11-28 00:03:54

标签: php namespaces const

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

使用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');会更简单,但这只是一个例子。

3 个答案:

答案 0 :(得分:4)

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

Ad 2. subNs可以通过echo __NAMESPACE__;

进行检查

答案 1 :(得分:1)

你无法做你想做的事。

唯一可以在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;

?>

我并不完全明白你的最终目标是什么,但我认为我得到了它的要点,而一个类似的类变成了一个对象应该完成你想要的。

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

希望有所帮助

答案 2 :(得分:0)

您可以使用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,您将能够通过&#34;使用&#34;自动加载常量。关键字,请参见此处:http://php.net/manual/en/migration56.new-features.php