2009-01-08 133 views
1

我使用Kohana的,只是发现了这片代码嵌入自动加载方法动态创建子类

 // Class extension to be evaluated 
     $extension = 'class '.$class.' extends '.$class.'_Core { }'; 

     // Start class analysis 
     $core = new ReflectionClass($class.'_Core'); 

     if ($core->isAbstract()) 
     { 
      // Make the extension abstract 
      $extension = 'abstract '.$extension; 
     } 

     // Transparent class extensions are handled using eval. This is 
     // a disgusting hack, but it gets the job done. 
     eval($extension); 

基本上它的作用是,当我指的是不存在的类(通过实例化对象,调用class_exists()等),Kohana将创建一个类(例如.Foo),它扩展了遵循特定命名约定(例如Foo_Core)的库类。只是很好奇,有没有办法做类似的事情,但没有使用eval?

回答

1

我认为你坚持与eval()为此。

它标记为“讨厌的黑客”,以便使它OK :)

我很想知道你有这样的空类做什么...

0

如果你想能够缓存你的动态创建的类,你可以写出一个文件并取而代之。这可以被认为是同样的黑客,但它是一种选择。对于一次创建并经常使用的类,它可能是一个很好的解决方案。对于每次都需要动态的类,坚持使用eval可能是最好的解决方案。

$proxyClassOnDisk = '/path/to/proxyCodeCache/' . $clazz .'.cachedProxyClass'; 
if (! file_exists($proxyClassOnDisk)) { 
    // Generate the proxy and put it into the proxy class on disk. 
    file_put_contents($proxyClassOnDisk, $this->generateProxy($object)); 
} 
require_once($proxyClassOnDisk); 

在这个例子中,这个想法是,你创建的类的$object动态代理。 $this->generateProxy($object)将返回与原始问题看起来差不多像$extension的字符串。

这绝不是一个完整的实现,只是一些伪代码来显示我正在描述的内容。

2

如果您正在寻找创建一个动态类,那么eval()是跳转功能(双关语意。)但是那种相关的,我发现,你可以把一个if-then语句中类声明。所以,你可以做到以下几点:

if(true) 
{ 
    class foo 
    { 
     // methods 
    } 
} 

我使用它来检查,看看是否动态创建的类(从配置文件)是最新的......如果是这样,然后加载类,否则......再生类,并加载新的。所以,如果你正在寻找创建类似的动态类,这可能是一个解决方案。