PHP代码出错

ran*_*dev 1 php

错误:

Parse error: syntax error, unexpected T_STRING, expecting T_VARIABLE in
 PSubscriptionFile.php on line 90; 
Run Code Online (Sandbox Code Playgroud)

我认为public static _fromJSON应该是公开的

static function _fromJSON 
Run Code Online (Sandbox Code Playgroud)

但这会给致命错误:

Declaration of PSubscriptionFile::__construct() must be compatible with that of 
PuSHSubscriptionInterface::__construct() in PSubscriptionFile.php on line 9
Run Code Online (Sandbox Code Playgroud)

文件:http://github.com/bobdia/PuSHSubscriber

我不明白如何修复错误.谢谢!

Gor*_*don 12

你写了

public static _fromJSON($data) {
Run Code Online (Sandbox Code Playgroud)

代替

public static function _fromJSON($data) {
Run Code Online (Sandbox Code Playgroud)

解决此问题时遇到的致命错误是因为您的构造函数签名与接口 所需的构造函数签名不同,该签名PuSHSubscriptionInterface位于PuSHSubscriber.php的底部.

public function __construct(
    $domain, $subscriber_id, $hub, 
    $topic, $secret, $status = '', 
    $callback_url, $verify_token, $lease_time='');
Run Code Online (Sandbox Code Playgroud)

而你的是

public function __construct(
    $domain, $subscriber_id, $hub, 
    $topic, $secret, $status = '', 
    $callback_url, $verify_token, $lease_time)
Run Code Online (Sandbox Code Playgroud)

你做了最后一个论证.PHP手册中的注释清楚地说:

实现接口的类必须使用与接口中定义的完全相同的方法签名.不这样做会导致致命错误.

接口的重点是合同.实现此合同的类可能不会更改接口定义的方法签名,因为这会破坏合同并破坏接口的用途.

当界面IFoo说你应该有

public function fn($arg1, $arg2, $arg3 = NULL);
Run Code Online (Sandbox Code Playgroud)

然后每个IFoo实现的类都必须实现接口中定义的方法.