「関数」についてよく分かっていなかったので、復習する
はじめに
なんで今さら「関数」を勉強するのか?
この3ヶ月くらい、いろんな言語をちょっとずつつまんだり、WordPressの勉強をしてきた。
その中で、「関数」についてももちろん、Progate・スクール・本で勉強していたつもりだった。
でもいざ「関数」とは何かを聞かれると、答えられない。関数作ってみてと言われても、作れない。
曖昧にやり過ごしてきた結果だけど、プログラミングの世界で避けて通れない「関数」のことを一度立ち止まってしっかり復習していきたいと思う。
PHPにおける関数を学んだので他の言語と違う部分もあるかもしれないけど、基本となることは同じだという理解で進めていきます。
関数とは?
まず、関数とは何か?
関数(function)がコードの再利用の鍵となります。1つの関数は、命令文をタイプし直すかわりに、関数名によって実行することができる名前のついた命令文のセットです。 -オライリー・ジャパン『はじめてのPHP5』より
関数とは、コードの再利用をするときに使うツールのひとつのよう。
関数は大きく分けて2つある。
組み込み関数とユーザー定義関数
組み込み関数とは、PHPで提供している関数で、PHP以外の言語(C言語)で書かれている。 trim(セル内の余分なスペースを削除する関数)、strln(指定した文字列の長さを取得する関数)などがある。 PHPは他の言語と比べても特に多くの組み込み関数を持っているという。
ユーザー定義関数とは、ユーザーが独自に処理を記述した関数である。 これらの違いは明瞭で、関数を利用するのに ユーザーはDefine(定義)とUse(使用)部分が必要だとすると、 組み込み関数はあらかじめ定義されているので、Use を n回で利用していくのに対して ユーザー関数は、Define 1回と Use n回で利用していく。
関数の宣言と呼び出し
関数を新しく作成するには、関数名に続けて、関数のキーワードと中括弧で囲んで関数の本文を書く。
引数なしの場合
function 関数名() { ・・・処理・・・ }
引数ありの場合
function 関数名($引数1 …) { ・・・処理・・・ }
引数なしの関数はいつも同じものを実行するのに対して、引数を使うことで関数に柔軟性を持たせることができて関数の威力は増大する。
関数の呼び出し例は以下
引数なし
//関数の定義 function foo(){ echo 'hello'; } //関数の呼出し foo();
実行結果
hello
関数あり
//関数の定義 function foo($val){ echo $val + 100; } $num = 100; //関数の呼出し foo($num);
実行結果
200
引数を渡す
関数の引数にはデフォルトを設定することができ、それによってオプションの引数をとる。 呼び出し元によってはNULLを渡してしまう可能性があるときなどに、あらかじめデフォルト値をセットしておけば、NULL参照のエラーを防ぐことができる。
以下のように書く
function foo($val = 10)
引数の値をカンマで区切ることで複数の引数を渡すことができるが、 オプションの引数はすべての必須の引数の後に持ってこなければならない。
function page_header($color, $title, $header = 'Welcome')
値を返す(return)
データの出力や情報をデータベースに記憶させるなどの動作に加えて、関数は値を計算することもでき、返り値としてプログラムの後で使用することもできる。 その場合は return オプションを使用して返り値を取得する。 関数内でreturnを指定すれば、関数の処理の途中でも任意の場所で関数を呼び出し元に制御を戻すことができる。
以下のように書く
function 関数名() { …実行処理… return $返り値; }
変数のスコープを理解する
関数内部で引数の変数を変更しても、関数の外部にある変数には影響を与えない。なぜなら関数内の動作は異なるスコープで起こるからである。 PHPの変数は、使える有効範囲が限られており、この範囲のことをスコープと言う。 関数の外で定義された変数をグローバル変数と呼び、関数の内部で定義された変数をローカル変数と呼ぶ。それぞれの関数は別々のスコープを持っている。
グローバル変数は、グローバルとついているが関数内では直接使用できない
$val = 'グローバルスコープ'; function func2(){ return $val; } echo $val; echo func2();
実行結果
グローバルスコープ Undefined Variable: val
外部の値を関数内で使用したい場合は、次のふた通りの手段がある。
① $GLOBALS 配列
$GLOBALSはPHP組み込み変数の1つで、グローバルスコープの変数のうち、現在のPHPスクリプト上で使用可能な全ての変数を参照する事ができる。
書き方は以下
$GLOBALS["変数名"];
$GLOBALSはスパーグローバルと呼ばれ、その変数がすべてのスコープで使用可能になる。
② globalキーワードを使う
このキーワードを変数の前につけて宣言する事によってスコープの違う変数でも参照できるようになる。
global宣言で「どちらのスコープでも使用可能」な変数が作成できる事になる。
function func2(){ global $val; // globalキーワードを使用 return $val; }