我正在寻找一种在定义类时透明地运行代码的方法——更重要的是,当类被扩展时。
例如,如果我有:
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
。
我猜你想要做的是跟踪正在运行的对象?不完全确定您的最终目标是什么。
也许您正在运行时寻找 ReflectionClass?您可以确定一个类是否存在以及扩展类是什么。
听起来您的目标也是一个对象工厂,可以跟踪正在使用的对象。查找这些的单例、工厂和静态成员函数/变量概念。
至于这个:
class A
{
public function __construct()
{ print "A has been called";
}
}
如果 B 类重写了构造函数,它就不会调用 A 的构造函数。前任:
class B extends A
{
public function __construct()
{ print "B has been called";
// parent::__construct(); /// would print out A has been called
}
}
但是在代码中,您可以通过以下多种方式检查 B 是否是 A 的实例:
function doSomethingWithA(A $a)....
function doSmoethingWithA($a)
{
if($a instanceof A)
{
// blah
}
}
不知道这是否有很大帮助。
在 Java 中,这是java.lang.instrument.ClassFileTransformer
可能的,方法是使用将向JVM注册 a 的“java 代理” 。