関数(1)

PHPアルゴリズムと関数

プログラムで行う処理は膨大な数になってきます。そのため、制御構造だけでは間に合いません。同じ処理を同じ場所で繰り返し使うだけでなく他の場所でも同じ処理をしたい場合、コピペでいいじゃないかと思いますがそれだと無駄に量が多くなったりします。そこで同じ処理を繰り返し行うために関数が用意されています。言語で予め用意されている関数に加え、自身で新たに関数を作って実行します。

関数定義と呼び出し

早速ですが関数の定義の仕方と呼び出し方を説明します。下記コードをご覧ください。

<?php
function getArea($x, $y){//function 関数名(引数){処理内容}で定義する。
  $value = $x * $y;
  return $value;//returnで呼び出し元に値をかえします。戻り値と言います
}

$area = getArea(2, 4);//関数(関数に使用する値)で呼び出し、変数に結果を格納している。
print '面積は'.$area.'です';
?>

変数の利用できる範囲スコープ

スコープには関数の外から参照できるグローバルスコープと、定義されている関数の内部のみで参照できるローカルスコープがあります。

<?php
function getVal(){
  $value = 'ローカル';
}
getVal();
print $value;
?>

上記のコードでは$valueに何も入っていない未定義の変数だとエラーになります。

<?php
$value = 'グローバル';

function getVal(){
  $value = 'ローカル';
}
getVal();
print $value; //グローバル
?>

上記のコードではgetVal()内で$valueにローカルという文字列を入れてるように見えますが、結果はグローバルと表示されます。このgetVal()内の$valueは関数内で使用されるローカル変数となるので、別の変数として扱われます。

<?php
$value = 'グローバル';

function getVal(){
  global $value;//globalとすると、グローバル変数となります 
  $value = 'ローカル';
}
getVal();
print $value; //ローカル
?>

関数内部でglobalと付けることで強制的にグローバル変数にします。グローバル変数はPHPではデフォルトでは関数外でのみ使用される変数となっており、関数内で使うためにはグローバルで使う変数を宣言しなくてはなりません。上記のコードでは関数内でグローバルで使う変数を宣言しましたので、出力結果がローカルとなりました。

関数は外部ファイルにまとめる

プログラムは大体規模が大きくなってきます。そのため、1つのソースファイルに全てのコードを書くとものすごく複雑になって読みにくいですし、管理できません。そこで関数を外部ファイルに定義し、外部から呼び出します。

外部ファイルを読み込む

まず読み込むべき関数を定義されたファイルを作成します。

<?php
  function getArea($x, $y){
    $result = $x * $y;
    return $result;
  }
?>

呼び出す方のファイルで、関数を定義されたファイルを読み込み、関数を呼び出します。

<?php
require_once 'getArea.php';
$area = getArea(4, 5);
print '面積は'.$area;
?>

デフォルトパラメーター

関数を定義する時、上のコードでは変数のみ記述しておりましたが、予め引数の値を設定することができます。

function getArea($x = 5, $y = 10){
  return $x * $y;//引数が指定されればその値が、されていなければデフォルト値が使われる
}

値渡しと参照渡し

通常の引数は値渡しをされています。変数やリテラルを引数にすれば関数側のパラメーターにコピーされます。それに対し参照渡しがあり、メモリアドレスをコピーします。どちらも同じ値をコピーするのですが、コピーされるのが値だけかそれとも参照元なのかという違いがあります。

<?php
$num = 1;
print $num;
function sample(&$value){
  $value += 10;
  return $value;
}
print ', ';
print sample($num);
?>

複数の戻り値

関数の戻り値は1つとは限りません。複数の戻り値を返すには配列にして返します。

例として可変パラメータを設定した関数で、引数として渡された値の中で最も大きい値と小さい値を配列にして返すプログラムを作成しましょう。

<?php
function getMaxMinValue(){
  $arr = func_get_args(); //引数を配列にして格納しています。
  return array(max($arr), min($arr));//max()で配列で最も大きな値を、min()で最も小さな値を。
}

$result = getMaxMinValue(1,3,6,-3);
print_r($result);
?>

結果として配列で6と−3が表示されましたね。配列ではなく個別の変数に分けることもできます。

<?php
function getMaxMinValue(){
  $arr = func_get_args(); //引数を配列にして格納しています。
  return array(max($arr), min($arr));//max()で配列で最も大きな値を、min()で最も小さな値を。
}

list($maxVal, $minVal) = getMaxMinValue(1,3,6,-3);
print "maxVal : {$maxVal}, maxMin : {$minVal}";
?>

次回も関数に関して説明していきます。

コメント

タイトルとURLをコピーしました