我刚刚在PHP 5.4上安装了woocommerce 2.0(在Wordpress上),我得到了这个:
严格标准:WC_Gateway_BACS :: process_payment()的声明 应与WC_Payment_Gateway :: process_payment()兼容 d:\我的\路径\到\ htdocs中\ WordPress的\插件\ woocommerce \类\网关\ BACS \类-WC-网关bacs.php 在线...
我检查文件,发现WC_Payment_Gateway
没有方法process_payment()
。
我需要知道如何解决这个问题(而不是通过设置error_reporting()
)。
PHP中的 严格标准 究竟是什么? 在什么条件下我们得到那个错误?
答案 0 :(得分:19)
WC_Payment_Gateway
在abstract-wc-payment-gateway.php
中定义并声明方法
function process_payment() {}
而WC_Gateway_BACS
将其定义为
function process_payment( $order_id ) { ...
(也许你混淆了WC_Payment_Gateway和WC_Payment_Gateway s )。
因此,不同的签名(0参数vs 1参数) - >严格的错误 因为似乎*总是使用一个参数,你可以改变
function process_payment() {}
到
function process_payment($order_id) {}
(*)请记住,自从过去五分钟以来我才知道woocommerce,所以不要相信我的话。
答案 1 :(得分:12)
来自PHP手册的报价
在PHP 5中,可以使用新的错误级别E_STRICT。在PHP 5.4.0之前,E_STRICT并未包含在E_ALL中,因此您必须在> PHP<<< 5.4.0。在开发期间启用E_STRICT有一些好处。 STRICT消息>提供有助于确保最佳互操作性和转发代码兼容性的建议。这些消息可能包括诸如静态调用非静态>方法,在>使用的特征中定义的兼容类定义中定义属性,以及在PHP 5.3之前的某些不推荐的特性会发出E_STRICT错误>例如分配对象通过实例化参考。
您收到此错误是因为 WC_Gateway_BACS :: process_payment()声明与 WC_Payment_Gateway :: process_payment()不同(可能不是相同数量的参数等) 。如果 WC_Payment_Gateway 没有方法process_payment,请检查它的父类:)
此外,如果要禁用STRICT错误,请将 ^ E_STRICT 添加到错误报告配置中,例如:
error_reporting(E_ALL ^ E_STRICT);
答案 2 :(得分:8)
如果您想保留OOP表格而不关闭任何错误,您还可以:
class A
{
public function foo() {
;
}
}
class B extends A
{
/*instead of :
public function foo($a, $b, $c) {*/
public function foo() {
list($a, $b, $c) = func_get_args();
// ...
}
}
答案 3 :(得分:1)
当您在父类和子类中使用相同的函数,但子类需要参数而父类不参数时,您将收到Strict Standards
错误。
示例强>
管理器:
public function getAtPosition($position)
{
foreach ($this->getList() as $obj)
{
if ($obj->getPosition() == $position)
return $obj;
}
return null;
}
MenuManager扩展管理器:
public function getAtPosition($position, $parent)
{
foreach ($this->getList() as $m)
{
if ($m->getParent() == $parent && $m->getPosition() == $position)
return $m;
}
return null;
}
此示例将生成错误:
严格的标准:MenuManager :: getAtPosition()的声明应该 与Manager :: getAtPosition($ position)兼容
因为我们没有相同的函数参数,所以让我们欺骗它并添加参数,即使我们没有使用它们!
管理器:
public function getAtPosition($position, $dummy = 0) // Dummy to avoid Strict standards errors
{
foreach ($this->getList() as $obj)
{
if ($obj->getPosition() == $position)
return $obj;
}
return null;
}
MenuManager扩展管理器:
public function getAtPosition($position, $parent = 0)
{
foreach ($this->getList() as $m)
{
if ($m->getParent() == $parent && $m->getPosition() == $position)
return $m;
}
return null;
}
只有一个要小心的是,当使用getAtPosition()
中的MenuManager.class.php
时,请确保您实际上发送了2个参数,因为我们必须声明$parent = 0
才能匹配父级的声明
每个扩展Manager
且不包含getAtPosition()
的班级都将使用Manager
中的方法。
如果在子类中声明,php将使用子类中的方法而不是父类的方法。 PHP中没有overloading
,所以这就是我如何解决它,直到它正确实现。
答案 4 :(得分:1)
这是一个更好的答案 - https://stackoverflow.com/a/9243127/2165415
例如,
parentClass::customMethod($thing = false)
和
childClass::customMethod($thing)
因此,当您为类调用customMethod()
时,它可能会触发错误,因为子方法没有为第一个参数定义默认值。