【问题标题】:php namespace clashes with dompdf and AWS?php 命名空间与 dompdf 和 A​​WS 冲突?
【发布时间】:2014-02-13 04:53:20
【问题描述】:

我们的代码库中有现有的东西使用 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 类加载器。

$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,但它们都抛出了错误。如果没有命名空间,我猜它是 bc。

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

大家有什么建议吗?

【问题讨论】:

  • 您使用的是哪个版本的 dompdf?您是在包含 aws.phar 之前还是之后包含 dompdf 配置文件? v0.5.x 不使用比 0.6.0 兼容性差的自动加载器。
  • 我们使用的是 v0.5.1。我已经尝试在 aws.phar 之前和之后都包含配置,似乎没有任何区别。我不明白你的句子“v0.5.x 没有使用比 0.6.0 兼容性差的自动加载器。”你的意思是“确实使用了不太兼容的自动加载器”?
  • 那个版本的 DOMPDF 的源代码在哪里?
  • @HerbGirl 哈哈,是的,应该是“v0.5.x 使用了不太兼容的自动加载器”……虽然这还是有点尴尬。
  • @JeremyLindblom 仅供参考,您可以在此处找到 0.5.x 源代码:github.com/dompdf/dompdf/tree/v0.5.2。但我认为仅使用该版本就是问题所在。

标签: php amazon-web-services namespaces dompdf


【解决方案1】:

dompdf v0.5.1 还没有实现 SPL 自动加载,它注册了__autoload()。这种过时的自动加载方法效果不佳,因为一次注册多个自动加载函数很困难。另外,当使用 确实 使用 SPL 自动加载的编写 PHP 时,不会调用 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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-14
    • 2020-04-23
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 2011-12-30
    相关资源
    最近更新 更多