ユーザー定義関数
PHPにはたくさんの関数があらかじめ用意されています。このように最初からPHPに用意されている関数を「組み込み関数」といいます。
ユーザー自らが勝手に「関数」を作り出すことも出来るのです。
これを「ユーザー定義関数」といいます。
書式 ユーザー定義関数の作成
function 関数名(引数){
実行する処理
}
実際に例文を実行してみます。
下記のユーザー定義関数「hyouzyun」は、引数に175を指定してhyozyun(175)とすれば、勝手に身長175㎝の標準体重を書き出してくれます。
(例1)
<?php
hyouzyun(175);
function hyouzyun($s){
$sc = $s /100;
$sb =round($sc*$sc*22.1);
print"標準体重は".$sb."kgです";
}
?>
実行結果1
ユーザー定義関数hyouzyunを作成しておけば、標準体重を計算し書き出すことができます。
身長140cm~200cmの身長に対する標準体重の一覧が作れます。「100で割って、二乗して、22を掛けて、四捨五入して、print」という処理を61回繰り返し処理も、ユーザー定義関数「hyouzyun」を使えば記述が分かりやすくなります。
(例2)
<?php
for ($a =140; $a <=200;$a++){
print"身長".$a."cmなら";
hyouzyun($a);
print"<br>";
}
function hyouzyun($s){
$sc =$s/100;
$sb =round($sc*$sc*22,1);
print"標準体重は".$sb."kgです。";
}
実行結果2
返り値のあるユーザー定義関数
例えば、PHPの組み込み関数でpi()はπを、round()は四捨五入した値を、strrev()は反転した文字列を返します。
ユーザー定義関数でも、関数が値を返すようにすることが出来ます。この場合は、次のように関数の定義の中にreturnを記述します。
書式
function 関数名(引数){
実行する処理
return 返り値;
}
先程の標準体重の例で、計算した標準体重の値を返すようにすると、下記のようになります。
(例3)
<?php
for ($a =140; $a <=200;$a++){
print"身長".$a."cmなら標準体重は";
print hyouzyun2($a);
print"kgです。<br>";
}
function hyouzyun2($s){
$sc =$s/100;
$sb =round($sc*$sc*22,1);
return $sb;
}
実行結果2と3は、同じになります。今度は関数hyouzyun2()自体が値を返すので「print hyouzyun2($a)」として値を書き出しています。
・変数のスコープ
実は、ユーザー定義関数は、必ず引数を指定しなければいけないというわけではありません。例えば、次を実行しても実行結果1と同じ結果となります。
<?php
hyouzyun3();
function hyouzyun3(){
$s =175;
$sc = $s /100;
$sb =round($sc*$sc*22.1);
print"標準体重は".$sb."kgです";
}
?>
実行結果
関数hyouzyun3の中で変数$sに値(175)を代入しています。
しかしながら、下記の例4は、変数$sに175の値を代入してから関数hyouzyun4を実行します。
(例4)
<?php
$s = 175;
hyouzyun4();
function hyouzyun4(){
$sc = $s/100;
$sb = round($sc*$sc*22,1);
print"標準体重は".$sb."kgです。";
}
?>
実行結果
残念ながら「Notice: Undefined variable(変数が定義されていない)という警告が表示され、「標準体重は0kgです」と表示してしまいます。
要するに、PHPでは関数の外で定義した変数は、関数の中では利用できないという事です。
・スコープとは
関数の中で定義した変数を「ローカル変数」
関数の外で定義した変数を「グローバル変数」といいます。
また逆に、ローカル変数はその関数の中でしか利用することが出来ません。
次、例5を実行しても「Notice: Undefined variable」されます。
(例5)
<?php
f();
print $a;
function f(){
$a =1;
}
?>
「グローバル変数は関数の外でしか利用できない」「ローカル変数はその関数の中でしか利用できない」というような、変数が通用する範囲のこをスコープ(Scope)といいます。
次は、グローバル変数とローカル変数が同じ変数名$aを使っているのですが、それぞれのスコープがちがうので別物として認識し動作しています。
(例6)
<?php
$a = 1;
print "グローバル変数は{$a}<br>";
f();
function f(){
$a = 5+5;
print "ローカル変数は{$a}";
}
?>
実行結果6
・globalでグローバル変数を利用する
実は「グローバル変数を関数の中でも利用可」にする方法があります。
次のようにglobalキーワードを使用します。
(例6)
<?php
$s =175;
hyouzyun6();
function hyouzyun6(){
global $s;
$sc = $s/100;
$sb =round($sc*$sc*22,1);
print"標準体重は".$sb."kgです。";
}
?>
実行結果
グローバル変数が関数内でも使用できます。