في وقت متأخر ثابت ملزمة في فب ، يتم تقاسم فارس بين الطبقات الطفل

StackOverflow https://stackoverflow.com//questions/12690019

  •  12-12-2019
  •  | 
  •  

سؤال

ربما تم طرح سؤالي عدة مرات ، ولكن...

لدي الكود التالي

abstract class ParentClass
{
    protected static $count=0;
    public static function inc()
    {
        static::$count++;
    }
    public static function getCount()
    {
        return static::$count;
    }
}

class FirstChild extends ParentClass
{

}
class SecondChild extends ParentClass
{

}

وأنا استخدامها تماما مثل هذا

FirstChild::inc();
echo SecondChild::getCount();

يظهر لي "1".وكما ربما كنت أعتقد أنني بحاجة إلى "0" :)

أرى طريقتين:

  1. مضيفا protected static $count=0; لكل فئات مشتقة
  2. جعل $count ليس عدد صحيح ولكن مجموعة.وتفعل نوعا من مثل هذه الأشياء في inc و getCount الأساليب:

    ثابت:: count العد [الحصول على_الطبقة ()]];

و

return static::$count[get_called_class()];

لكنني أعتقد أن هذه الطرق قبيحة بعض الشيء.أولا-يجعلني نسخ / لصق ، ما أود أن تجنب.ثانيا-حسنا ، لا أعرف:) أنا فقط لا أحب ذلك.

هل هناك طريقة أفضل لتحقيق ما أريد?

شكرا مقدما.

هل كانت مفيدة؟

المحلول

لا ، لقد وضعت بالضبط الخيارين الأكثر عملية لمعالجة هذا.بي إتش بي لا يمكن أن تعمل السحر;عندما تعلن static protected الملكية التي تحصل عليها بالضبط: واحد الملكية.إذا كان بناء الجملة كنت تعطي العمل الذي قد يكون خبرا جيدا لكل من يحتاج إلى القيام بذلك ، ولكن سيكون من الأخبار الرهيبة على الاطلاق لأي شخص آخر الذي يتوقع فب أوب أن تتصرف بطريقة عاقلة إلى حد ما.

وللسجل ، إذا كنت لا تحتاج إلى عداد منفصل لجميع الفئات المشتقة دون استثناء ، فأنا أعتبر الصريح protected static $count = 0 في الفصول المشتقة التي تحتاج إلى حل جميل:تريد العداد الخاص بك ، تسأل عن واحد ، وتبقى هذه الحقيقة مكتوبة في التعليمات البرمجية ليراها الجميع.

نصائح أخرى

وأعتقد أن ما كنت تحاول القيام به ، وجود مجرد طريقة واجهة (مثل جيتكونت ()) في فئة مجردة والعداد في فئة ديريفات ، خيارك الأول ، هو الخيار الأقل أسوأ.ليس من المنطقي أن يكون لديك عدد ثابت مجردة في الفئة الأصل إذا كنت لا تحسب جميع الحالات لهذا العدد.

بشكل عام ، أعتقد أن الفكرة كلها قبيحة بعض الشيء ، وبالتالي فإن التطبيقات ستكون قبيحة أيضا :)

يمكنك أن تعلن المحمية ثابت count العد=0;لكل فئة الطفل ، وبهذه الطريقة سوف تكون فريدة من نوعها لكل فئة الطفل ولكن مشتركة لجميع حالات الطبقات.هذا هو الحل الأكثر أناقة لمشكلته.

abstract class ParentClass
{
    public static function inc()
    {
        static::$count++;
    }
    public static function getCount()
    {
        return static::$count;
    }
}

class FirstChild extends ParentClass
{
    protected static $count=0;
}
class SecondChild extends ParentClass
{
    protected static $count=0;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top