Ala*_*orm 6 php magento autoload
我的一位客户在他们的Magento系统中报告了一些奇怪的问题(Magento是一个用PHP编写的电子商务平台).我没有直接访问系统来调试和调试,所以我想如果你见过这样的话,我会问Stack Overflow.
他们偶尔会看到的错误是
Warning: include(O1ucm02owqn3iwwcx5osz2m2.php): failed to open stream:
Run Code Online (Sandbox Code Playgroud)
使用包含的调用堆栈
#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...')
Run Code Online (Sandbox Code Playgroud)
从这里,我可以推断PHP认为它需要实例化一个名为的类O1ucm02owqn3iwwcx5osz2m2
.但是,我无法弄清楚为什么 PHP会这样做.触发错误的行(callstack中的#4,在191行附近Observer.php
)应该是
if(defined("Mage_Core_Block_Template::XML_PATH_DEBUG_TEMPLATE_HINTS"))
{
$path = Mage_Core_Block_Template::XML_PATH_DEBUG_TEMPLATE_HINTS;
}
Run Code Online (Sandbox Code Playgroud)
这些行似乎没有提到任何名为的PHP类O1ucm02owqn3iwwcx5osz2m2
(我说"应该是"因为客户自己部署了代码,我正在与他们合作以获取副本以寻找潜在的问题).
有谁知道可能会发生什么?这是一个已知的PHP错误/某个版本的问题和/或有没有人看到这样的问题与PHP自动加载器/ defined
/类常量?
(我正在和我的客户一起确定他们正在运行的PHP版本,以及获取他们部署的文件的副本,以确保它们符合我的假设.)
Defined() 函数是对命名常量的 Define() 函数的补充。也就是说,用define声明的常量可以用define很好地检查。
然而,该代码正在检查类常量,这虽然可能,但不太典型。我怀疑检查正在触发自动加载(就像使用 class_exists 可以触发自动加载一样。)但是,通过使用 Defined 传递给自动加载器的值被破坏了(可能传递了string 的 z-val 的哈希值)。 )
我想知道以下更改是否会使事情正常进行:
// 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;
}
Run Code Online (Sandbox Code Playgroud)
正如 Alan 在评论中指出的那样,Zend Guard 也可能引起问题。