PHP等效于命名空间中的枚举[C / C ++]

时间:2014-03-11 11:52:12

标签: php c++ enums namespaces constants

我想整齐地组织我的常数。

在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中实现它?

1 个答案:

答案 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_replacestr_replace都正确解析,唯一的区别是后者将首先在当前命名空间中对名为str_replace的函数执行查找,然后再回退到全局命名空间。
好吧,有了一些"善意" ,你可以说这也是相当可预测的行为。遗憾的是,奇怪或恶意的是,当使用其核心对象时,PHP 的行为方式相同(如DateTime,{{ 1}},stdClassException ...) 以PDO扩展名为例:您可以在所有命名空间中使用其过程API并成为一个快乐的露营者,但如果您更喜欢OO API,则必须使用{{1} }语句,或者在写mysqli_*时添加反斜杠。

好的,所以PHP有它的缺点,当然,我们都知道很多,至于你的问题,我相信我现在有一个答案,而且对我来说,继续这种咆哮将是完全没有意义的。您需要了解的有关名称空间的所有内容都可以是found in the manual, BTW