سؤال

هل هناك أي طريقة للحصول على اسم الفصل المشتق من الكلمة الرئيسية الثابتة؟ ما أريد فعله بالفعل هو.

اجعل انعكاسًا للفئة المشتقة
تحقق من أنه ينفذ الفئة المحددة أم لا

لدي طريقة ثابتة يقول الفئة الأساسية المسماة Base::check()أريد Base::check() سوف تحقق من وجود تنفيذ الواجهة. تعرف طريقة Check () اسم الواجهة. لذا لست بحاجة إلى إخبارها من العالم الخارجي.

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

بديل آخر يمكنني فعله هو. يمكنني عمل ::instance() الطريقة الثابتة التي تُرجع this ويمكنني أن أفعل get_class من عودته. ولكن هذا أيضا مرفوع مبدأ التطبيق الخاص بي.

فهل الطريقة الأولى ممكنة حقًا؟ أو أحتاج للذهاب لبعض البديل من هذا النوع؟ أو هل لديك أي نوع آخر من البدائل؟

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

المحلول

لست متأكدًا مما إذا كنت أفهم ما تحاول القيام به ، خاصة ما تعنيه "احصل على اسم الفصل المشتق من الكلمة الرئيسية الثابتة". تحقق من الوظائف التالية لمعرفة ما إذا كانوا يفعلون ما تريد القيام به:

  • class_implements - إرجاع الواجهات التي يتم تنفيذها بواسطة الفئة المعطاة
  • class_parents - إرجاع فئات الأم للطبقة المعطاة
  • is_a - يتحقق مما إذا كان الكائن من هذه الفئة أو لديه هذا الفئة كواحد من والديه
  • is_subclass_of - يتحقق مما إذا كان الكائن لديه هذا الفئة كواحد من والديه
  • instanceof نوع المشغل

إذا كنت تشير إلى الربط الثابت المتأخر, ، القي نظرة على


أفترض أنك تحاول أن تفعل شيئًا كهذا:

class Base
{
    public static function check()
    {
        return in_array('IFoo', class_implements(get_called_class(), FALSE));
        // or
        $instanceClassName = get_called_class();
        return new $instanceClassName instanceof IFoo;
        // or
        $reflector = new ReflectionClass(get_called_class());
        return $reflector->implementsInterface('IFoo');           
    }
}
interface IFoo {};
class Foo extends Base implements IFoo {}

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