ユーザ定義関数
関数を定義する
- 組み込み関数とユーザ定義関数
-
特定のコードの流れ(文脈)に依存せず、複数の文脈で使い回せる一連の処理をパッケージングしたものが関数である。
PHPには一般性・汎用性が高く、PHPユーザが自由に使える関数が数多く用意されている(「組み込み関数」)。これまで使ってきたdate_default_timezone_set('Asia/Tokyo')やhtmlspecialchars(値, ENT_QUOTES)などはすべてこの組み込み関数である。
EXCELのSUM関数なども基本的には同じ意味のものである。
しかし最初から用意されている関数だけでなく、ユーザ側で関数を新たに定義し、使用することもできる。それをユーザ定義関数という。
- 関数の構成要素
-
戻り値 関数名(引数1, 引数2…){
処理の中身;
return 戻り値;
}※強調部がユーザ定義部分
cf.EXCELの関数 合計値 SUM(数値[セル範囲])PHPでの関数定義 // finctionキーワードを使って定義する function function_name($var1, $var2…){ 処理; [return 戻り値;] }
/*
* 合計を求める関数
* @param array $values ($valuesは配列)
* @return int | float (戻り値は整数ないし小数)
*/
function sum($values){
foreach((array)$values as $value){
$sum = $sum + $value;
}
return $sum;
}
変数のスコープ
- スコープとは
-
変数の「寿命」には限界がある。変数は自分が「生まれた」{}を超えては生きられない。
関数の処理内容を記述する{}の中ではじめて定義された変数を「ローカル変数」と呼ぶ。
関数の「引数」はローカル変数とは呼ばないが、ローカル変数と同じ扱いがされる({}の中で定義されたものとして扱われ、関数を超えては生きられない)。
<?php
//関数の外で定義されている変数
$var8 = 80;
$var9 = 90;
function func($var1){
global $var9; //$var9はグローバル変数として使うぞ宣言
$var8 += 8; //$var8はいきなり使用している
$var9 += 9;
$var2 = 2;
return $var1 + $var2 + $var8 + $var9;
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<title>ローカル変数、引数、グローバル変数</title>
</head>
<body>
<p>func(1)の実行結果
<?php
print func(1);
?>
</p>
<p>$var1を関数の外で見てみると<?php print $var1;?></p>
<p>$var2を関数の外で見てみると<?php print $var2;?></p>
<p>$var8を関数の外で見てみると<?php print $var8;?></p>
<p>$var9を関数の外で見てみると<?php print $var9;?></p>
</body>
</html>
- グローバル変数
-
関数の外で定義された変数を関数内でglobalキーワードを付けて使用するとその変数は「グローバル変数」として扱われる。
グローバル変数は{}の限界を超えて生き続けることができる。
globalキーワードを付けずに変数を使用すると関数内部で新たに定義された変数(ローカル変数)と見なされる。
関数の呼び出し
- 関数を利用する(呼び出す)
-
関数名(引数1,引数2…) と書くだけで必要な処理が実行され、戻り値があればそれを値として利用できる(別の変数に代入、そのままprintなど)。
値渡しと参照渡し
<?php
$var1 = 1; //関数の外で定義されている変数
$var2 = 10;
function func($var1,$var){ //第一引数は値渡し
$var1 = $var1 + $var; //この$var1は引数で定義されたもの(2行目の$var1とは無関係)
return $var1;
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<title>関数の呼び出し(値渡し)</title>
</head>
<body>
<p>$var1の中身
<?php
print $var1; //2行目で定義された$var1の値を表示
?>
</p>
<p>func($var1,$var2)の実行結果
<?php
$var3 = func($var1,$var2); //2行目で定義された$var1の値(1)をfuncの第一引数に渡している
print $var3;
?>
</p>
<p>$var1の中身
<?php
print $var1; //2行目で定義された$var1の値を表示
?>
</p>
</body>
</html>
- 値渡し
-
※func関数のローカル変数$var1は5になるが、func関数の引数として渡された$var1の値は変化しない。引数として渡されたのは$var1の中身(値)であって、変数そのものではない(「値渡し」)。
※変数そのものを渡す渡し方を「参照渡し」と呼ぶ(PHPでは「値渡し」が基本)。
<?php
$var1 = 1; //関数の外で定義されている変数
$var2 = 10;
function func(&$var1,$var){ //第一引数は参照渡し
$var1 = $var1 + $var; //この$var1は引数で定義されたもの(2行目の$var1とは無関係)
return $var1;
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<title>関数の呼び出し(参照渡し)</title>
</head>
<body>
<p>$var1の中身
<?php
print $var1; //2行目で定義された$var1の値を表示
?>
</p>
<p>func($var1,$var2)の実行結果
<?php
$var3 = func($var1,$var2); //2行目で定義された$var1の「参照」をfuncの第一引数に渡している
print $var3;
?>
</p>
<p>$var1の中身
<?php
print $var1; //2行目で定義された$var1の値を表示(中身が書き換わっている!)
?>
</p>
</body>
</html>
- 参照渡し
-
※関数を定義するときに引数を「&」を付けておくと、その引数は「参照渡し」となる。
※参照渡しされた変数は関数内部での変更が関数外部にも及ぶ。
関数利用の一般的留意点
- グローバル変数・参照渡し
-
関数は特定の文脈から切り離されているが故に利用価値が高まる。しかしグローバル変数や参照渡しを用いるとその独立性が失われる。
従って関数を利用するに当たってはグローバル変数や参照渡しは極力使用しないのが望ましい。
- 別ファイルで関数を定義する
-
関数は特定のブログラム(ファイル)に依存する必要が無く、他のプログラム(ファイル)からも自由に呼び出せた方が利用価値が高まる。
そのため関数は別ファイルに定義して、それを他ファイルから適宜利用するのが一般的である。
他ファイルからの(処理内容などの)読み込み - require_once(ファイル名);