我们的代码库中存在使用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配置文件,它似乎没有任何区别。
任何人都有任何建议吗?
答案 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。