我正在寻找一种在定义类时透明地运行代码的方法 - 更重要的是,当类被扩展时。
例如,如果我有:
class A
{ function define()
{ echo "A has been defined!\n";
}
__magicDefine
{ define();
}
}
class B extends A
{
}
我想要打印“A已被定义!\ n”。这不可能吗?
答案 0 :(得分:2)
那是不可能的,是的。在类定义上没有任何东西被调用。
这个概念甚至有点不受支持;试着写
class foo {
static function __construct() {
echo "hi!";
}
}
你会得到Fatal error: Constructor blah::__construct() cannot be static
。
答案 1 :(得分:2)
我猜你要做的是跟踪正在运行的对象?不完全确定你的最终目标是什么。
也许您在运行时正在寻找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是否是多种方式之一的实例:
function doSomethingWithA(A $a)....
function doSmoethingWithA($a)
{
if($a instanceof A)
{
// blah
}
}
不知道这有多大帮助。
答案 2 :(得分:0)
在Java中,这个是可能,通过使用“java代理”,它将在JVM中注册java.lang.instrument.ClassFileTransformer
。