関数(参照渡し、可変長引数、スコープ)

プログラムではビルトイン関数というものが用意されており、これらを利用すればそれなりに高度なプログラムを作ることができます。いわゆる内部関数と呼ばれているもので、汎用的な演算処理を目的に用意されており、特定の機能に頼らず、それを標準的な仕様としています。一方、自分で作成するものはユーザー定義関数と呼ばれています。

関数の必要性は、処理をまとめるという点にあり、わざわざ一からコードを記入するという作業を省いてくれます。また、コードの見た目にもすっきりしており、処理ごとにいくつかの関数にまとめたほうが便利と言えます。

書式は、引数や戻り値が無い場合、

PHP
1
2
3
4
5
6
<?php
function sampleFunc(){
echo 'こんにちは';
}
sampleFunc();
?>
実行結果:こんにちは

引数や戻り値がある場合、

PHP
1
2
3
4
5
6
7
8
9
10
11
12
<?php
// sampleFuncが関数名で任意に名前をつけることができます。
// $a$bが引数にあたり、ここの変数に値が入ってきます。
function sampleFunc($a, $b){
$c = $a * $b;
// $cが戻り値
return $c;
}
// sampleFunc関数の「5」が「$a」に入り、「6」が「$b」に入ります。
// その結果を「return」で得て「echo」しています。
echo sampleFunc(5, 6); // 関数を呼び出してechoしています。
?>
実行結果:30

「return $c;」の部分は、「return($c);」と入力しても動作します。
return文は関数を終了して、戻り値を返す文のことです。
また、return文はプログラムの制御を呼び出し元に戻します。
その関数の引数はパラメーターとも言います。
そして関数の呼び出しは、「sampleFunc(5, 6);」の部分です。
また、引数には、論理値 (boolean)、整数 (integer)、浮動小数点数(float, double)、文字列 (string)といったスカラー型以外にも配列やNULLを指定できます。
尚、初期値(デフォルト値)を設定しない場合、関数側の引数の数と関数の呼び出し側の引数の数が一致しないとエラーになります。

引数に初期値を設定した場合、

「function sampleFunc($a, $b)」の部分は、例えば「function sampleFunc($a, $b="2")」というように$bの初期値を設定することができます。この場合、関数の呼び出し側で第二引数がなければ、「2」という値を使って処理されます。また、「function sampleFunc($a="6", $b="2")」といった形式で全ての引数に対して初期値を設定できます。

PHP
1
2
3
4
5
6
7
8
<?php
function sampleFunc($a, $b="2"){
$c = $a * $b;
// $cが戻り値
return $c;
}
echo sampleFunc(5); // 関数を呼び出してechoしています。
?>
実行結果:10

リファレンス

リファレンスは、ある変数を異なる変数名で参照することを言います。元の変数の先頭に「&(アンパサンド)」をつけて他の変数に代入すると、その変数はリファレンスになります。リファレンスになった変数は元の変数と同じものとして取り扱われます。
例えば、

PHP
1
2
3
4
5
6
<?php
$b=50;
$a=&$b;
$a=200;
echo $b;
?>

実行結果:200

上の例では、
「$a」が100なら「$b」も100、
「$a」が200なら「$b」も200、
「$a」が300なら「$b」も300、
となります。

引数の渡し方

引数の渡し方には、「値渡し」と「参照渡し」の二種類があります。前者はそのまま値を渡す方法で、後者は変数のリファレンスを渡す、参照渡しと呼ばれる方法です。PHPのデフォルトは、「値渡し」です。「参照渡し」にする場合は、各引数の先頭に「&」(アンパサンド)を追記します。

また、引数にはタイプヒンティングを指定できます。タイプヒンティングとは、引数の受け取る値がクラスやインターフェイスといったオブジェクトなのか、配列(array)やbool、float、int、stringといった型、またコールバックやselfなどなのかを指定できる機能です。タイプヒンティングを使う場合は、「function sampleFunc(array $a)」や「function sampleFunc(sampleClass $a)」といった形で指定します。ただし、タイプヒンティングを使えば、引数に違う型を渡すとエラーが発生します。

可変長引数

関数定義の際に引数を決めず、関数呼び出し時にいくつでも引数を渡せるようにすることができますが、これを可変長引数と呼んでいます。
これができる関数は以下の三つです。
func_num_args()は、関数に渡された引数の数を返してくれます。
func_get_arg()は関数に渡った引数の中で一つを取得。
func_get_args()は、関数に渡ってきた引数のリストを配列として返却します。

変数のスコープ

スコープとは変数の有効範囲を言います。
そしてグローバル変数のスコープ範囲は、PHPスクリプト全体に及びます。
これには、関数内で「global」をつけた変数も含まれます。
これに対し、ローカル変数は変数を作った関数の内側でのみ利用できます。