📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
| (同じ利用者による、間の2版が非表示) | |||
| 140行目: | 140行目: | ||
なお、引数とは異なり、戻り値として指定できる値は1つのみである。<br> | なお、引数とは異なり、戻り値として指定できる値は1つのみである。<br> | ||
ただし、戻り値として配列も指定できるため、配列を返すことで実質的に複数の値を返すことも可能である。<br> | ただし、戻り値として配列も指定できるため、配列を返すことで実質的に複数の値を返すことも可能である。<br> | ||
<br><br> | |||
== 可変長引数 == | |||
可変長引数を持つ関数を定義することができる。<br> | |||
<br> | |||
可変長引数は配列として関数内で扱われる。<br> | |||
<u>通常の引数と組み合わせる場合、可変長引数は必ず最後に定義する必要がある。</u><br> | |||
<br> | |||
これには、主に2つの方法がある。<br> | |||
* <code>...</code> (スプラット演算子 / 可変引数演算子) を使用する方法 (PHP 5.6以降) | |||
*: ...演算子を使用する方法が推奨される。 | |||
* <code>func_get_args</code>関数を使用する方法 (従来の方法) | |||
<br> | |||
また、型宣言も使用可能である。<br> | |||
<syntaxhighlight lang="php"> | |||
// 型宣言の例 | |||
function sum(int ...$numbers) | |||
</syntaxhighlight> | |||
<br> | |||
* ...演算子を使用する場合 | |||
<syntaxhighlight lang="php"> | |||
function sum(...$numbers) | |||
{ | |||
$total = 0; | |||
foreach ($numbers as $number) { | |||
$total += $number; | |||
} | |||
return $total; | |||
} | |||
// 使用例 | |||
echo sum(1, 2, 3, 4, 5); // 出力: 15 | |||
echo sum(10, 20); // 出力: 30 | |||
</syntaxhighlight> | |||
<br> | |||
* func_get_args関数を使用する場合 | |||
<syntaxhighlight lang="php"> | |||
function multiply() | |||
{ | |||
$numbers = func_get_args(); | |||
$result = 1; | |||
foreach ($numbers as $number) { | |||
$result *= $number; | |||
} | |||
return $result; | |||
} | |||
// 使用例 | |||
echo multiply(2, 3, 4); // 出力: 24 | |||
echo multiply(5, 10); // 出力: 50 | |||
</syntaxhighlight> | |||
<br> | |||
また、通常の引数と可変長引数を組み合わせることもできる。<br> | |||
<syntaxhighlight lang="php"> | |||
function greet($greeting, ...$names) | |||
{ | |||
foreach ($names as $name) { | |||
echo "$greeting, $name!\n"; | |||
} | |||
} | |||
// 使用例 | |||
greet("Hello", "Alice", "Bob", "Charlie"); | |||
// 出力 | |||
Hello, Alice! | |||
Hello, Bob! | |||
Hello, Charlie! | |||
</syntaxhighlight> | |||
<br><br> | |||
== グローバル変数の使用 == | |||
PHPのスコープルールにおいて、グローバルスコープで定義された変数は、関数の内部からは自動的にはアクセスできない。<br> | |||
これはPHPの<u>変数スコープの分離</u>という特徴によるものである。<br> | |||
<br> | |||
関数内でグローバル変数を使用する場合は、以下に示すいずれかの方法を使用する必要がある。<br> | |||
* globalキーワードを使用する方法 | |||
<syntaxhighlight lang="php"> | |||
$hoge = 1; | |||
function func1() | |||
{ | |||
global $hoge; // グローバル変数を関数内で使用することを宣言 | |||
echo "$hoge"; | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
* $GLOBALS配列を使用する方法 | |||
<syntaxhighlight lang="php"> | |||
$hoge = 1; | |||
function func1() | |||
{ | |||
echo "$GLOBALS['hoge']"; | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
<u>※注意</u><br> | |||
<u>グローバル変数の使用は避け、代わりに引数として値を渡すことが推奨される。</u><br> | |||
<u>これにより、関数の依存関係が明確になり、テストや保守が容易になる。</u><br> | |||
<u>ソースコードの予測可能性と再利用性も向上する。</u><br> | |||
<br><br> | |||
== 参照渡し == | |||
参照渡しとは、変数のメモリアドレスを直接渡すことにより、関数内で値を変更すると呼び出し元の変数の値も変更される仕組みである。<br> | |||
<br> | |||
関数の引数の前に&を付加することにより参照渡しになる。<br> | |||
<br> | |||
* 特に大きな配列やオブジェクトを扱う場合、メモリ使用量を節約できる場合がある。 | |||
* 複数の値を同時に変更する場合に便利である。 | |||
<br> | |||
<syntaxhighlight lang="php"> | |||
// 参照渡し | |||
function addFiveByRef(&$num) | |||
{ | |||
$num += 5; | |||
} | |||
$value = 10; | |||
addFiveByRef($value); | |||
echo $value; // 15 (元の値が変更される) | |||
</syntaxhighlight> | |||
<br> | |||
<syntaxhighlight lang="php"> | |||
// 配列の要素を全て2倍にする関数 | |||
function doubleArrayValues(&$arr) | |||
{ | |||
foreach ($arr as &$value) { | |||
$value *= 2; | |||
} | |||
} | |||
$numbers = [1, 2, 3, 4, 5]; | |||
doubleArrayValues($numbers); | |||
print_r($numbers); // [2, 4, 6, 8, 10] | |||
</syntaxhighlight> | |||
<br> | |||
参照渡しは、以下に示すような場合に使用することを推奨する。<br> | |||
* 大きなデータ構造を扱う時のパフォーマンス最適化 | |||
* 複数の値を同時に変更する必要がある時 | |||
* オブジェクトのメソッドチェーンを実装する時 | |||
<br><br> | <br><br> | ||