Проблема с перегрузкой Php в Class - PullRequest
1 голос
/ 18 апреля 2019

У меня есть вызываемый класс с именем ClientPolicy, который выглядит так

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

и имя другого файла класса 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 был передан в качестве параметра перед переменной, что это действительно означает? В чем суть передачи класса в параметре функции?

2.) Я получаю сообщение об ошибке «Невозможно повторно объявить SyncAPIClient :: SyncAPIClient ()» в моем журнале сценариев, и причина в том, что функция SyncAPIClient была вызвана дважды в классе SyncAPIClient. Как я могу решить эту проблему? Есть ли лучший способ написать эту функцию SyncAPIClient вместо того, чтобы передавать ее дважды?

Автор этого сценария нигде не найден, и мне осталось его исправить.

Ответы [ 3 ]

0 голосов
/ 18 апреля 2019

Я бы исправил код, который у тебя есть, вот так:

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);
0 голосов
/ 18 апреля 2019

При использовании класса и функций в комбинации, например

Rtin::

Функции, вложенные в этот класс Rtin должны иметь имена, отличные от имени этого класса. Поэтому у вас не должно быть функции с именем rtin. Однако вы можете вызывать функцию извнекласс с его именем

Из-за вашей ошибки может быть следствие:

функция, которую вы вложили в класс, или функция вне класса имеет дубликат вне самого скрипта.Подобно тому, как функция упоминается во включенном файле function.php, а также упоминается в самом скрипте, так что php запутывается, потому что имя функции записывается в два файла php одновременно

Пример класса

class Rtin{

private $data;
private $results;

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

Для вызова класса используйте

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

В вашем примере.Адаптируйте его к приведенному мною примеру и просмотрите включенные файлы на предмет дублирования функций.

0 голосов
/ 18 апреля 2019

1) Здесь переменная $clientPolicy, передаваемая этой функции, должна быть экземпляром ClientPolicy.

Таким образом, если передаваемый аргумент отличается от экземпляра класса ClientPolice, генерируется ошибка.

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

https://wiki.php.net/rfc/typed_properties_v2 https://laravel -news.com / php7 типизированных-свойства

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/

Надеюсь, это поможет!

...