※この記事は「2021年5月22日」に更新しました。
前回は、制御構造について、学びました。
今回は、関数について。
関数とは
関数とは、今までも使ってきた array関数や print_r関数などです。
ひとまとまりの処理を行ってくれる機能のことです。
関数は、パラメータ(引数)をいくつか渡して、内部で処理されて、結果として値を返してくれるというものです。
関数の呼び出し
関数名 (引数1,引数2,…);
引数が一つのときもありますし、全く必要ないときもあります。
関数は、結果として値を返してくれるというのを先程書きました。
結果として値を返す場合、変数などに代入して利用します。
戻り値を変数に代入
変数1 = 関数名 (引数1,引数2,…);
これで戻り値が変数1に格納されます。
関数は値として記述できるところであれば書くことができます。
例えば、以下のように書くこともできます。
echo date("Y-m-d");
ちなみに date関数は、日付を文字列として取得する関数です。
引数によって表記方法が異なり、今回は “Y-m-d” という引数を与えています。
関数の定義
先程の date関数やarray関数は定義済みの関数です。
こういった関数のことを内部関数といいます。
一方で関数は自分で作成することもできます。
それが、ユーザー定義関数です。
function 関数名(引数1,引数2,…) { 独自の処理 return 戻り値; }
引数は、ある場合とない場合があるかと思います。
また、戻り値もない場合もあるかと思います。
そういった場合は、次のように書きましょう。
function 関数名() { 独自の処理 }
デフォルト引数
引数には、デフォルト値が設定できます。
function 関数名(引数 = デフォルト値) { 独自の処理 return 戻り値; }
呼び出しのときに関数名()と引数を省略した場合にデフォルト値が引数として使われます。
引数の渡し方
関数に引数を渡す方法は2種類あります。
- 値渡し
- 参照渡し
それでは順番に見ていきましょう。
値渡し
引数を値として渡して、関数内でその値を変更したとしても呼び出し元の変数の値に影響はありません。
function myFunc($a) { $a = "田中"; } $b = "山田"; echo "私は" . $b . "です。<br />"; myFunc($b); echo "私は" . $b . "です。";
この場合は、以下のように表示されます。
私は山田です。 私は山田です。
参照渡し
引数として渡された値を関数内で変更したときに呼び出し元の変数の値も変更するために使います。
&(アンパサンド)を引数の変数の前につけることで参照渡しになります。
function myFunc(&$a) { $a = "田中"; } $b = "山田"; echo "私は" . $b . "です。<br />"; myFunc($b); // 関数の引数が参照渡しのために $b の値が変更 echo "私は" . $b . "です。";
つまり、以下のように表示されます。
私は山田です。 私は田中です。
関数と間違えやすい言語構造について
今までつかってきた echo や print は関数ではありません。
言語構造というものです。
その証拠に引数を () で囲っていなかったはずです。
() でも動作するみたいなのですが、正しい記述ではないので注意しましょう。
関数のモジュール化
関数は、特定の処理をまとめたものなので複数のスクリプトから利用したいということもあるでしょう。
その場合は、モジュール(ひとまとまりの部品)として、独立させると良いです。
PHP にはファイルを独立させたスクリプトを読み込ませる命令があります。
- include ‘ファイルのパス’
- include_once ‘ファイルのパス’
- require ‘ファイルのパス’
- require_once ‘ファイルのパス’
ちなみに include の場合はエラーになったときに、その先の処理は継続して行われます。
それに対して require の場合はエラーになったときは、その先の処理は中止されます。
あと _once があるかないかは指定ファイルを何度も読み込むかどうかです。
通常は一度読み込めば問題ない場合が多いので _once を使うことが多いそうです。
引数、戻り値の型宣言(PHP7)
PHP7 では、引数、戻り値の型宣言が本格的に使えるようになりました。
function 関数名(引数の型 引数1, 引数の型 引数2,…) : 戻り値の型 { 独自の処理 return 戻り値; }
最後に
いかがでしょうか。
ざっくりと関数について説明しました。
次回は、POST と GET について。
やっと、Webプログラミングらしくなってきました。
基礎的なところではありますが、気楽にやっていきましょう。