سؤال

مؤخرا كنت في العادة من إسناد صحيح قيم الثوابت ببساطة باستخدام اسم ثابت كوسيلة لتحديد الغرض منه.ومع ذلك ، في بعض الحالات وقد أدى ذلك إلى الحاجة إلى كتابة دالة مثل typeToString($const) عندما سلسلة التمثيل هو مطلوب.ومن الواضح أن هذا غير كاف unneccesary ، ولكن هي المشكلة فقط مرة واحدة كل حين.

لذلك سؤالي هو هل هناك أي المفاضلات يجب أن تنظر ؟ هذه الحالة تعتبر نظافة/أكثر المعايير المتوافقة?أيضا ، هو الفارق في الأداء negligable معظم الحالات ؟

حالة 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 مجموعة a static.

نصائح أخرى

سأكون صادقا, أنا لا أعرف إذا كان هناك أداء "ضرب" من أي نوع عند تحديد الثوابت أصلا كسلاسل - ولكن إذا كان هناك واحد في كل شيء أنا على استعداد للمراهنة على أن انها صغيرة جدا لدرجة أنه سيكون من الصعب قياس.

شخصيا, إذا المستمر قيمة هو معنى حرفي ، ثم تعيين هذه القيمة.إذا المستمر قيمة ذات مغزى فقط كخيار محدد (أو بعض الأخرى إشارة من قيمة) ، ثم استخدام الأعداد الصحيحة أو أيا كان اخترت المناسب.

أعتقد ثوابت السلسلة هي الخيار الأفضل في هذه الحالة.رمز تبدو أفضل.

بالطبع إذا كنت بحاجة إلى الماضي قليلا من الأداء ، استخدام الثوابت الصحيحة.ولكن فقط بعد التحقق من مع التعريف أن سلسلة المقارنات هي عنق الزجاجة.على أي حال, في معظم التطبيقات هناك العديد من أغلى الأشياء, مثل الوصول إلى قاعدة البيانات.... الخ

بدلا من استخدام const الصحيحه عموما أنا مجرد الذهاب مع السلاسل إذا كنت تحتاج إلى طباعتها.إذا كنت تفعل شيئا مثل $foo = new Foo('guest');.لا يزال يمكنني التحقق من صحة الإدخال في منشئ وأنا يمكن وضع علامة عليه حتى كلما كنت في حاجة إليها.

في المثال تكتب هل يمكن إسقاط كل الطرق لجعل الطبقة ثابت و أنت خلقت نفسك العداد.مثل هذا:

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

واحد طريقة سهلة لاستخدام الثوابت هي أن تكوين التطبيق.فهي أسرع بكثير أداء الحكمة ثم تحليل ملف xml التكوين.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top