PHP 尝试自动加载随机类名

标签 php magento autoload

我的一位客户报告说他们的 Magento 系统中的某些代码存在奇怪问题(Magento 是一个用 PHP 编写的电子商务平台)。我没有直接访问系统的权限来四处查看和调试,所以我想如果您曾经见过这样的事情,我会问问 Stack Overflow。

他们偶尔看到的错误是

Warning: include(O1ucm02owqn3iwwcx5osz2m2.php): failed to open stream: 

调用堆栈包括

#0 /Users/theirusername/Sites/project/lib/Varien/Autoload.php(93): mageCoreErrorHandler(2, 'include(O1ucm02...', '/Users/theiruse...', 93, Array)
#1 /Users/theirusername/Sites/project/lib/Varien/Autoload.php(93): Varien_Autoload::autoload()
#2 [internal function]: Varien_Autoload->autoload('o1ucm02owqn3iww...')
#3 [internal function]: spl_autoload_call('o1ucm02owqn3iww...')
#4 /Users/theirusername/Sites/project/app/code/local/Theirname/Commercebug/Model/Observer.php(191): defined('Mage_Core_Block...')

由此,我可以推断出 PHP 认为它需要实例化一个名为 O1ucm02owqn3iwwcx5osz2m2 的类。但是,我无法弄清楚 为什么 PHP 可能会这样做。触发错误的行(调用堆栈中的#4,Observer.php 中的第 191 行左右)应该是

if(defined("Mage_Core_Block_Template::XML_PATH_DEBUG_TEMPLATE_HINTS"))
{
    $path = Mage_Core_Block_Template::XML_PATH_DEBUG_TEMPLATE_HINTS;
}

这些行似乎没有提到任何名为 O1ucm02owqn3iwwcx5osz2m2 的 PHP 类(我说“应该”是因为客户自己部署了代码,我正在与他们合作以获取副本以查看潜在问题)。

有人知道会发生什么吗?这是某个版本的已知 PHP 错误/问题和/或是否有人在 PHP 自动加载器/定义的/类常量中看到过这样的问题?

(我正在与我的客户一起确定他们正在运行的 PHP 版本,并获取他们已部署的文件的副本以确保它们与我假设的相匹配。)

最佳答案

defined() 函数是对命名常量的 define() 函数的补充。也就是说,用define声明的常量可以用 defined 很好地检查.

但是,该代码正在检查 class constant ,虽然可能,但不太典型。我怀疑检查正在触发自动加载( just as the use of class_exists can trigger autoloading 。)但是,通过使用 defined 传递给自动加载器的值被破坏了(可能传递了 hash of the z-val for the string 。)

我想知道以下更改是否能让事情正常进行:

// force PHP to load the class first, then let defined() check for the constant
if(class_exists("Mage_Core_Block_Template") && defined("Mage_Core_Block_Template::XML_PATH_DEBUG_TEMPLATE_HINTS"))
{
    $path = Mage_Core_Block_Template::XML_PATH_DEBUG_TEMPLATE_HINTS;
}

正如 Alan 在他的评论中指出的那样,Zend Guard 也可能导致问题。

关于PHP 尝试自动加载随机类名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13402541/

相关文章:

php - 在多个数据库中插入数据

php - 未提交审核表单

php - Magento 网格 : Better way of using addColumn Actions?

PHP Composer 自动加载需要永远

php - Zend 从同一目录自动加载不同的命名空间?

php - 使用 mysql_real_escape_string 我的 SQL 请求是否安全?

php - 将 jQuery/AJAX 脚本附加到使用 window.setInterval(, 1000*60) 方法添加的元素

PHP不打印MySQL图像

css - 边距在特定的 div 内容中不起作用

ruby - 自动加载命名空间/子模块