аргументы функции php


Я не знаю, как и где мне пришла в голову эта идея, но почему-то я думал, что это возможно. Очевидно, что после тестирования он не работает, но есть ли способ заставить его работать? Я хочу установить $value2 без необходимости вводить что-либо вообще для $value1.

function test($value1 = 1, $value2 = 2) {

echo 'Value 1: '.$value1.'<br />';
echo 'Value 2: '.$value2.'<br />';

}

test($value2 = 3);

// output
Value 1: 3
Value 2: 2
8 4

8 ответов:

То, что вы пытаетесь сделать, называется "аргументы ключевых слов" или "именованные аргументы" и недоступно в PHP в отличие от других скриптовых языков, таких как Python.

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

Это не совсем возможно так, как вы хотите.

Просто,

function test($value1 = null, $value2 = 2) {

echo 'Value 1: '.$value1.'<br />';
echo 'Value 2: '.$value2.'<br />';

}

test(NULL, $value2 = 3);

Или используйте массив в качестве параметров

function test($array) {

if(isset($array['value1'])) echo 'Value 1: '.$array['value1'].'<br />';
if(isset($array['value2'])) echo 'Value 2: '.$array['value2'].'<br />';

}

test(array('value2' => 3));

Обновление:

Моя очередная попытка

function test() {
  $args = func_get_args();
  $count = count($args);
  if($count==1) { test1Arg($args[0]); }
  elseif($count == 2) { test2Arg($args[0],$args[1]); }
  else { //void; }
}

function test1Arg($arg1) {
   //Do something for only one argument
}
function test2Arg($arg1,$arg2) {
   //Do something for two args
}

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

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

class test {
    var $value1 = 1;
    var $value2 = 2;

    function __construct() {
        printf( "Value 1 = %s, value 2 = %s\n", $this->value1, $this->value2 );
    }
}

class test2 extends test {
    var $value2 = 42;
}

$me = new test();   // outputs Value 1 = 1, value 2 = 2
$me2 = new test2(); // outputs Value 1 = 1, value 2 = 42

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

Считается плохой практикой, когда аргументы со значениями по умолчанию идут после args, которые этого не делают. причина в том, что его не позволяют просто написать функцию с кучей запятых в нем.

В вашем случае вы должны передать значение обоим параметрам. Даже если значение равно нулю.

function test($value1 = null, $value2 = null) {
  $value1 = $value1 ?: 1;
  $value2 = $value2 ?: 2;
  echo 'Value 1: '.$value1.'<br />';
  echo 'Value 2: '.$value2.'<br />';
}

test(null, 3);

AFAIK, вы не можете изменить значения аргументов так, как вы этого хотите. В руководстве даже говорится, что это недопустимо (http://php.net/manual/en/functions.arguments.php#example-153).

То, что вы делаете сtest($value2 = 3);, сначала присваивает новой переменной $value2 значение 3, а затем отправляет его в качестве первого параметра test.

Однако можно создать функцию, в которой при отправке нулевого параметра ему присваивается значение:

function test($value1 = NULL, $value2 = 2) {

    if ($value1 === NULL)
        $value1 = 1 // $value1 default value

    echo 'Value 1: '.$value1.'<br />';
    echo 'Value 2: '.$value2.'<br />';

}

test(NULL, 3);

// output
Value 1: 1
Value 2: 3

Или хорошо, измените значение по умолчанию значения переменных:

function test($value2 = 2, $value1 = 1) {

    echo 'Value 1: '.$value1.'<br />';
    echo 'Value 2: '.$value2.'<br />';

}

test(3);

// output
Value 1: 1
Value 2: 3

Это невозможно в PHP, как бы удобно это ни было, но есть несколько способов обойти это.

function func($val1=null, $val2=null) {
    // Set default values.
    if (!$val1) $val1 = 1;
    if (!$val2) $val2 = 2;
    // Your code here.
}

func(null, 74); // Uses the default value of 1 for $val1.

Или используйте массив (намного удобнее, если у вас очень длинный список аргументов):

function func($arr) {
    // Set default values.
    $val1 = isset($arr[1]) ? $arr[1] : 1;
    $val2 = isset($arr[2]) ? $arr[2] : 2;
    // Your code here.
}

func(array(2 => 74)); // Uses the default value of 1 for $val1.

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

$val1 = Core::val($arr, 1, 1); // array, key, default
$val2 = Core::val($arr, 2, 2);

Может быть, это то, что вы ищете:

    function test($value1, $value2) 
    {

      if ($value1!="") 
      {
         echo 'Value 1: '.$value1.'<br />'; 
      }
      else
      {
         echo 'Value 1: 3'<br />'; 
      }
      echo 'Value 2: '.$value2.'<br />';

    }

    test("", $value2 = 3);

    // output
    Value 1: 3
    Value 2: 2