Вопрос по php – PHP - вызов функций с несколькими переменными

1

Это кажется основным вопросом, который я знаю, но я не смог найти ответ.

Предположим, что основная функция:

function basicFunction ( $var1, $var2 = 1, $var3 = 2, $var4 = 5 )
{
// Do some stuff
// Return
}

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

$var1 = 0

$var2 = 1

$var3 = 2

$var4 = 3

Я могу сделать это:

$someResult = basicFunction( 0, 1, 2, 3 );

$var2 а также$var3 хотя уже установлены, так как бы я вызвал функцию без необходимости повторять значение для$var2 а также$var3?

это не решение его проблемы user1432124
Это не будет гибким для использования user1432124
@Somebodyisintrouble: Почему это не решение? marco-fiset
Вы перемещаете $ var2 и $ var3 вправо и вызываете basicFunction (0, 3). Держите необязательные параметры на правом конце. mert
повторяющийся вопросstackoverflow.com/questions/1620737/…, без ответа Shehzad Bilal

Ваш Ответ

9   ответов
0

Я только что написал эту функцию, которая позволяет вам вызывать функцию с помощью ассоциативного массива. Я только протестировал его на скалярных типах, но он должен нормально работать для функций, которые принимаютints, floats, strings, а такжеbooleans, Я написал это довольно быстро, и это определенно можно улучшить несколькими способами:

function call_user_func_assoc($function, $array){
    $matches = array();
    $result = array();
    $length = preg_match_all('/Parameter #(\d+) \[ <(required|optional)> \$(\w+)(?: = (.*))? ]/', new ReflectionFunction($function), $matches);

    for($i = 0; $i < $length; $i++){
        if(isset($array[$matches[3][$i]]))
            $result[$i] = $array[$matches[3][$i]];
        else if($matches[2][$i] == 'optional')
            $result[$i] = eval('return ' . $matches[4][$i] . ';');
        else
            throw new ErrorException('Missing required parameter: $' . $matches[3][$i]);         
    }

    call_user_func_array($function, $result);
}

Вы можете использовать это так:

function basicFunction($var1, $var2 = "default string", $var3 = 2, $var4 = 5){
    var_dump(func_get_args());
}

call_user_func_assoc('basicFunction', array('var1' => "Bob", 'var4' => 30));

Какие выводы:

array(4) {
  [0]=>
  string(3) "Bob"
  [1]=>
  string(14) "default string"
  [2]=>
  int(2)
  [3]=>
  int(30)
}
-1

Как я уже упоминал в комментарии выше, вы всегда должны держать необязательные переменные справа, потому что аргументы php оцениваются слева направо. Тем не менее, для этого случая вы можете сделать несколько трюков, чтобы избавиться от дублирующихся значений следующим образом:

$var2 = 1, $var3 = 2, $var4 = 5;
function basicFunction($var1, $var2 = null, $var3 = null, $var4 = null) {
    if($var2 === null)
        $var2 = $GLOBALS["var2"];
    if($var3 === null)
        $var3 = $GLOBALS["var3"];
    if($var4 === null)
        $var4 = $GLOBALS["var4"];
}

Тем не менее, вам лучше решить эту ситуацию, разумно переместив свои аргументы.

0

Вам нужно поставить$var2 а также$var3 в конце списка параметров

function basicFunction ( $var1, $var4 = 5, $var2 = 1, $var3 = 2)

Теперь вы можете позвонить:

basicFunction( 0, 3);

В противном случае вам придется указать все параметры. При вызове функций необходимо указывать все параметры слева направо. Единственный раз, когда вы можете опустить параметры:

  1. If the parameter you want to omit has a default value.
  2. All of the parameters to the right of the current parameter have default values.
0

Вы когда-нибудь думали о передаче переменных в виде массива? В этом случае вы включаете только переменные, которые нужно обновить

function basicFunction ( $arrayvar ){
    $arrayvar['var1']...

Обновление: также вы можете использоватьfunc_get_args()-функция, которая работает какпервая особенность здесь

0

<?php
function my_function(
    $id,
    $start = 0,
    $limit = 10,
    $filter = false,
    $include_duplicates => false,
    $optimize_fetch => false,
    $cache = false
) {
    if (is_array($id)) extract($id, EXTR_IF_EXISTS);

    /* ... */
}

А потом

<?php
my_function(array('id' => 1, 'cache' => true));

Источник:http://www.marco.org/2008/11/11/faking-named-parameters-in-php

0

К сожалению, я не думаю, что php работает так.
Если вы меняете$var4 Вы должны включить$var2 а также$var3 потому что они приходят раньше$var4 в объявлении функции.

Вы можете передать массив функции со значениями по умолчанию и изменить только$var4 значение или измените порядок, как предложил ник.

http://www.php.net/manual/en/functions.arguments.php#functions.arguments.default

Любой способ указать необязательные значения параметров в PHP?

0

Более чистый код 4 у вас (работает на 100%, php> 5.3), работает с классами и функциями.

  function call_user_func_assoc($function, $array){
    if ((is_string($function)) && (count(explode('::',$function))>1))
        $function = explode('::',$function);

    $func = ((is_array($function)) || (count($function)>1)) ? new ReflectionMethod($function[0], $function[1]) : new ReflectionFunction($function);

    foreach($func->getParameters() as $key => $param) {
        if (isset($array[$key]))
            $result[$key] = $array[$key];
        elseif(isset($array[$param->name]))
            $result[$key] = $array[$param->name];
        else
            $result[$key] = $param->getDefaultValue();
    }
    return call_user_func_array($function, $result);
}
-1

чтобы пропустить значения попробуйте вот так

     $someResult = basicFunction( 0, 0, 0, 3 ); 

или если у вас установлены значения, то

       // passing values stored in var2,var3

       $var1 = 1;
       $var2 = 2;

    $someResult = basicFunction( 0, $var1, $var2, 3 );
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
4

PHP не поддерживает перегрузку. Следовательно, вы не можете их пропустить каким-либо образом, если не перемещаете их в правую часть списка аргументов.

Распространенным решением является установка значения по умолчанию другого типа, чем ожидалось (то есть NULL). Фактическое значение по умолчанию затем устанавливается внутри функции. Этот подход не совсем чистый и требует дополнительных строк кода, но если ситуация требует этого, вы можете пойти с этим:

function basicFunction($var1, $var2 = NULL, $var3 = NULL, $var4 = NULL) {
    if ($var2 === NULL) {
        $var2 = 1;
    }

    // ...

Похожие вопросы