在Magento 1.7.0.2中安装SUPEE-10975后,我得到此PHP通知:
Strict Notice: Declaration of Mage_Core_Controller_Request_Http::getBaseUrl() should be compatible with that of Zend_Controller_Request_Http::getBaseUrl() in app/code/core/Mage/Core/Controller/Request/Http.php on line 36
#0 app/code/core/Mage/Core/Controller/Request/Http.php(36): mageCoreErrorHandler(2048, 'Declaration of ...', '/kunden/12345_8...', 36, Array)
#1 lib/Varien/Autoload.php(93): include('/kunden/12345_8...')
#2 [internal function]: Varien_Autoload->autoload('Mage_Core_Contr...')
#3 app/code/core/Mage/Core/Model/App.php(1219): spl_autoload_call('Mage_Core_Contr...')
#4 app/code/core/Mage/Core/Model/Cookie.php(83): Mage_Core_Model_App->getRequest()
#5 app/code/core/Mage/Core/Model/Cookie.php(273): Mage_Core_Model_Cookie->_getRequest()
#6 app/code/core/Mage/Core/Model/App.php(568): Mage_Core_Model_Cookie->get()
#7 app/code/core/Mage/Core/Model/App.php(488): Mage_Core_Model_App->_checkCookieStore('website')
#8 app/code/core/Mage/Core/Model/App.php(349): Mage_Core_Model_App->_initCurrentStore('', 'store')
#9 app/Mage.php(683): Mage_Core_Model_App->run(Array)
#10 index.php(87): Mage::run('', 'store')
#11 {main}
该代码在我的安装中两次可用:
app/code/core/Zend/Controller/Request/Http.php
=>与SUPEE-10975一起引入lib/Zend/Controller/Request/Http.php
=>在Magento 1.7.0.2的基本安装包中可用这是SUPEE-10975的回归版本还是我的安装问题?
答案 0 :(得分:2)
我也看到了同样的问题,它看起来确实像是SUPEE-10975补丁1.7中的回归。
更改PHP配置以禁止显示严格模式通知将使您工作,但是,如果您更喜欢以严格模式工作,则也可以通过此方法来修补补丁。
如您所见,SUPEE-10975添加了一个新类Mage_Core_Controller_Request_Http
,它扩展了新文件Zend_Controller_Request_Http
中新捆绑的Zend类app/code/core/Zend/Controller/Request/Http.php
。
发出严格模式通知是因为Mage_Core_Controller_Request_Http::getBaseUrl()
方法签名与扩展的新Zend_Controller_Request_Http::getBaseUrl()
的方法签名不正确。
Mage_Core_Controller_Request_Http :: getBaseUrl()
class Mage_Core_Controller_Request_Http extends Zend_Controller_Request_Http
...
public function getBaseUrl() //getBaseUrl has no parameters here
{
...
}
Zend_Controller_Request_Http :: getBaseUrl()
class Zend_Controller_Request_Http extends Zend_Controller_Request_Abstract
...
public function getBaseUrl($raw = false) //getBaseUrl in the ancestor class has the parameter $raw
{
...
}
Mage_Core_Controller_Request_Http::getBaseUrl()
方法应具有参数$raw
,以避免严格的模式通知。这并不是真正的错误,PHP可以解决它,但理想情况下应该更正。
通过在PHP配置中禁止严格模式通知,代码可以忽略该错误,但如果代码只能在严格模式下运行会更好,不是吗?
以下是解决方法,使其可以在严格模式下运行
将app/code/core/Mage/Core/Controller/Request/Http.php
复制到本地代码池:app/code/local/Mage/Core/Controller/Request/Http.php
(请注意,我们正在 local 文件夹中创建替代)
编辑app/code/local/Mage/Core/Controller/Request/Http.php
并从
public function getBaseUrl()
到
public function getBaseUrl($raw = false)
如果代码已编译,并且编译器在运行时没有出错,则可能需要清除编译后的版本才能看到所做的更改。
从Magento的网络根目录中,发出命令php shell/compiler.php clear
。
现在,应用了SUPEE-10975补丁程序,商店应该可以正常运行。
我们在本地代码文件夹中创建核心Magento文件的副本,Magento将在使用核心文件之前尝试文件的本地副本,因此该本地副本将覆盖原始文件。
我们对文件的编辑,使getBaseUrl的方法签名与祖先类匹配,从而取消了严格模式通知。
可以这样做,因为Magento 1.7代码中都没有使用$raw
参数,并且该方法的默认行为与没有该参数的情况完全相同。
要撤消此更改,只需删除我们刚刚制作的本地副本app/code/local/Mage/Core/Controller/Request/Http.php
。 Magento将自动返回使用核心文件,尽管会有严格的模式通知。
唯一的问题是...
下次发生安全补丁或升级时,如果原始文件被更改,我们制作的本地副本将不会被补丁或更新。您需要检查是否仍需要进行此更改,如果需要,请重新将核心文件复制到本地文件夹,然后如上所述重新修补文件。