-3

PHP 5.3 より前は、次の自家製関数を使用して列挙型を作成していました。

function enum()
{
    for($enums = func_get_args(), $enum = reset($enums), $i = 1; $enum; $enum = next($enums), ++$i)
    {
        if(defined($enum)) throw new Exception($enum.' is already defined.');
        else define($enum, $i);
    }

} // enum()

その後 :

enum('CONST0', 'CONST1', 'CONST2', ...);

PHP 5.3 では、define の代わりに const を使用して名前空間の恩恵を受けることができます。const キーワードを使用するようにこの関数を変更する方法はありますか?

また、コードをきれいに見せるために 5.3 のみを使用しています。パフォーマンスへの影響が必要な場合 (つまり、eval などを使用する場合)、古き良き定義に固執します。

私はすでにこの質問を見てきました:PHPと列挙ですが、探しているものが見つかりませんでした。

4

2 に答える 2

1

私はあなたの質問に答えようとします: const キーワードを使用するようにこの関数を変更する方法はありますか?

短い答え:いいえ

長い答え: はい、できますが、非常に厄介な方法でのみ:

<?php
function enum() {
    for($enums = func_get_args(), $enum = reset($enums), $i = 1; $enum; $enum = next($enums), ++$i) {
        eval('const ' . $enum . ' = ' . $i . ';');
    }
}

enum('CONST0', 'CONST1', 'CONST2');

http://3v4l.org/ontRNでテスト済み

于 2012-11-28T12:16:13.707 に答える
1

constキーワードを条件付きで使用することはできません[この非常に高い投票数の回答を参照してください]。

定数に名前空間を付けたい場合、必要に応じて魔法を利用して、それらをクラスの静的フィールドにするのが最善の方法__getです__set

編集:もちろん、静的コンテキストでは魔法のセッター/ゲッターはありません。とにかく柔軟なソリューションを用意できます。

于 2012-11-28T12:05:32.957 に答える