質問

最近、整数値を定数に割り当て、その目的を特定する手段として定数名を単に使用する習慣がありました。ただし、場合によっては、文字列表現が必要なときにtypeToString($ const)などの関数を記述する必要があります。これは明らかに非効率的で不必要ですが、たまにしか問題になりません。

だから私の質問は、考慮すべき他のトレードオフはありますか?どのケースがよりクリーン/より標準に準拠していると考えられますか?また、ほとんどの場合、パフォーマンスの違いは無視できますか?

ケース1:(文字列バージョンが不要な場合は高速ですか?)

class Foo {
    const USER_TYPE_ADMIN = 0;
    const USER_TYPE_USER = 1;
    const USER_TYPE_GUEST = 2;

    public $userType = self::USER_TYPE_ADMIN;

    public function __construct($type) {
        $this->userType = $type;
    }

    public function typeToString() {
        switch($this->userType) {
            case self::USER_TYPE_ADMIN:
                return 'admin';
                break;

            case self::USER_TYPE_USER:
                return 'user';
                break;

            case self::USER_TYPE_GUEST:
                return 'guest';
                break;

            default:
                return 'unknown';
                break;
        }
    }
}

$foo = new Foo(Foo::USER_TYPE_GUEST);
echo $foo->typeToString();
// Displays "guest"

ケース2:(文字列バージョンが必要な場合の高速化/簡易化)

class Foo {
    const USER_TYPE_ADMIN = 'admin';
    const USER_TYPE_USER = 'user';
    const USER_TYPE_GUEST = 'guest';

    public $userType = self::USER_TYPE_ADMIN;

    public function __construct($type) {
        $this->userType = $type;
    }
}

$foo = new Foo(Foo::USER_TYPE_GUEST);
echo $foo->userType();
// Displays "guest"
役に立ちましたか?

解決

パフォーマンスの違いは、大量に保存しない限り無視できます。 toString()メソッドをより簡潔に記述します。

$strings = array
(
    self::USER_TYPE_ADMIN => 'admin',
    self::USER_TYPE_USER => 'user',
);

if (!isset($strings[$type]))
    return 'unknown';

return $strings[$type];

また、 $ strings 配列を static にすることもできます。

他のヒント

正直言って、パフォーマンスが「ヒット」するかどうかはわかりません。定数を文字列としてネイティブに定義する場合はどのようなものでも-しかし、もしそれがあれば、それは非常に小さいので、測定するのは難しいでしょう。

個人的に、定数の値がリテラルとして意味がある場合は、その値を割り当てます。定数の値がオプションセレクター(または値の他の表示)としてのみ意味がある場合は、整数または適切なものを使用してください。

この場合、文字列定数が最良の選択だと思います。コードの見栄えが良い。

もちろん、最後のパフォーマンスが必要な場合は、整数定数を使用してください。ただし、プロファイラーで文字列比較がボトルネックであることを確認した後にのみ。とにかく、ほとんどのアプリケーションでは、データベースアクセスなど、もっと高価なものがあります。

const整数を使用する代わりに、通常、印刷する必要がある場合は文字列を使用します。そこで、 $ foo = new Foo( 'guest'); のようなことをします。コンストラクターで入力を検証し、必要なときにいつでもマークアップできます。

記述した例では、すべてのメソッドをドロップしてクラスを静的にすることができ、自分自身を列挙子として作成できます。このように:

class Enumeration{
  public static const One=1;
  public static const Two=2;
  public static const Three=3;
}

定数を使用するもう1つの便利な方法は、アプリケーション構成として使用することです。これらは、設定のためにxmlファイルを解析するよりもはるかに高速なパフォーマンスです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top