我写了一些代码来使用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,所以不要忽视我在这里愚蠢的可能性。)
答案 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());
方法的签名必须匹配,即类型提示和所需参数的数量必须相同。例如,如果子类定义了一个可选参数,而抽象方法的签名没有,则签名中没有冲突。