Php Class 的重载函数问题

Php overloading function issue with Class

我有一个名为 class 的 ClientPolicy,它是这样的

    class ClientPolicy {
    var $serverHost="www.example.com";
    var $httpPort = 80;
    var $httpsPort = 443;
    var $appKey;
    var $secKey;
    var $defaultContentCharset = "UTF-8";
}

和另一个 class 文件名 SyncAPIClient 看起来像这样

class SyncAPIClient{

    function SyncAPIClient(ClientPolicy $clientPolicy) {
        $this->clientPolicy = $clientPolicy;
    }

     function SyncAPIClient($appKey, $appSecret) {
        $this->clientPolicy = new ClientPolicy();
        $this->clientPolicy->appKey=$appKey;
        $this->clientPolicy->secKey=$appSecret;
    }

}

我的问题是

1.) 如果检查 SyncAPIClient 中的函数,您会注意到 ClientPolicy class 作为参数在变量之前传递,这到底是什么意思?在函数参数中传递一个class的本质是什么?

2.) 我的脚本日志中出现错误 "Cannot redeclare SyncAPIClient::SyncAPIClient()",原因是 SyncAPIClient 函数在 SyncAPIClient class 中被调用了两次。我该如何解决这个问题?有没有更好的方法来编写这个 SyncAPIClient 函数而不是传递它两次?

找不到此脚本的作者,只能由我来修复它。

1) 这里传递给这个函数的 $clientPolicy 变量需要是一个 ClientPolicy 实例。

这样,如果传递的参数与ClientPoliceclass的实例不同,就会产生错误。

function SyncAPIClient(ClientPolicy $clientPolicy) {
    $this->clientPolicy = $clientPolicy;
}

https://wiki.php.net/rfc/typed_properties_v2 https://laravel-news.com/php7-typed-properties

2) 错误Cannot redeclare SyncAPIClient::SyncAPIClient() 是因为您试图声明两个名为SyncAPIClient () 的函数。

如果在第一个 SyncAPIClient() 方法中你只想将 $clientPolicy 保存在 $this->clientPolicy 中,你可以使用魔术方法 __construct。或者只是尝试更改其中一个函数的名称,问题应该是问题。

class SyncAPIClient{

    __construct(ClientPolicy $clientPolicy) {
        $this->clientPolicy = $clientPolicy;
    }

     function SyncAPIClient($appKey, $appSecret) {
        $this->clientPolicy = new ClientPolicy();
        $this->clientPolicy->appKey=$appKey;
        $this->clientPolicy->secKey=$appSecret;
    }

}

https://www.php.net/manual/en/language.oop5.decon.php http://www.zentut.com/php-tutorial/php-constructor-and-destructor/

希望对您有所帮助!

我会像这样修复您的代码:

class SyncAPIClient
{
    private $clientPolicy = null;

    function SyncAPIClient(ClientPolicy $clientPolicy = null) 
    {
        if($clientPolicy instanceof ClientPolicy){
            $this->clientPolicy = $clientPolicy;
        }else{
            $this->clientPolicy = new ClientPolicy();
        }
    }

    public function setAuthParams($appKey, $appSecret) {
        $this->clientPolicy->appKey=$appKey;
        $this->clientPolicy->secKey=$appSecret;
    }   
}

这样你就可以实例化一个 SyncAPIClient 带或不带 ClientPolicy

没有ClientPolicy:

$syncAPI = new SyncAPIClient();
$syncAPI->setAuthParams($apiKey, $apiSecret);

ClientPolicy:

$clientPolicy = new ClientPolicy();
$clientPolicy->appKey=$appKey;
$clientPolicy->secKey=$appSecret;
$syncAPI = new SyncAPIClient($clientPolicy);

当使用 class 和功能组合时

Rtin::

嵌套在 class Rtin 中的函数的名称应该与 class 名称不同 所以你不应该有叫做 rtin 的函数 但是,您可以使用名称

从 class 外部调用函数

根据您的错误可能是由于:

您嵌套在 class 中的函数或 class 之外的函数在脚本本身之外有一个副本。就像在包含的 function.php 文件中提到的函数以及在脚本本身中也提到的一样,所以 php 感到困惑,因为函数名称同时写在两个 php 文件中

class

的例子
class Rtin{

private $data;
private $results;

public function getResultsType(){
    return ........
}
}

调用 class 使用

$q = Rtin::getResultsType($data['name']);

在你的例子中。使其适应我提供的示例并查看包含的文件以查找重复功能。