我想在命名空间内声明常量。我希望它们不会在它之外可见。
使用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');会更简单,但这只是一个例子。
答案 0 :(得分:4)
广告1.是的,你可以。可以通过运行示例脚本来检查; (但您可能必须先使用\paths\constant
或use 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