参照渡し
CoddyのPHPジャーニー「論理とフロー」セクションの一部。レッスン 7/68。
デフォルトでは、PHPでvariableを関数に渡すと、その関数はそのvariableの値のコピーを受け取ります。つまり、関数内で行われた変更は、関数の外にある元のvariableには影響しません。
ただし、function に元の variable を直接変更させたい場合もあります。ここで参照渡しが登場します。function の定義で parameter 名の前にアンパサンド(&)を追加すると、コピーではなく実際の variable を渡すよう PHP に指示できます。
<?php
function doubleValue(&$number) {
$number = $number * 2;
}
$value = 10;
doubleValue($value);
echo $value; // 出力: 20
?>$value が 10 から 20 に変わったことに注目してください。関数から何も返していないにもかかわらずです。&$number パラメータは、元の $value 変数への直接的なリンクを作成し、関数がそれを直接変更できるようにします。
このテクニックは、functionで複数のvariableを変更する必要がある場合や、コピーすると非効率になる大規模なデータ構造を扱う場合に特に役立ちます。
チャレンジ
簡単updateInventoryという名前のfunctionをCreateし、3つのparameterをtakesようにしてください。quantity variableへのreference、addするamount、removeするamountです。このfunctionは、最初のamountを加算し、2番目のamountを減算して、元のquantityを変更する必要があります。
3つのinputs、initial quantity、addするamount、removeするamountが与えられます。3つすべてのinputsをReadし、initial quantityでvariableをCreateし、quantityをreferenceとしてaddとremoveのamountとともにupdateInventory functionをCallし、updated quantityを出力してください。
Input format: 3行 — 1行目にはinitial quantity(number)、2行目にはaddするamount(number)、3行目にはremoveするamount(number)が含まれます
Expected output: addとremoveの後のupdated quantity
自分で試してみよう
<?php
// 入力を読み取る
$initialQuantity = intval(fgets(STDIN));
$amountToAdd = intval(fgets(STDIN));
$amountToRemove = intval(fgets(STDIN));
// quantity変数を作成する
$quantity = $initialQuantity;
// TODO: 参照パラメータを取るupdateInventory関数をここに作成する
// TODO: quantityを参照渡しでupdateInventory関数を呼び出す
// 更新されたquantityを出力する
echo $quantity;
?>このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
論理とフローのすべてのレッスン
自分で練習してみよう: PHPオンラインコンパイラ