названные дополнительные аргументы PHP?

Это будет работать, даже если у Вас будет две или больше строки для каждого home с равным DATETIME:

SELECT id, home, datetime, player, resource
FROM   (
       SELECT (
              SELECT  id
              FROM    topten ti
              WHERE   ti.home = t1.home
              ORDER BY
                      ti.datetime DESC
              LIMIT 1
              ) lid
       FROM   (
              SELECT  DISTINCT home
              FROM    topten
              ) t1
       ) ro, topten t2
WHERE  t2.id = ro.lid
21
задан Stefano Borini 27 August 2009 в 18:26
поделиться

4 ответа

Нет, это невозможно: если вы хотите передать третий параметр, вы должны передать второй. И именованные параметры тоже невозможны.


"Решение" было бы использовать только один параметр, массив, и всегда передавать его ... Но не всегда определяйте в нем все.

Например:

function foo($params) {
    var_dump($params);
}

И назвав его так:

foo(array(
    'a' => 'hello',
));

foo(array(
    'a' => 'hello',
    'c' => 'glop',
));

foo(array(
    'a' => 'hello',
    'test' => 'another one',
));

Вы получите следующий результат:

array
  'a' => string 'hello' (length=5)

array
  'a' => string 'hello' (length=5)
  'c' => string 'glop' (length=4)

array
  'a' => string 'hello' (length=5)
  'test' => string 'another one' (length=11)

Но мне не очень нравится это решение:

  • Вы потеряете phpdoc
  • Ваша IDE не сможет предоставить никаких намек больше ... Что плохо

Так что я '

21
ответ дан 29 November 2019 в 20:48
поделиться

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

foo("hello", NULL, "bar");
2
ответ дан 29 November 2019 в 20:48
поделиться

Нет, это не так.

Единственный способ добиться этого - использовать массивы с именованными ключами и т.п.

3
ответ дан 29 November 2019 в 20:48
поделиться

Это не совсем красиво, но некоторые могут сказать, что это помогает.

class NamedArguments {

    static function init($args) {
        $assoc = reset($args);
        if (is_array($assoc)) {
            $diff = array_diff(array_keys($assoc), array_keys($args));
            if (empty($diff)) return $assoc;
            trigger_error('Invalid parameters: '.join(',',$diff), E_USER_ERROR);
        }
        return array();
    }

}

class Test {

    public static function foobar($required, $optional1 = '', $optional2 = '') {
        extract(NamedArguments::init(get_defined_vars()));
        printf("required: %s, optional1: %s, optional2: %s\n", $required, $optional1, $optional2);
    }

}

Test::foobar("required", "optional1", "optional2");
Test::foobar(array(
    'required' => 'required', 
    'optional1' => 'optional1', 
    'optional2' => 'optional2'
    ));
1
ответ дан 29 November 2019 в 20:48
поделиться
Другие вопросы по тегам:

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