4

どうやってこのアイデアを頭の中で思いついたのかはわかりませんが、何らかの理由でこれは可能だと思いました。明らかにテスト後は機能しませんが、機能させる方法はありますか? $value1 に何も入力せずに $value2 を設定したい。

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
4

8 に答える 8

8

あなたが望むように完全に可能ではありません。

単に、

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
}
于 2012-04-16T20:19:52.280 に答える
4

あなたがやろうとしているのは「キーワード引数」または「名前付き引数」と呼ばれ、Python などの他のスクリプト言語とは対照的に、PHP では使用できません。

何百ものパラメーターを持つ関数があり、PHP に付属するものよりも柔軟なソリューションを本当に実現したい場合は、おそらくfunc_get_args()と組み合わせて、配列またはオブジェクトを使用して独自の回避策を構築できます。しかし、これは明らかに、実際のキーワード引数ほど美しくありません。

于 2012-04-16T20:27:23.180 に答える
1

単純な関数の場合、OOP にジャンプするのはおそらく非現実的です。ただし、このバリエーションの火により多くの燃料を投入するために、これは、良くも悪くも、おそらく OOP を使用できる場合です。

デフォルトの関数パラメーターは、便宜上交換するのが面倒ですが、拡張クラスの場合はそうではありません。これらは、必要に応じて変更および変更することを意図しています。

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

繰り返しになりますが、最も単純なタスクの実用的な解決策ではありませんが、コードフラグメントを自由に変更できるようになります。このスタイルを利用するためにコードを書き直すことができるかどうかを再考してください。

于 2012-04-16T20:31:49.717 に答える
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);
于 2012-04-16T20:22:50.043 に答える
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);
于 2012-04-16T20:28:46.300 に答える
0

私の知る限り、引数の値を好きなように変更することはできません。マニュアルには、これは無効であるとさえ書かれています (http://php.net/manual/en/functions.arguments.php#example-153)。

あなたがしていることtest($value2 = 3);は、最初に新しい変数に 3 の値を代入し、$value2それを の最初のパラメーターとして送信することですtest

ただし、null パラメーターを送信すると値が割り当てられる関数を作成できます。

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
于 2012-04-16T20:24:23.607 に答える
-1

デフォルト値を持たない引数の後に、デフォルト値を持つ引数を配置することは悪い習慣と見なされます。その理由は、一連のコンマを含む関数を単純に記述することは許可されていないためです。

あなたの場合、両方のパラメーターに値を渡す必要があります。値が null であっても。

于 2012-04-16T20:20:02.703 に答える
-1

多分これはあなたが探しているものです:

    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
于 2012-04-16T20:22:10.740 に答える