19

我刚刚在 PHP 5.4 上安装了 woocommerce 2.0(在 Wordpress 上),我得到了这个:

严格标准:WC_Gateway_BACS::process_payment() 的声明应与 D:\my\path\to\htdocs\wordpress\plugins\woocommerce\classes\gateways\bacs\class-wc-gateway 中的 WC_Payment_Gateway::process_payment() 兼容-bacs.php 上线...

我检查了文件,发现WC_Payment_Gateway没有方法process_payment()。我需要知道如何解决这个问题(而不是通过设置error_reporting())。

PHP中的严格标准到底是什么?
在什么情况下我们会得到那个错误?

4

5 回答 5

20

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 个参数与 1 个参数)-> 严格错误。
由于它似乎*总是与一个参数一起使用,您可以更改

function process_payment() {}

function process_payment($order_id) {}

(*) 请记住,我只在最后五分钟后才知道 woocommerce,所以不要相信我的话。

于 2013-06-21T11:47:23.857 回答
14

引用自 PHP 手册

在 PHP 5 中提供了一个新的错误级别 E_STRICT。在 PHP 5.4.0 之前,E_STRICT 不包含在 E_ALL 中,因此您必须在 >PHP < 5.4.0 中显式启用这种错误级别。在开发过程中启用 E_STRICT 有一些好处。STRICT 消息 > 提供有助于确保代码的最佳互操作性和转发 > 兼容性的建议。这些消息可能包括诸如静态调用非静态 >methods、在兼容的类定义中定义属性,同时在 >a used trait 中定义的内容,以及在 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);
于 2013-06-21T11:41:51.000 回答
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();
        // ...

    }
}
于 2014-12-06T07:51:40.810 回答
2

当您在父类和子类中使用相同的函数,但子类需要参数而父类不需要时,您会收到Strict Standards错误消息。

例子

经理:

public function getAtPosition($position)
{
    foreach ($this->getList() as $obj)
    {
        if ($obj->getPosition() == $position)
            return $obj;
    }

    return null;
}

MenuManager 扩展了 Manager:

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 扩展了 Manager:

public function getAtPosition($position, $parent = 0)
{
    foreach ($this->getList() as $m)
    {
        if ($m->getParent() == $parent && $m->getPosition() == $position)
            return $m;
    }

    return null;
}

唯一需要注意的是,在使用getAtPosition()from时MenuManager.class.php,请确保您实际上发送了 2 个参数,因为我们必须声明$parent = 0以匹配父级的声明。

每个扩展Manager和不包含的类getAtPosition()都将使用方法 from Manager

如果在子类中声明,php 将使用子类中的方法而不是父类的方法。PHP中没有overloading,所以我就是这样解决它的,直到它被正确实现。

于 2014-01-17T19:06:21.930 回答
1

这是一个更好的答案 - https://stackoverflow.com/a/9243127/2165415

例如,
parentClass::customMethod($thing = false)
childClass::customMethod($thing)
你调用customMethod()类时,它可能会触发错误,因为子方法没有为第一个参数定义默认值。

于 2014-07-11T18:12:53.743 回答