Sınıf tanımı üzerinde kod çalıştırmak için nasıl (örnekleme nesne değil)

3 Cevap php

Bir sınıf tanımlanır zaman saydam kod çalıştırmak için bir yol arıyorum - daha da önemlisi, sınıf uzatıldığı zaman.

Örneğin, ben varsa:

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

class B extends A
{
}

"A tanımlanmıştır! \ N" yazdırmak isterim. Bu imkansız mı?

3 Cevap

Yani evet, imkansız olurdu. Hiçbir sınıf tanımı üzerinde çağrılır.

Bu kavram bile tür agresif desteklenmiyor; yazma deneyin

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

ve elde edersiniz Fatal error: Constructor blah::__construct() cannot be static.

Ben çalışan nesneleri takip edilmektedir yapmak için çalışıyoruz ne oldu? Tam olarak emin değil nihai hedefiniz burada budur.

Belki zamanında ReflectionClass arıyoruz? Bir sınıf varsa, belirleyebilirsiniz ve genişletilmiş sınıf ne olduğunu.

Ne için hedef konum kullanılmakta olan nesneleri tutan bir nesne fabrika gibi de geliyor. Singletons, fabrika, ve bu statik üye işlevleri / değişkenleri kavramları Look up.

Bu gelince:

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

B sınıfı yapıcısı geçersiz kılar, eğer A'nın kurucusunu çağırmak için gitmiyor. Ex:

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

B birçok yönden bir birinin örneğidir Ancak eğer kodu, kontrol edebilirsiniz:

function doSomethingWithA(A $a)....

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

Bu kadar olur bilmiyorum.

Java'da, bu JVM ile bir java.lang.instrument.ClassFileTransformer kayıt altına alacak bir "java ajan" kullanılarak, is mümkün.