类方法签名不匹配?

时间:2013-12-22 19:49:06

标签: php wordpress-plugin

我写了一些代码来使用PHP库(对于名为Checkfront的产品,但这并不重要)。该库定义了一个具有抽象方法的类:

abstract protected function store($data);

在我的代码中我将其子类化为

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

在我的独立版本的代码中,使用一些示例代码中的实现可以正常工作:

/* DUMMY Data store.  This sample stores oauth tokens in a text file...
 * This is NOT reccomened in production.  Ideally, this would be in an encryped 
 * database or other secure source.  Never expose the client_secret or access / refresh
 * tokens.
 *
 * store() is called from the parent::CheckfrontAPI when fetching or setting access tokens.  
 *
 * When an array is passed, the store should save and return the access tokens.
 * When no array is passed, it should fetch and return the stored access tokens.
 *
 * param array $data ( access_token, refresh_token, expire_token )
 * return array
 */
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;
}

。但是当我试图在Wordpress插件中使用它时,我遇到了错误。这是Wordpress土地中的功能:

final protected function store($data=array()) {
    global $wpdb;
    if (count($data)) {
        $query = "
            INSERT INTO {$wpdb->prefix}pt_store (k, v)
            VALUES      (%s, %s)
            ON DUPLICATE KEY UPDATE v=values(v)";
        foreach ($data as $k => $v) {
            $wpdb->query($wpdb->prepare($query, $k, $v));
        }
    } else {
        $data = $wpdb->get_results("
            SELECT  (k, v)
            FROM    {$wpdb->prefix}pt_store", ARRAY_A);
    }
    return $data;
}

但是当我尝试激活插件时,它会给我错误:

Fatal error: Declaration of Checkfront::store() must be compatible with that of CheckfrontAPI::store() in /hsphere/local/home/[blah]/[blah].ixtrial.com/wordpress/wp-content/plugins/pt-checkfront/pt-checkfront.php on line 15

声明看起来和我一样,那有什么不对? (请记住,这是我第一次编写PHP,所以不要忽视我在这里愚蠢的可能性。)

3 个答案:

答案 0 :(得分:4)

在PHP 5.2及更早版本中,可选参数将导致签名被视为不同。你不能以一种很好的方式解决这个问题,所以尝试升级PHP。

'当然,您可能不需要默认值。在那种情况下,把它拿出来!您也可以通过null并执行此操作:

final protected function store($data) {
    if ($data === null) $data = array();

答案 1 :(得分:2)

添加=array()会使参数成为可选参数(请参阅this stackoverflow question)。

这会更改方法签名。

答案 2 :(得分:0)

要避免此错误,您需要确保两个类中的方法签名相同,包括可选参数。

更改抽象类以允许默认数组

abstract protected function store($data = array());

PHP manual

  

方法的签名必须匹配,即类型提示和所需参数的数量必须相同。例如,如果子类定义了一个可选参数,而抽象方法的签名没有,则签名中没有冲突。