如何在类定义上运行代码(而不是对象实例化)

时间:2009-08-14 20:18:26

标签: php class extends

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

例如,如果我有:

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

class B extends A
{
}

我想要打印“A已被定义!\ n”。这不可能吗?

3 个答案:

答案 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