在命名空间中声明常量的 PHP 方法

4

我希望在命名空间内声明常量,当然它们不应该在外部可见。

使用 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里面?

备注:我知道使用require_once('Models/user.php')会更简单,但这只是一个例子。

3个回答

4

广告1:是的,您可以。可以通过运行您的示例脚本进行检查;(但您可能首先需要使用\paths\constantuse paths;

广告2:可以通过echo __NAMESPACE__;进行检查。


请注意,如果您将命名空间移动到目录树中的单独文件中,则可能需要手动包含它,自动加载不会触发命名空间常量/函数。 - dev-null-dweller
你的意思是我必须先引用声明命名空间内容的文件,才能使用 name\myConstant 吗? - Virus721

1

你不能做你想做的事情。

如果您不想这样定义,那么您唯一可以在 require 函数中使用常量“models”的方法是将其定义为您所述的方式。

为什么不编写一个类来完成这个任务呢?

<?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;

?>

我不完全理解你的最终目标是什么,但我认为我大致明白了,并且一个类转换成对象应该可以实现你想要的功能。
你可以在必要的时候将该类简单地包含在你的框架中。
希望这有所帮助。

我有包含类的文件夹,分别命名为:Models、Views 和 Classes。在使用 PHP 5.3 之前,我只是使用 define() 定义常量,并拥有 MODELS_DIR、VIEWS_DIR、CLASSES_DIR 等等... 我想使用命名空间和常量来使代码更加简洁,并在某些情况下最终缩短编写时间。 - Virus721
没错,dev-null-dweller 给出了正确的答案。一开始我没有理解你的问题。但是我的帖子可能会帮助其他人,所以我会把它留在那里。 - Kevin Florida

1
你可以使用 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接