【问题标题】:Namespaces in vendor files (CakePHP2.x and PHP5.4.3)供应商文件中的命名空间(CakePHP2.x 和 PHP5.4.3)
【发布时间】:2012-08-05 11:57:25
【问题描述】:

我想使用一个使用命名空间的 CSS 解析器。我将文件放在供应商中,然后应用程序将其导入。但脚本本身似乎没有找到它的类

在我的班级顶部,我导入了文件:

App::import('Vendor', 'Sabberworm', array('file' => 'Sabberworm/CSS/Parser.php'));

位于 /root/vendors/Sabberworm/CSS/ (所有文件都在此命名空间中)

在我的类方法中,我创建了一个新实例:

public function parse($content) {
    $oParser = new Sabberworm\CSS\Parser($content);
    ...
}

到目前为止一切顺利。但是如果我现在想打电话给$oCss = $oParser->parse(); 那就是致命错误:

"Fatal error: Class 'Sabberworm\CSS\CSSList\Document'"

然后它失败了,因为它需要其他文件(应该使用命名空间加载)。根供应商文件夹位于包含路径中,并且外部脚本似乎将命名空间设置为“命名空间 Sabberworm\CSS;”。我错过了什么?我对命名空间有点陌生。

【问题讨论】:

    标签: php cakephp namespaces cakephp-2.2


    【解决方案1】:

    将此添加到引导程序

    spl_autoload_register(function($class) {
        foreach(App::path('Vendor') as $base) {
            $path = $base . str_replace('\\', DS, $class) . '.php';
            if (file_exists($path)) {
                return include $path;
            }
        }
    });
    

    或者只是在函数内部:

    $path = APP . 'Vendor' . DS . str_replace('\\', DS, $class) . '.php';
    if (file_exists($path)) {
        include $path;
    }
    

    【讨论】:

    • 我喜欢第一个。它立即起作用(我将它放入使用供应商内容的 lib 类中)。多谢!现在我可以继续处理 AssetSprite 的东西了。
    • 我在dereuromark.de/2012/08/06/…中引用了它
    • 在 cakephp 1.2 和 1.3 中怎么样
    • 请注意:您应该在包含之后“返回”。有人在引用的博客文章中提到了这一点。
    猜你喜欢
    • 1970-01-01
    • 2019-08-05
    • 1970-01-01
    • 2021-07-15
    • 2015-10-27
    • 2021-08-16
    • 2014-10-23
    • 2018-07-12
    • 1970-01-01
    相关资源
    最近更新 更多