php講座

ユーザ定義関数

関数を定義する

組み込み関数とユーザ定義関数

特定のコードの流れ(文脈)に依存せず、複数の文脈で使い回せる一連の処理をパッケージングしたものが関数である。

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;
}

変数のスコープ

スコープとは

変数の「寿命」には限界がある。変数は自分が「生まれた」{}を超えては生きられない。

関数の処理内容を記述する{}の中ではじめて定義された変数を「ローカル変数」と呼ぶ。

関数の「引数」はローカル変数とは呼ばないが、ローカル変数と同じ扱いがされる({}の中で定義されたものとして扱われ、関数を超えては生きられない)。

scope.php
<?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など)。

値渡しと参照渡し

PassByValue.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の値(1)をfuncの第一引数に渡している
print $var3;
?>
</p>
<p>$var1の中身
<?php
print $var1;                  //2行目で定義された$var1の値を表示
?>
</p>
</body>
</html>

値渡し

※func関数のローカル変数$var1は5になるが、func関数の引数として渡された$var1の値は変化しない。引数として渡されたのは$var1の中身(値)であって、変数そのものではない(「値渡し」)。

※変数そのものを渡す渡し方を「参照渡し」と呼ぶ(PHPでは「値渡し」が基本)。

CallByReference.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(ファイル名);