source

엄격한 기준:'의 선언은 '와 호환되어야 합니다.

gigabyte 2023. 3. 20. 23:17
반응형

엄격한 기준:'의 선언은 '와 호환되어야 합니다.

방금 Woocommerce 2.0(Wordpress에)을 PHP 5.4에 설치했는데, 다음과 같습니다.

엄격한 기준:WC_Gateway_B 선언ACS::process_payment()는 D:\my\path\to\htdocs\wordpress\woocommerce\classes\gateways\bacs\class-wc-gateway-bacs의 WC_Payment::::::process_payment()와 호환되어야 합니다.php 온라인...

파일을 확인해보니WC_Payment_Gateway방법이 없다process_payment()(설정이 아닌) 이 문제를 해결하는 방법을 알아야 합니다.error_reporting()).

PHP의 Strict Standards란 정확히 무엇입니까?
어떤 상황에서 그런 오류가 발생합니까?

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를 혼동하셨을 겁니다).

그래서, 다른 서명(0 매개 변수) -> 엄격한 오류) -> 엄격한 오류가 발생했습니다.
왜냐하면, 변경할 수 있는 매개 변수와 함께 사용할 수 있는 것 같습니다.

function process_payment() {}

로.

function process_payment($order_id) {}

(*) 저는 마지막 5분 동안만 woocommerce를 알고 있으니 제 말을 믿지 마세요.

PHP 매뉴얼에서 인용

PHP 5 에서는, 새로운 에러 레벨 E_STRICT 를 사용할 수 있습니다.PHP 5.4.0 이전에는 E_STRICT는 E_ALL에 포함되어 있지 않았기 때문에 PHP < 5.4.0에서 이러한 종류의 에러 레벨을 명시적으로 유효하게 할 필요가 있었습니다.개발 중에 E_STRICT를 활성화하면 몇 가지 이점이 있습니다.SECTRICT 메시지> 최적의 상호 운용성을 확보하고 코드 호환성을 전송하기 위한 제안을 제공합니다.이러한 메시지에는 non-static > 메서드를 스태틱하게 호출하거나 >에서 정의된 호환 클래스 정의에서 속성을 정의하거나 PHP 5.3 이전 버전에서는 사용되지 않는 일부 기능에서는 인스턴스화 시 참조에 의한 오브젝트 할당 등의 E_STRICT 에러가 발생합니다.

이 에러는, WC_Gateway_B 로부터 발생하고 있습니다.ACS::process_payment() 선언이 WC_Payment_Gateway::process_payment()와 다릅니다(파라미터의 양이 같지 않을 수 있습니다).WC_Payment_Gateway에 method process_payment가 없는 경우 부모클래스를 확인합니다.

또, STRICT 에러를 디세블로 하는 경우는, 다음과 같이 ^ E_STRICT 를 에러 리포트 설정에 추가합니다.

error_reporting(E_ALL ^ E_STRICT);

오류를 끄지 않고 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();
        // ...

    }
}

부모 클래스 및 하위 클래스에서 동일한 기능을 사용하는 경우 the 요 지 하 우 가 개 you when 수 은 는 get 수 class and 개 one' the functionStrict Standards error.에러입니다.

매니저:

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;
}

Only one to be careful is that when using 주의할 점은 사용 시getAtPosition()부에서MenuManager.class.php, 2 의 라 파 미 제 2 신 는 을주요 sending확ers be세 are have 2해것있 paramet, you개 to actually송 declare we sure인실고하로를터$parent = 0부모 선언과 일치시키다부모의 선언과 일치하도록 하기 위해서입니다.

가 " " "를 확장합니다.Manager「」를하지 .getAtPosition()~의 합니다.Manager.

자식 클래스에서 선언된 경우 php는 부모의 메서드 대신 자식 클래스의 메서드를 사용합니다.overloadingPHP를 사용하여 적절하게 구현될 때까지 작업을 수행했습니다.

여기 더 나은 답이 있습니다 - https://stackoverflow.com/a/9243127/2165415

를 들어, 「」라고 하는 것은,
parentClass::customMethod($thing = false) ★★★★★★★★★★★★★★★★★」
childClass::customMethod($thing)
때'를 customMethod()클래스의 경우 하위 메서드가 첫 번째 인수에 대한 기본값을 정의하지 않았기 때문에 오류가 트리거될 수 있습니다.

언급URL : https://stackoverflow.com/questions/17234259/strict-standards-declaration-of-should-be-compatible-with

반응형