【问题标题】:define PHP class on the fly in a zend application在 zend 应用程序中动态定义 PHP 类
【发布时间】:2012-05-07 16:12:16
【问题描述】:

在 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;
    }
}

我得到一个寻找 Non/Conforming/Dummy/Class.php 的“没有这样的文件或目录”

【问题讨论】:

  • 如果该类已在使用它的同一脚本中定义(如您的示例中所示),则没有理由运行自动加载器。如果确实发生了这种情况,请检查类名中的拼写错误。

标签: php zend-framework zend-autoloader


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 不合格不是正确的词选择,“冲突”是。我的类名看起来像一个自动加载类,但我不希望它自动加载。进一步考虑,这甚至可能是不可能的;我只是不太了解 PHP 和类加载。实际的类定义是否在脚本评估中持续存在?还是每次通过脚本都会重新找到使用的类并再次加载它们?请原谅我的无知,但这对我来说一直是个谜。
  • @BigBird PHP 是无共享的,所以是的,每个请求都会重新找到类并再次加载和解释它们。自动加载器通过拦截对未知类名的任何调用并提供包含它们的策略来工作。这意味着如果在调用类之前包含冲突的类,自动加载器将不会尝试加载它,因为它已经包含在内。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    • 2016-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多