PHP - Каков наилучший способ обработки пустых аргументов функций / методов? - PullRequest
0 голосов
/ 07 мая 2018

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

Например, в следующем примере, если я хочу просто установить категорию при вызове функции, мне нужно будет использовать:

$data = $class->get_top_headlines( null, 'technology' );

Есть ли способ вызова функции более эффективно? Я знаю, что вместо этого могу передать аргументы в виде массива, но просто подумал, есть ли способ сделать что-то вроде:

$data = $class->get_top_headlines( $category='technology' ); и автоматически оставляя другие аргументы в качестве значения по умолчанию null?

public function get_top_headlines( $query=null, $category=null, $country=null, $sources=null, $page_size=null, $page=null ){
    $url = $this->api_url . $this->endpoint_top_headlines;
    $params = array();
    if ( $query !== null ){
        $params['q'] = urlencode( $query );
    }
    if ( $category !== null ){
        $params['category'] = $category;
    }
    if ( $country !== null ){
        $params['country'] = $country;
    }
    if ( $sources !== null ){
        $params['sources'] = $sources;
    }
    if ( $page_size !== null ){
        $params['pageSize'] = $page_size;
    }
    if ( $page !== null ){
        $params['page'] = $page;
    }
    $params['apiKey'] = $this->api_key;

    $url_query = http_build_query( $params );
    $url = $url . '?' . $url_query;
    echo $url;
    $obj = $this->get_response( $url );
    return $obj;
}

Ответы [ 3 ]

0 голосов
/ 07 мая 2018

Я думаю

(null, 'technology' );

может быть менее актуальным, но другое решение может заключаться в использовании ООП. Вы сказали, что это уже метод класса, поэтому вы можете сделать что-то вроде:

$obj = new thatClass;
$obj->technology = $technology;
$obj->get_top_headlines();

в классе:

Class thatClass{
   $technology = null;
   $category = null;
   $query = null;
   //...
   public function get_top_headlines(){
    if ( $this->query !== null ){
        $params['q'] = urlencode( $this->query );
    }
    if ( $this->category !== null ){
        $params['category'] = $this->category;
    }
    if ( $this->technology !== null ){
        $params['technology'] = $this->technology;
    }
    //method code..
   }
   //class code..
}

Проблема с этим подходом заключается в том, что если вам нужно снова вызывать ту же функцию, передавая другой параметр в том же экземпляре класса, в зависимости от вашего приложения вам может потребоваться вручную сбросить в ноль предыдущий параметр (теперь атрибут объекта)

0 голосов
/ 07 мая 2018

Я бы решил эту проблему, создав новый класс или структуру данных, которая будет инкапсулировать всю логику проверки и генерации URL, а затем использовать ее везде, где мне это нужно.

Вот пример класса.

class HeadLineParameters
{
    private $params = [];

    public function setQuery($query)
    {
        // validate/transform query data
        $this->params['q'] = urlencode($query);
        return $this;
    }

    public function setCategory($category)
    {
        // validate/transform category data
        $this->params['category'] = $category;
        return $this;
    }

    public function generateUrl()
    {
        return http_build_query( $this->params );
    }
}

$params = new HeadLineParameters;
$params->setQuery($query)
    ->setCategory($category);

Вы просто передаете один аргумент и знаете, что это просто экземпляр HeadLineParameters.

$class->get_top_headlines($params);

Это решение не загрязняет ваш текущий класс ненужными состояниями или полями. Это легко проверить, и у него есть только одна работа. Вы можете легко расширять его, устанавливать значения по умолчанию, вы также можете проверять его по своему усмотрению.

Редактировать: Почему вы не должны добавлять больше полей в текущий класс?

Если вы добавите больше полей в ваш текущий класс, вы нарушите принцип единой ответственности, и любой метод этого класса также может изменить эти поля. Это не должно быть проблемой, если эти поля действительно принадлежат там, и для них требуется больше методов. Это нормально, если вы используете ООП.

Я не уверен, что другие люди думают о передаче связанных массивов в функции, но с ними трудно справиться, если у вас нет доступной документации. У меня были проблемы с ними при чтении какого-либо внешнего кода, и большую часть времени я не был уверен, с какими данными я имел дело.

0 голосов
/ 07 мая 2018

Попробуйте передать массив, а затем использовать array_merge

$data = $class->get_top_headlines(['category' => 'technology']);

Затем в вашей функции есть массив значений по умолчанию, затем выполните слияние.

$settings = array_merge($settings, $passedInArray);

http://php.net/manual/en/function.array-merge.php

...