PHP尝试自动加载随机类名称

时间:2012-11-15 17:03:13

标签: 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可能会这样做。触发错误的行(callstack中的#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自动加载器/ defined /类常量中看到这样的问题?

(我和我的客户合作确定他们正在运行的PHP版本,以及获取他们已部署的文件的副本,以确保它们符合我的假设。)

1 个答案:

答案 0 :(得分:1)

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

但是,该代码正在检查class constant,虽然可能,但不太常见。我怀疑检查是触发自动加载(just as the use of class_exists can trigger autoloading。)但是,通过使用定义传递给自动加载器的值被破坏(可能会移交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;
}

艾伦在评论中指出,Zend Guard也可能引发一个问题。