php命名空间与dompdf和AWS冲突?

时间:2014-02-10 23:26:17

标签: php amazon-web-services namespaces dompdf

我们的代码库中存在使用dompdf(版本0.5.1)的东西......它没有命名空间。

当我包含aws.phar时,使用类似

的内容
require '/path/to/aws.phar';

突然间,我得到了致命的错误

Class 'DOMPDF' not found in XXXX on line 1193

导致错误的代码只是类的新实例化:

$dompdf = new \DOMPDF();

我猜这是一个命名空间问题,但我不知道如何修复它,因为我已经将全局转义放在DOMPDF前...如果我注释掉了phar的require行,那么一切都回归了。

我也打开了AWS.phar,看看里面发生了什么。从未混淆的代码中,我看到他们正在使用symfony类loder。

$classLoader = new Symfony\Component\ClassLoader\UniversalClassLoader();
$classLoader->registerNamespaces(array(
    'Aws'      => 'phar://aws.phar/src',
    'Guzzle'   => 'phar://aws.phar/vendor/guzzle/guzzle/src',
    'Symfony\\Component\\EventDispatcher' => 'phar://aws.phar/vendor/symfony/event-dispatcher',
    'Doctrine\\Common' => 'phar://aws.phar/vendor/doctrine/common/lib',
    'Psr\\Log' => 'phar://aws.phar/vendor/psr/log',
    'Monolog'  => 'phar://aws.phar/vendor/monolog/monolog/src'
));

我尝试了几个不同的东西来注册dompdf和类加载器,但是他们都犯了错误。如果没有命名空间的话,我猜它是不是。

我也尝试在加载phar之前和之后加载dompdf include配置文件,它似乎没有任何区别。

任何人都有任何建议吗?

1 个答案:

答案 0 :(得分:3)

dompdf的v0.5.1尚未实现SPL自动加载,它注册了__autoload()。这种过时的自动加载方法效果不佳,因为很难一次注册多个自动加载功能。另外,当使用编写PHP 使用SPL自动加载时,将不会调用v0.5.1自动加载器。 PHP SPL自动加载禁用调用__autoload()spl_autoload_register)。

v0.6.0(just released)使用SPL自动加载,并且应与AWS.phar兼容。 v0.6.0是(大部分)v0.5.1的替代品,因此您可能想尝试升级dompdf的副本。

如果由于某种原因无法实现,则可以在包含dompdf_config.inc.php之后使用SPL手动注册dompdf自动加载器。至少你可以尝试以下方法:

<?php
require_once('dompdf/dompdf_config.inc.php');
spl_autoload_register('DOMDPF_autoload');
// ...
?>

有关更完整的示例,请参阅dompdf v0.6.0 autoload include