كيفية تشغيل رمز عند تعريف الفصل (وليس إنشاء مثيل)

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

  •  16-09-2019
  •  | 
  •  

سؤال

أبحث عن وسيلة لتشغيل الشفرة بشفافية عند تعريف الفصل - الأهم من ذلك، عندما يتم تمديد الفصل.

على سبيل المثال، إذا كان لدي:

class A
{  function define()
   {  echo "A has been defined!\n";
   }
   __magicDefine
   {  define();
   }
}

class B extends A
{
}

أود ذلك طباعة "تم تعريف A! n". هل هذا مستحيل؟

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

المحلول

سيكون ذلك مستحيلا، نعم. لا شيء يسمى تعريف الطبقة.

هذا المفهوم هو نوع غير مدعوم بقوة؛ حاول الكتابة

class foo {
    static function __construct() {
        echo "hi!";
    }
}

وسوف تحصل على Fatal error: Constructor blah::__construct() cannot be static.

نصائح أخرى

أعتقد أن ما تحاول القيام به هو تتبع الكائنات التي تعمل؟ ليس بالتأكيد ما هو هدفك النهائي هنا.

ربما كنت تبحث عن implectionclass في وقت التشغيل؟ يمكنك تحديد ما إذا كان فئة موجودة وما هي الفئة الممتدة.

يبدو أيضا مثل ما تهدف إليه هو مصنع كائن يحافظ على تتبع الكائنات التي يتم استخدامها. ابحث عن singletons، المصنع، ووظائف الأعضاء الثابتة / مفاهيم المتغيرات لأولئك.

أما بالنسبة لهذا:

class A 
{ 
 public function __construct()
 { print "A has been called";
 } 
}

إذا تجاوز الفئة B المنشئ، فلن يستدعي منشئه. السابق:

class B extends A
{
 public function __construct()
 { print "B has been called";
   // parent::__construct(); /// would print out A has been called
 }
}

ومع ذلك في التعليمات البرمجية، يمكنك التحقق مما إذا كانت B مثيل واحد من طرق كثيرة:

function doSomethingWithA(A $a)....

function doSmoethingWithA($a)
{
 if($a instanceof A)
 {
  // blah
 }
}

لا أعرف إذا كان ذلك يساعد كثيرا.

في جاوة، هذا يكون ممكن، باستخدام "وكيل Java" الذي من شأنه تسجيل java.lang.instrument.ClassFileTransformer مع JVM.

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