2

新しいクラスでCheckfrontAPIクラスを拡張しようとしています。

私の場合、クラスの一度に1つのインスタンスのみをロードするためにシングルトンパターンを使用すると、そのエラーが発生します

致命的なエラー:CheckFrontIntegrator :: store()の宣言は、83行目の/home/my_web_site/public_html/wp-content/plugins/checkfront/class/Checkfront_Integration.phpのCheckfrontAPI :: store()の宣言と互換性がある必要があります

その問題を解決する方法について何かアイデアはありますか?

CheckfrontAPIのソースコードは次のとおりです:https ://github.com/Checkfront/PHP-SDK/blob/master/lib/CheckfrontAPI.php

そして、これがそのクラスを拡張する私のクラスです:

<?php

class CheckFrontIntegrator extends CheckfrontAPI
{
    private static $instance = null;
    public $tmp_file = '.checkfront_oauth';

    final protected function store($data = array())
    {
        $tmp_file = sys_get_temp_dir() . DIRECTORY_SEPARATOR. $this->tmp_file;

        if(count($data))
        {
            file_put_contents(  
                $tmp_file,
                json_encode(
                    $data, 
                    true
                )
            );
        }
        elseif(is_file($tmp_file))
        {
            $data = json_decode(
                trim(
                    file_get_contents(
                        $tmp_file
                    )
                ),
                true
            );
        }

        return $data;
}

    public function session($session_id, $data = array())
    {
        $_SESSION['checkfront']['session_id'] = $session_id;
}

    public static function instance($data)
    {
        if(!isset(self::$instance))
        {
            self::$instance = new CheckFrontIntegrator($data);
        }

        return self::$instance;
    }

    public function __construct($data)
    {
        if(session_id() == '')
        {
            session_start();
        }

        parent::__construct($data, session_id());
    }
}

?>

そして、私はそのクラスの新しいインスタンスを次のように開始します。

$this->checkfront_integrator = CheckFrontIntegrator::instance($args);

ここで、argsは、新しいオブジェクトを開始するためにクラスが必要とするすべての重要な情報です。

編集後

メソッドストアを次の場所から変更しました。

final protected function store($data = array())
....

protected function store($data)
....

そして問題はまだ発生します:(

4

3 に答える 3

3

CheckfrontAPIは抽象クラスですか?この場合、CheckFrontIntegrator :: store()引数の数は元の宣言と同じである必要があります

編集

githubで見る

abstract protected function store($data);

オーバーライドは次のとおりである必要があります。

protected function store($data) {

}
于 2012-04-06T07:15:03.160 に答える
2

CheckfrontAPIを拡張しています。CheckfrontAPIにはメソッドstore()があります。そのメソッドをオーバーライドする場合は、適切に実行する必要があります。

CheckfrontAPIのコードとクラスCheckfront_Integrationを投稿してください:何が​​問題なのかをいつ理解できるか。

于 2012-04-06T07:14:39.727 に答える
1

独自のクラスを作成して既存のクラスの機能を拡張する必要があり、拡張するクラスが抽象クラスである場合は、関数呼び出しに互換性があることを確認する必要があります。
これは何を意味するのでしょうか?

拡張しているクラスに次のような関数呼び出しがある場合:

function walk($direction, $speed = null);

次に、実装で関数のシグネチャを尊重する必要があります。つまり、バージョンで2つの関数の引数を渡す必要があります。

あなたは変更することができなくなりますこのようになります:

function walk($direction, $speed, $clothing);
于 2012-04-06T07:24:14.360 に答える