我想整齐地组织我的常数。
在C ++中,我会将枚举或变量放在命名空间(或更多)中,如下所示:
namespace foo
{
namespace bar
{
enum herp { derp, sherp, sheep };
}
namespace Family
{
const string mom = "Anita";
const string son = "Bob";
const string daughter = "Alice";
}
}
这样我就可以像
那样访问它们了int x = foo::bar::derp;
string nameOfMom = foo::Family::mom;
string nameOfSon = foo::Family::son;
我如何在PHP中实现它?
答案 0 :(得分:2)
就枚举而言:PHP中没有枚举。您可以编写一个数组(实际上是下面的HashTable),或者您必须使用(单独的)命名空间和/或为此定义一个类,因为枚举更接近于类,我&#39 ; d可能选择后者并继续写下:
class FakeEnum
{
const DERP = 0;
const SHERP = 1;
const SHEEP = 2;
}
jycr753已经链接了this question,它确实显示了 如何模仿PHP中的枚举,但是如果你问我,那就是 >太远。使用ReflectionClass
来模拟缺失的构造就像修改你的汽车一样,它可以像摩托车一样。
到命名空间:
PHP中的命名空间相对" new" ,并且它们不是100%等同于C ++命名空间。首先,它们不能以您尝试的方式嵌套。为此,您不得不求助于在给定命名空间内声明类,并接受只允许1个额外级别。
所有事情都有所帮助,我认为你正在寻找这样的事情:
namespace Foo
{
const FOOBAR = 123;
}
namespace Bar
{
const FOOBAR = 456;
}
namespace Work
{
const FOOBAR = __NAMESPACE__;
include 'global_const.php';
echo 'Global FOOBAR const is: ', \FOOBAR, PHP_EOL,
'Foo::FOOBAR is: ', \Foo\FOOBAR, PHP_EOL,
'Bar::FOOBAR is: ', \Bar\FOOBAR, PHP_EOL,
'Work::FOOBAR is: ', FOOBAR, PHP_EOL;
}
global_const.php 文件定义全局常量,如下所示:
define('FOOBAR', 'global');//just to be consistent ;-P
结果输出为:
Global FOOBAR const is: global Foo::FOOBAR is: 123 Bar::FOOBAR is: 456 Work::FOOBAR is: Work
当然,实际上,您的代码将分布在多个文件中,而且通常情况下,您只会对该文件使用单个命名空间,并且use
其他命名空间(≃) C ++中的using
:
namespace My\Core\Components\Output;
use Foo,
Bar,
My\Core\Components\Input as CoreInput;
use External\Component\Input as HelperInput;
PHP命名空间系统中的不一致性已有详细记录(谷歌搜索它们)。但举一个例子,如果我用上面的语句启动我的文件,请使用以下语句:
$myVar = Foo\SOME_CONSTANT;
解析为
global namespace (\ for short)
->Foo namespace
-> SOME_CONSTANT
但是,如果我要删除use Foo
,则同一语句将解析为:
\
-> My
-> Core
-> Components
-> Output
-> Foo
-> SOME_CONSTANT
现在看起来非常合理,但同样的规则不适用于核心功能:\str_replace
或str_replace
都正确解析,唯一的区别是后者将首先在当前命名空间中对名为str_replace
的函数执行查找,然后再回退到全局命名空间。
好吧,有了一些"善意" ,你可以说这也是相当可预测的行为。遗憾的是,奇怪或恶意的是,当使用其核心对象时,PHP 不 的行为方式相同(如DateTime
,{{ 1}},stdClass
或Exception
...)
以PDO
扩展名为例:您可以在所有命名空间中使用其过程API并成为一个快乐的露营者,但如果您更喜欢OO API,则必须使用{{1} }语句,或者在写mysqli_*
时添加反斜杠。
好的,所以PHP有它的缺点,当然,我们都知道很多,至于你的问题,我相信我现在有一个答案,而且对我来说,继续这种咆哮将是完全没有意义的。您需要了解的有关名称空间的所有内容都可以是found in the manual, BTW