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

在zend应用程序中动态定义PHP类,php,zend-framework,zend-autoloader,Php,Zend Framework,Zend Autoloader,在Zend应用程序中,是否有一种方法可以定义一个不符合自动加载命名约定的类,并且在我稍后尝试使用它时仍然可以识别它?我想象你定义了这个类,然后用autoloader注册了它,但是在阅读了autoloader手册页之后,我仍然不知道该怎么做 我的用例是在测试期间(不,我不想在这种情况下使用mock或stub)。我在测试脚本的顶部定义了一个新类,但是当我的应用程序代码引用该类时,autolader会根据命名约定积极地加载它 <?php class Non_Conforming_Dummy_

在Zend应用程序中,是否有一种方法可以定义一个不符合自动加载命名约定的类,并且在我稍后尝试使用它时仍然可以识别它?我想象你定义了这个类,然后用autoloader注册了它,但是在阅读了autoloader手册页之后,我仍然不知道该怎么做

我的用例是在测试期间(不,我不想在这种情况下使用mock或stub)。我在测试脚本的顶部定义了一个新类,但是当我的应用程序代码引用该类时,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;
    }
}

ZF自动加载器将加载符合PSR-0约定的任何类。任何不遵循该约定的类都不能使用自动加载程序加载。但是,你可以

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

这意味着,您可以将自己的自动加载器添加到ZF的自动加载器中,该自动加载器知道您的命名方案:

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

请参见

ZF自动加载器将加载符合PSR-0约定的任何类。任何不遵循该约定的类都不能使用自动加载程序加载。但是,你可以

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

这意味着,您可以将自己的自动加载器添加到ZF的自动加载器中,该自动加载器知道您的命名方案:

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

请参见

当PHP检测到尚未注册的类时,autoloader是一种回退机制,因此如果您的代码与顶部的代码类似,则不会失败,因为该类将在同一脚本中注册,ej:

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

如果您的类位于另一个文件中,您可以包含()或要求()它,当找不到该类时,autoloader将是最后一个调用的函数。

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

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

如果您的类位于另一个文件中,则可以包含()或要求()该类,当找不到该类时,自动加载程序将是最后一个调用的函数。

如果该类已在使用该类的同一脚本中定义(如您的示例所示),则自动加载程序没有理由运行。如果确实发生了这种情况,请检查您的类名是否有拼写错误。如果在使用该类的同一脚本中定义了该类(如您的示例所示),则没有理由运行自动加载程序。如果这是真的,检查你的类名是否有拼写错误。不一致不是正确的词语选择,“冲突”是。我的类名看起来像一个自动加载的类,但我不希望它自动加载。经进一步考虑,这甚至可能是不可能的;我只是不太了解PHP和类加载。实际的类定义是否在脚本求值过程中持久化?还是每次通过脚本都会重新找到使用的类并再次加载它们?请原谅我的无知,但这对我来说一直有点神秘。@BigBird PHP是一个共享的nothing,所以是的,每个请求都会重新找到类,并再次加载和解释它们。自动加载器的工作原理是拦截对未知类名的任何调用,并提供包含它们的策略。这意味着,如果在调用类之前包含冲突类,自动加载程序将不会尝试加载它,因为它已经包含在内。不一致不是正确的词语选择,“冲突”是。我的类名看起来像一个自动加载的类,但我不希望它自动加载。经进一步考虑,这甚至可能是不可能的;我只是不太了解PHP和类加载。实际的类定义是否在脚本求值过程中持久化?还是每次通过脚本都会重新找到使用的类并再次加载它们?请原谅我的无知,但这对我来说一直有点神秘。@BigBird PHP是一个共享的nothing,所以是的,每个请求都会重新找到类,并再次加载和解释它们。自动加载器的工作原理是拦截对未知类名的任何调用,并提供包含它们的策略。这意味着,如果在调用类之前包含冲突的类,自动加载程序将不会尝试加载它,因为它已经包含在内。