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 实例。
这样,如果传递的参数与ClientPolice
class的实例不同,就会产生错误。
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']);
在你的例子中。使其适应我提供的示例并查看包含的文件以查找重复功能。
我有一个名为 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 实例。
这样,如果传递的参数与ClientPolice
class的实例不同,就会产生错误。
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']);
在你的例子中。使其适应我提供的示例并查看包含的文件以查找重复功能。