特集PC技術

例で覚えるPHP

 

第7回 関数

1.ユーザ関数

PHP内では最初から膨大な数の関数が定義されていますが、それらの関数を自分で作り出すことも可能です。 その場合も細かい点は多少異なりますが、大まかな構文は他の言語と変わりありません。

2.ユーザ関数の定義

PHPでは、ユーザ関数を定義する際には関数名の前に「function」キーワードを置きます。
この点以外は、他の言語のユーザ関数の定義と変わりありません。 変数名の後ろの()にその関数の仮引数を並べ、{}の内側にそのユーザ関数で行う処理を記述します。 そして返値を指定するときは、{}内でreturn文を用います。

<?php
	function testfunc($num){
		$s=$num*$num*3.14;
		return $s;
	}

	$x=3.00;
	echo "半径".$x."の円の面積は".testfunc($x);
?>
実行結果:
定義された関数が、円の面積を返す

3.外部ファイルからの関数呼び出し

別のPHPファイルで定義した関数を、実行中のPHPファイルから呼び出して使うこともできます。 その場合、require()関数やinclude()関数を用いて、ファイルの読み込みを行う必要があります。

関数を定義するスクリプト:
<?php
	function area($r){ //  引数を半径に持つ円の面積を求める関数
		$a=$r*$r*3.14;
		return $a;
	}
 
	function volume($r){  // 引数を半径に持つ球の体積を求める関数
		$v=(4/3)*$r*$r*$r*3.14;
		return $v;
	}
 
	function circle($r){  // 引数を半径に持つ円の体積を求める関数
		$c=2*$r*3.14;
		return $c;
	}
?>
関数の呼び出し・実行を行うスクリプト:
<?php
	$x=3.00;

	include("./func2.php");

	echo " 半径 ".$x." の円の面積は ".area($x)."<br>";
	echo " 半径 ".$x." の球の体積は ".volume($x)."<br>";
	echo " 半径 ".$x." の円の円周は ".circle($x)."<br>";
?>
実行結果:
呼び出された関数内で、面積・円周・体積が計算される

require()関数は指定したファイルが見つからなかったとき、Fatal_Errorを出して動作を停止させますが、 include()関数の場合はWarningに留めて動作は継続されます。 目的にあわせて使い分けるのがいいでしょう。

4.変数のスコープ

PHPで使われる変数ではアクセスを行える位置が決められています。 この範囲のことをスコープといいます。 スコープは定義されている場所によって決定され、ローカル関数の中で使われる変数をローカル変数、 関数の外で使われる変数をグローバル変数といいます。

ローカル変数には、それの定義がされているローカル関数内からしかアクセスできません。
グローバル変数には基本的にはスクリプト内のどこからでもアクセスが可能です。


しかしローカル関数内で変数にアクセスしようとする場合、 その関数内で定義された変数以外はチェックしないため、グローバル変数にアクセスできません。 このため、ローカル関数内からグローバル変数にアクセスする場合、ちょっとした手順が必要になります。

<?php
	$x=4;

	function look1(){
		global $x;  //globalキーワードを用いて変数を呼び出す
		echo $x;
	}

	function look2(){
		echo $GLOBALS["x"];  //スーパーグローバルな$GLOBAL変数を呼び出す
	}

	function look3($num){
		echo $num;  //関数の引数に取る
	}

	look1();
	echo "<br>";
	look2();
	echo "<br>";
	look3($x);
	echo "<br>";
?>
実行結果:
全ての場合でグローバル変数へのアクセスが成立している

ローカル関数の内部でglobalキーワードを用いて、ローカル関数内でアクセスする変数がグローバル変数であることを明示的に表します。 この他にも、PHPが提供するスーパーグローバルな$GLOBAL配列を用いたり、参照する変数を関数の引数に取るなどの方法もあります。

コメントの投稿


画像の中に見える文字を入力してください。

トラックバックURL

http://www.isl.ne.jp/cgi-bin/mt/mt-tb.cgi/1060

pagetopこのページの先頭へ戻る