في وقت متأخر ثابت ملزمة في فب ، يتم تقاسم فارس بين الطبقات الطفل
-
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" :)
أرى طريقتين:
- مضيفا
protected static $count=0;
لكل فئات مشتقة جعل
$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;
}