-1

我正在寻找一种在定义类时透明地运行代码的方法——更重要的是,当类被扩展时。

例如,如果我有:

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

class B extends A
{
}

我希望打印“A 已定义!\n”。这是不可能的吗?

4

3 回答 3

2

那是不可能的,是的。类定义没有调用任何内容。

这个概念甚至有点不受支持。尝试写作

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

你会得到Fatal error: Constructor blah::__construct() cannot be static

于 2009-08-14T20:22:41.790 回答
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 是否是 A 的实例:

function doSomethingWithA(A $a)....

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

不知道这是否有很大帮助。

于 2009-08-14T20:30:17.467 回答
0

在 Java 中,这java.lang.instrument.ClassFileTransformer可能的,方法是使用将向JVM注册 a 的“java 代理” 。

于 2009-08-15T19:35:16.120 回答