8

最近、整数値を定数に代入し、その目的を識別する手段として単に定数名を使用する習慣があります。ただし、場合によっては、文字列表現が必要な場合に 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"
4

5 に答える 5

8

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

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

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

return $strings[$type];

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

于 2008-10-29T18:49:55.270 に答える
4

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

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

于 2008-10-29T18:48:07.130 に答える
1

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

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

于 2008-10-29T18:48:38.500 に答える
0

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

于 2008-10-29T18:45:19.023 に答える
-3

あなたが書いた例では、すべてのメソッドを削除してクラスを静的にすることができ、自分自身を列挙子として作成したでしょう。このような:

クラス列挙{
  public static const One=1;
  public static const Two=2;
  public static const Three=3;
}

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

于 2008-10-29T23:08:02.957 に答える