Come eseguire il codice di una definizione di classe (non istanze di oggetti)
Domanda
Sto cercando un modo per eseguire in modo trasparente il codice quando una classe è definita - cosa ancora più importante, quando la classe è estesa.
Per esempio, se ho:
class A
{ function define()
{ echo "A has been defined!\n";
}
__magicDefine
{ define();
}
}
class B extends A
{
}
mi piacerebbe che per la stampa "A è stato definito! \ N". È questo possibile?
Soluzione
Questo sarebbe impossibile, sì. Nulla viene chiamato definizione della classe.
Questo concetto è anche una sorta di aggressivo supportato; provare a scrivere
class foo {
static function __construct() {
echo "hi!";
}
}
e si otterrà Fatal error: Constructor blah::__construct() cannot be static
.
Altri suggerimenti
Credo che quello che stai cercando di fare è tenere traccia degli oggetti che sono in esecuzione? Non esattamente sicuro di cosa il vostro obiettivo finale è qui.
Forse stai cercando il ReflectionClass in fase di esecuzione? È possibile determinare se una classe esiste e ciò che la classe estesa è.
E 'suona anche come quello che si sta puntando è una fabbrica di oggetto che tiene traccia degli oggetti che vengono utilizzati. Look up single, in fabbrica, e le funzioni membro statiche / variabili concetti per quelli.
Per quanto riguarda questo:
class A
{
public function __construct()
{ print "A has been called";
}
}
Se la classe B sovrascrive il costruttore, non sta andando a chiamare il costruttore di A. Es:
class B extends A
{
public function __construct()
{ print "B has been called";
// parent::__construct(); /// would print out A has been called
}
}
Tuttavia, in codice, è possibile verificare se B è un'istanza di A uno dei tanti modi:
function doSomethingWithA(A $a)....
function doSmoethingWithA($a)
{
if($a instanceof A)
{
// blah
}
}
Non so se questo aiuta molto.
In Java, questo è è possibile, utilizzando un "agente Java", che registra un java.lang.instrument.ClassFileTransformer
con la JVM.