2012-04-16 2 views
3

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

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 
+0

Невозможно. Вы действительно хотите этого поведения, переключите args 1 и 2 в подписи. –

+0

Да, вы ищете аргументы ключевых слов, которые недоступны в PHP, но, например, в Python. –

+0

Возможный дубликат [PHP Использование аргументов по умолчанию в функции] (http://stackoverflow.com/questions/9166914/php-using-default-arguments-in-a-function) –

ответ

4

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

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

7

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

Просто

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)); 

Update:

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

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 
} 
+1

OP знает об этом решении: «Я хочу установить $ value2 без необходимости вводить что-либо вообще для $ value1». –

+0

+1 для усилия, но массив как решение параметра уходит из сути проблемы, на мой взгляд – Kristian

+2

'test (NULL, $ value2 = 3);' приводит к нежелательному поведению как '$ value2 = 'делает что-то совершенно отличное от того, что OP хочет делать, и вводит в заблуждение при чтении. –

0

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

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

-1

Может быть, это то, что у ¨R ищет:

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 
+0

Насколько я могу судить, ОП осознает это решение, поэтому я не думаю, что это то, что он хочет (он не хочет передавать значение vor $ value1 AT ALL, что абсолютно имеет смысл, если у вас есть куча аргументов.) –

+0

Rami, спасибо за комментарий, но нет более простого способа. К сожалению, аргумент для value1 ДОЛЖЕН быть приведен. – dimmat

+0

Да, но я был уверен, что ОП уже знает, что –

0
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); 
+1

Насколько я вижу, ОП осознает это решение, поэтому я не думаю, что это то, что он хочет. –

+0

Спасибо за ваш намек, но это так, как работает, даже если OP не нравится. – KingCrunch

+0

Но это не то, что вы хотите, если у вас есть функция с пятнадцатью аргументами. См. Мой ответ, Starx или TRiG. Думаю, в этом случае массив является лучшим решением. –

0

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 
0

Это невозможно в 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); 
1

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

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

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 

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

Смежные вопросы