■ 関数基礎知識
関数とは、一まとまりのコードに名前をつけたものである。
関数への入力をパラメータ(仮引数)、関数からの出力を返り値と呼ぶ。
関数には大きく分けて2種類存在し、PHPが標準で持つ組み込み関数と、
ユーザーが独自に作るユーザー定義関数である。
関数は必ずしも返り値を持つとは限らない。
関数は定義と呼び出しがあるが、コードの中で定義されるよりも先に関数が呼び出された場合でもその関数は実行される。
以下のようなパターン
hello();
function hello() {
echo 'hello';
}
関数の中には、引数から返り値を計算する以外の動作をすること(副作用)がある。
【例】
- テキストを出力する
- ファイルを削除する
関数名が数字で始まるものは定義できない
英字または、アンダースコア(_)から始まる関数名で定義しなければならない。
関数名の大文字、小文字は区別されない。
以下の出力結果は全て同じになる。
※変数は大文字、小文字を区別する
echo date('Y/m/d');
echo DATE('Y/m/d');
echo Date('Y/m/d');
関数内には複数のreturn文を書くことができる。
呼び出し時、最初に到達したreturn文のところで呼び出しが終了する。
関数の中に、別の関数を定義できる。
これを入れ子の定義という。
入れ子にされた関数を呼び出すには、先にそれを含む関数を呼び出さなければならない。
以下の例では、hoge()を呼び出した時点でfuga()が定義され、fuga()の呼び出しができるようになる。
fuga()のスコープがhoge()内に限定されることはない。
function hoge() {
function fuga() {
echo 'fuga';
}
}
phpコードの中に 終了タグ:?> → 開始タグ:<?php の順で記述されている場合、その2つのタグに囲まれたテキストはそのまま出力される。
■ 変数のスコープとスタティック変数
変数の有効範囲をスコープと呼ぶ。
スコープには、グローバルスコープと関数レベルのスコープの2種類がある。
宣言位置 | 種類 | 有効範囲 |
---|---|---|
関数の外側 | グローバルスコープ | すべての位置 |
関数の内側 | 関数レベルのスコープ | その関数内 |
デフォルトでは、関数内からグローバルスコープの変数にアクセスすることはできない。
関数内からグローバルスコープの変数にアクセスしたい場合は、関数内でglobalキーワードを使用して、その変数を指定しておく必要がある。
【例】関数内からグローバル変数へのアクセス
function func() {
global $x;
echo $x;
}
$x = 1;
func();
// 結果:1
関数レベルのスコープ変数には、関数の外部からアクセスすることはできない。
ただし、return文を使用して変数の値を返すことは可能である。
returnの記述が無ければ$xへのアクセスはできずに出力はされない。
【例】return文を使用して値を返す
function func() {
$x = 1;
return $x;
}
$x = func();
echo $x;
// 結果:1
関数内の変数は、関数の呼び出しが完了するときに消えてしまう。
staticキーワードを付けることで、関数の呼出しが完了しても変数の値を保持させることができる。
【例】staticキーワードによる変数の値の保持
function func() {
static $x = 1;
$x++;
echo $x, "\n";
}
func();
func();
func();
/*
結果:2
3
4
*/
staticキーワードが付いた変数の代入は、その関数の最初の呼び出しの時にだけ実行される。
staticキーワードが付いた変数は、リテラルあるいは定数を用いて初期化することができる。
式で初期化することはできない。
【例】式による初期化
function func($x) {
static $y = $x;
}
// 結果:Fatal error
■ 値渡しと参照渡しのパラメータ
パラメータには値渡しと参照渡しの2種類存在する
参照渡しの場合は、パラメータの前に &
をつける。
【例】パラメータの違い
/*
* 値渡し
*/
function func($num) {
$num++;
echo "$num\n";
}
$num = 10;
func($num);
func($num);
/* 結果:11
11
*/
/*
* 参照渡し
*/
function func(&$num) {
$num++;
echo "$num\n";
}
$num = 10;
func($num);
func($num);
/* 結果:11
12
*/