PHP入門 ~関数編~
What is 関数?
関数とは「引数」と呼ばれるデータを渡すと、特定の処理をするものである。
処理の結果、関数から与えられるデータのことを「返り値」という。
関数の中には返り値があるものとないものがある。
echo // 返り値なし
print // 返り値あり
返り値があるものを「ファンクション」、
返り値がないものを「プロシージャ」と呼ぶこともある。
関数の種類
- 組み込み関数
ceil()、array_shift()などPHPが標準で持つ関数。 - ユーザー定義関数
組み込み関数とは異なり、ユーザーが自身で「引数」「処理の内容」「返り値」を決めて関数を作ることができる。
下記のような構文で定義することができる。
function 関数名(仮引数1, 仮引数2) {
// 任意の処理
return 返り値;
}
- 関数名は「英字」または「_(アンダースコア)」から始まるもので定義される必要がある
- 数字から始まるものでは定義できない ^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$.
- 大文字小文字は区別されない (hogehoge = HOGEHOGE)
- returnは複数記述することができ、最初のreturnで呼び出しが終了する
- 変数は定義よりも前に呼び出されるとエラーとなったが、関数の場合先に呼び出されても動作する
型宣言(タイプヒンティング)
関数の引数は型を宣言することができる
以下のように記述すると引数に文字列以外のデータが入っているとエラーとなる
function greeting(string $name) :string {
$message = 'Hello, '. $name. '!';
return $message;
}
初期値
関数の引数には初期値を設定することができる。
引数が渡ってこなかった場合は初期値を使い、引数が渡ってきたときにはその引数を利用する。
引数が渡ってこなかった場合にもエラーにならない処理を作りたいときに有用。
function greeting($name = 'guest user') {
$message = 'Hello, '. $name. '!';
return $message;
}
echo greeting('Tom'); // 'Hello, Tom!'
echo greeting(); // 'Hello, guest user!'
入れ子
関数の中に関数を定義することができる→これを入れ子という
function hogehoge() {
function fugafuga() {
echo "fuga";
}
}
スコープ
関数の内部で定義された変数のスコープは関数の内部のみである。
「static」というキーワードをつけて宣言することで、関数の呼び出し後も変数の値を保持させることができる。
関数の外部で定義された変数も、関数内部から利用することができない。(スーパーグローバル変数を除く)
関数の内部から、関数外部で定義された変数にアクセスするためには「global」キーワードを使う。
functioln hogehoge() {
glabal $x;
$y = 2;
static $z = 3;
echo $x;
}
$x = 1;
hogehoge(); // 1 (x = 1)
echo $y; // undefined variable
echo $z; // 3
値渡し、参照渡し
関数を定義する際に仮引数の前に「&(アンパサド)」をつけることで、
参照渡しをすることができる
// 値渡し
function func($num) {
$num++;
echo "$num\n";
}
$num = 10;
func($num); // 11
func($num); // 11
// 参照渡し
function func(&$num) {
$num++;
echo "$num\n";
}
$num = 10;
func($num); // 11
func($num); // 12
無名関数(クロージャ)
関数に名前を付けずに使うことができる。
$greeting = function($name) {
$message = 'hello, '. $name. '!';
return $message;
}
echo $greeting('Tom');
また、「use」を使うことで変数を無名関数に引き継ぐことができる。
$time = 'morning';
$greeting = function($name) use ($time) {
$message = 'Good '. $time. ', '. $name;
return $message;
}
echo $greeting('Tom'); // 'Good morning, Tom'
1度しか使わないことがわかっているような関数は無名関数にすることで、コードの冗長化が防げるらしいが、1度しか使わないなら関数化する意味はあるのだろうか・・・。
他にはコールバックパラメーターとして使う際に便利らしい。
再帰関数
関数が自信を繰り返し呼び出して実行する関数のことを再帰関数という。
階乗や、等比数列、等差数列の和などを求めたいときに有効である。
// 階乗を計算する
function factorial($args) {
if($args > 0) {
return $args * factorial($args - 1);
}
return 1;
}
echo factorial(3); //表示結果は 6
次回はオブジェクト指向
Discussion