Какой-либо способ определить дополнительные значения параметров в PHP?

Вы могли бы также рассмотреть базовые графики R, которые я нахожу немного более простыми.

par(mar=c(5, 5, 4, 5) + 0.1)                                   # adjust plot margins
b <- barplot(Pyay$Mean.monthly.discharge, col="blue",          # plots and saves x-coordinates
             ylim=c(0, 90),
             ylab=expression(Q/(m^{3})))
lines(b, Pyay$Mean.suspended.sediment.load, col="red", lwd=2)  # use x-coordinates here
axis(1, b, labels=Pyay$Month)
axis(4, seq(0, 90, 20), labels=, seq(0, 90, 20))
mtext(expression(Suspended~sediment~load~(10^{6}~t)), 4, 3)
legend("topleft", legend=c("discharge", "SSL"), pch=c(15, NA),
       pt.cex=2, lty=c(0, 1), col=c("blue", "red"))
box()

Дает enter image description here

Данные

Pyay <- structure(list(Month = c("Jan", "Feb", "Mar", "Apr", "May", "Jun", 
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"), Mean.monthly.discharge = c(8.528, 
6.316, 7, 8.635, 12.184, 30.414, 70.753, 79.255, 67.079, 53.677, 
22.937, 12.409), Mean.monthly.max.temperature = c(32.2, 35.1, 
37.6, 38.7, 36, 31.9, 31, 31, 32.3, 33.5, 32.7, 31.5), Mean.suspended.sediment.load = c(3.407, 
2.319, 2.587, 3.573, 5.785, 21.811, 70.175, 81.873, 65.798, 47.404, 
14.468, 5.842), Max.monthly.rainfall = c(1.5, 0.9, 5.1, 27.3, 
145.1, 234.8, 198, 227.5, 205.7, 124, 56, 1.5), Mean.monthly.minimum.temperature = c(16.2, 
17.8, 21.2, 24.7, 25.6, 24.8, 24.8, 24.7, 24.6, 24.2, 21.7, 18.1
)), row.names = c(NA, -12L), class = "data.frame")

21
задан zaczap 27 March 2009 в 17:00
поделиться

8 ответов

PHP не поддерживает названные параметры для функций по сути. Однако существуют некоторые способы обойти это:

  1. Используйте массив в качестве единственного аргумента в пользу функции. Затем можно вытянуть значения от массива. Это допускает использование параметров, передаваемых по имени в массиве.
  2. Если Вы хотите позволить дополнительное количество аргументов в зависимости от контекста, то можно использовать func_num_args и func_get_args вместо того, чтобы указать допустимые параметры в функциональном определении. Затем на основе количества аргументов, длин строки, и т.д. можно определить, что сделать.
  3. Передайте нулевое значение любому аргументу, который Вы не хотите указывать. Едва ли обходя его, но он работает.
  4. Если Вы работаете в контексте объекта, то можно использовать волшебный метод __ вызов () для обработки этих типов запросов так, чтобы можно было направить к закрытым методам на основе того, какие аргументы были переданы.
32
ответ дан 29 November 2019 в 06:19
поделиться

Вариация на метод массива, который допускает более легкую установку значений по умолчанию:

function foo($arguments) {
  $defaults = array(
    'firstName' => 'john',
    'lastName' => 'doe',
  );

  $arguments = array_merge($defaults, $arguments);

  echo $arguments['firstName'] . ' ' . $arguments['lastName'];
}

Использование:

foo(array('lastName' => 'smith')); // output: john smith
22
ответ дан 29 November 2019 в 06:19
поделиться

Вы могли осуществить рефакторинг свой код немного:

function foo($firstName = NULL, $lastName = NULL)
{
    if (is_null($firstName))
    {
        $firstName = 'john';
    }
    if (is_null($lastName ))
    {
        $lastName = 'doe';
    }

    echo $firstName . " " . $lastName;
}

foo(); // john doe
foo('bill'); // bill doe
foo(NULL,'smith'); // john smith
foo('bill','smith'); // bill smith
9
ответ дан 29 November 2019 в 06:19
поделиться

Нет нет всего лишь, Вы могли использовать массив:

function foo ($nameArray) {
    // Work out which values are missing?
    echo $nameArray['firstName'] . " " . $nameArray['lastName'];
}

foo(array('lastName'=>'smith'));
-1
ответ дан 29 November 2019 в 06:19
поделиться

Путем Вы хотите: нет.

Вы могли использовать некоторую специальную метку, как ПУСТОЙ УКАЗАТЕЛЬ, чтобы отметить, что значение не предоставляется:

function foo($firstName, $lastName = 'doe') {
    if (is_null($firstName))
        $firstName = 'john';
    echo $firstName . " " . $lastName;
}

foo(null, 'smith');
3
ответ дан 29 November 2019 в 06:19
поделиться

Нет. Обычный способ сделать это с некоторой эвристикой для определения, какой параметр подразумевался, как длина строки, ввод, и т.д.

Вообще говоря, Вы записали бы функцию для взятия параметров в порядке самых необходимых к наименее необходимому.

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

Если у Вас есть несколько дополнительных параметров, одно решение состоит в том, чтобы передать единственный параметр, который является массивом хеша:

function foo(array $params = array()) {
    echo $params['firstName'] . " " . $params['lastName'];
}

foo(array('lastName'=>'smith'));

Конечно, в этом решении нет никакой проверки, что поля массива хеша присутствуют, или записаны правильно. Это - все до Вас для проверки.

6
ответ дан 29 November 2019 в 06:19
поделиться

Печально то, что Вы пытаетесь сделать, не имеет никакого "синтаксического сахарного" способа сделать его. Они - все различные формы WTF.

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

function foo () { 
     $args = func_get_args(); 
     # $args = arguments in order 
}

Добьется цели. Попытка избегает использования его слишком много, потому что для Php это находится немного на волшебной стороне.

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

function foo(){ 
   $args = func_get_args();
   if( count($args) < 1 ){ 
       return "John Smith"; 
   }
   if( count($args) < 2 ) { 
       return "John " .$args[0];
   }
   return $args[0] . " " . $args[1];
}

Кроме того, Вы могли дополнительно эмулировать параметры стиля Perl,

function params_collect( $arglist ){ 
    $config = array();
    for( $i = 0; $i < count($arglist); $i+=2 ){ 
       $config[$i] = $config[$i+1];
    }
    return $config; 
}
function param_default( $config, $param, $default ){ 
    if( !isset( $config[$param] ) ){ 
           $config[$param] = $default;
    }
    return $config;
}

function foo(){ 
   $args = func_get_args();
   $config = params_collect( $args ); 
   $config = param_default( $config, 'firstname' , 'John' ); 
   $config = param_default( $config, 'lastname' ,  'Smith' ); 
   return $config['firstname'] . '  ' . $config['lastname'];   
}

foo( 'firstname' , 'john', 'lastname' , 'bob' ); 
foo( 'lastname' , 'bob', 'firstname', 'bob' ); 
foo( 'firstname' , 'smith'); 
foo( 'lastname', 'john' );

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

заметно, это более хорошо в Perl, потому что можно сделать просто нечто (firstname => 'Джон');

-1
ответ дан 29 November 2019 в 06:19
поделиться
Другие вопросы по тегам:

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