Как избежать действительно длинного списка параметров функции в PHP? - PullRequest
0 голосов
/ 11 октября 2018

Моя проблема в том, что у меня много функций с ОЧЕНЬ длинными списками параметров функций, таких как этот:

function select_items($con,$type,$id_item,$item_timestamp,$item_source_url,$item_type,$item_status,$item_blogged_status,$item_viewcount,$item_language,$item_difficulty,$item_sharecount,$item_pincount,$item_commentcount,$item_mainpage,$item_image_width,$item_image_height,$item_image_color,$item_modtime,$order,$start,$limit,$keyword,$language,$id_author,$id_sub_category,$id_category,$id_tag,$id_user){ ... }

Как вы можете видеть, он очень длинный и (конечно) очень сложный в обслуживании.Иногда мне нужны все переменные для построения сверхсложного SQL-запроса, но иногда я просто использую 1 или 2 из них.Есть ли способ избежать этого колоссального списка параметров?Например, с каким-то строгим / специальным соглашением об именах?

Так что в основном мне нужно что-то вроде этого:

$strictly_the_same_param_name="It's working!";

echo hello($strictly_the_same_param_name);


function hello()  //<- no, or flexible list of variables
{
     return $strictly_the_same_param_name; // but still able to recognize the incoming value        
}

// outputs: It's working! 

Я думал об использовании $ _GLOBALs / global или $ _SESSIONs для решения этой проблемы, но мне это не кажется профессиональным.Либо это?

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Для первого шага, как вы сказали, иногда вам нужно вызывать функцию только с 2 аргументами, вы можете установить значения по умолчанию для ваших аргументов в объявлении вашей функции.Это позволит вам вызывать вашу функцию только с 2 аргументами из 25.

Например:

function foo($mandatory_arg1, $optional_arg = null, $opt_arg2 = "blog_post") {
    // do something
}

На втором шаге вы можете использовать, и особенно для этого случая, массивы, это будет намного проще:

function foo(Array $params) {
    // then here test your keys / values
}

На третьем шаге вы также можете использовать Списки аргументов переменной длины (поиск на странице "..."):

function sum(...$numbers) {
    $acc = 0;
    foreach ($numbers as $n) {
        $acc += $n;
    }
    return $acc;
}

Но, в конечном счете, я думаю, что вы должны использовать объекты для обработки таких вещей;)

0 голосов
/ 11 октября 2018

Вы можете попробовать использовать ... токен:

$strictly_the_same_param_name= ["It's working!"];

echo hello($strictly_the_same_param_name);


function hello(...$args)  //<- no, or flexible list of variables
{
    if ( is_array( $args ) {
    $key = array_search( 'What you need', $args );
         if ( $key !== false ) {
             return $args[$key];
         }
    }
    return 'Default value or something else';
}
...