簡體   English   中英

PHP等效於命名空間中的枚舉[C / C ++]

[英]PHP equivalent of enum in namespace [C/C++]

我想整齊地組織我的常數。

在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中實現它?

就枚舉而言:PHP中沒有枚舉。 你可以編寫一個數組(實際上是一個HashTable),或者你必須使用一個(單獨的)命名空間和/或為它定義一個類,因為枚舉更接近一個類,我可能會選擇對於后者並繼續寫下:

class FakeEnum
{
    const DERP = 0;
    const SHERP = 1;
    const SHEEP = 2;
}

jycr753已經鏈接了這個問題 ,它並告訴你如何在PHP中模仿枚舉,但如果你問我,這只是把它那一點點太遠 使用ReflectionClass只是為了模擬一個缺失的構造就像修改你的汽車所以它可以兼作摩托車。

在名稱空間上:
PHP中的命名空間相對“新” ,並且它們不是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其他名稱空間(≃ using在C ++中):

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 不會以同樣的方式使用它的核心對象 (如行為時DateTimestdClassExceptionPDO ...)。
mysqli_*擴展名為例:您可以在所有命名空間中使用其過程API,並且是一個快樂的露營者,但如果您更喜歡OO API,則必須使用use語句,或者每當您添加反斜杠時寫new \\mysqli()

好的,所以PHP有它的缺點,當然,我們都知道這么多,至於你的問題,我相信我現在有一個答案,而且對我來說,繼續這種咆哮將是完全沒有意義的。 有關名稱空間的所有信息都可以在手冊BTW中找到

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM