我的一位客户报告说他们的 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/