严格的标准:''应该与...兼容'的声明

时间:2013-06-21 11:34:26

标签: php wordpress woocommerce

我刚刚在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中的 严格标准 究竟是什么? 在什么条件下我们得到那个错误?

5 个答案:

答案 0 :(得分:19)

WC_Payment_Gatewayabstract-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()时,它可能会触发错误,因为子方法没有为第一个参数定义默认值。