在 zend 应用程序中动态定义 PHP 类


define PHP class on the fly in a zend application

在Zend应用程序中,有没有办法定义一个不符合自动加载命名约定的类,并且在我以后尝试使用它时仍然可以识别它?我想你定义类并以某种方式用自动加载器注册它,但是在阅读自动加载器手册页后,我仍然不明白该怎么做。

我的用例是在测试期间(不,在这种情况下我不想要模拟或存根)。我在测试脚本的顶部定义了一个新类,但是当我的应用程序代码引用该类时,autolader 会根据命名约定积极疲倦地加载它。

<?php 
class Non_Conforming_Dummy_Class 
{
}
// should I register this new class with the autoloader right here? 
class Whatever
{
public function useIt()
    {
        $class = new Non_Conforming_Dummy_Class;
    }
}

我得到一个"没有这样的文件或目录",它查找非/符合/虚拟/类.php

ZF 自动加载器将按照 PSR-0 约定加载任何类。任何不遵循该约定的类都不能使用自动加载器加载。但是,您可以

注册任意自动加载器回调,可以选择使用特定命名空间(或命名空间组)。 在使用其内部自动加载机制之前,Zend_Loader_Autoloader将首先尝试匹配这些。

这意味着,您可以将自己的自动加载器

添加到采埃孚的自动加载器中,该自动加载器知道您的命名方案:

$autoloader->pushAutoloader(array('myAutoloader', 'autoload'), 'MyPrefix');

见 http://framework.zend.com/manual/en/zend.loader.autoloader.html

当 PHP 检测到尚未注册的类时,自动加载器是一种回退机制,因此如果您的代码类似于顶部的代码,它不应该失败,因为该类正在同一个脚本中注册,例如:

class foobar{}
class demo
{
    public function foo()
    {
         $bar = new foobar();
    }
}

工作没有问题,如果你的类在另一个文件中,你可以包括()它,或者require()它,自动加载器将是找不到类时要调用的最后一个函数。