UPDATE:2024年11月12日
PHP の関数 ( function ) について 【初心者向け】
初心者の方は以下の4項目を優先的に読んでみて下さい。
関数とは
- 関数 は処理をまとめて名前を付けたもの
- 関数 を呼び出すだけで、必要な 値 や 結果 を簡単に得ることが出来る
関数 とは処理をまとめて名前を付けたものだと考えて下さい。
ある 値 や 結果 を得るために処理をまとめて関数として定義しておき、その 値 や 結果 が欲しいときは、関数を呼び出す(コール)だけで、必要な 値 や 結果 を容易に得ることができるようになります。つまり関数は非常に便利なものなのです。
例えば、ある関数を呼び出すだけで本日の曜日を得ることが出来ます。言い換えれば、本日の曜日を得るために一々コードを記述しなくても関数を呼び出すだけで曜日を取得することが出来ます。
例 本日の曜日を得る
1 2 3 4 5 6 7 8 9 | <!-- サンプルコード --> <?php //関数を定義 3文字のテキスト形式 Mon~Sun function the_day_of_the_week(){ echo date('D')."<br>\n"; } //関数を呼び出す the_day_of_the_week(); ?> |
結果は
となります。
また、関数へは 値 を渡すことが可能で、その 値 を元に処理が実行されることで、渡した値に応じた 値 や 結果 を取得することができます。例えば、ある日付を関数に渡すとその日付の曜日が得られる、或いは、ある文字列を関数に渡すと文字列のバイト数(長さ)が得らるなど、渡した 値 に応じた 結果 を取得することが出来ます。これは、状況に応じて取得する 値 や 結果 を動的に変えられる非常に便利な機能です。
例 日付を指定して曜日を得る
1 2 3 4 5 6 7 8 9 | <!-- サンプルコード --> <?php //関数を定義 3文字のテキスト形式 Mon~Sun function day_of_the_specified_date($specifiedDate){ echo date('D', strtotime($specifiedDate))."<br>\n"; } //関数を呼び出す day_of_the_specified_date('20210609'); ?> |
結果は
となります。
プログラムを記述すると、何度も色々な箇所で使用する同じようなコードで得る 値 があると思います。さらに、その 値 や 結果 を取得するためには、とても長いコードを記述しなければならない場合もあるでしょう。このような場合は関数としてコードを纏める必要があります。そうでないと、何度も同じコードを色々な箇所に記述することになってしまいます。これでは効率が悪く、作業時間が長くなってしまいますし、コードの修正や変更などに対してのメンテナンス性も悪くなってしまいます。
関数は便利であり、必要なものなので、しっかり覚えて利用しましょう!
関数の種類
- PHPの関数は2種類、組み込み関数(予め定義されている)とユーザー定義関数(新規に定義する)
関数にはPHPで予め用意されている組み込み関数と、ユーザーが自分で作成するユーザー定義関数があります。
組み込み関数はPHP側で予め用意されていて、関数を呼び出すだけでいつでも使用出来ます。PHPの組み込み関数は、便利な関数が多く用意されているので、自分で関数を作る(ユーザー定義関数)前に、必要とされる処理を行ってくれる組み込み関数があるかどうかを調べてみましょう。PHPマニュアルの関数リファレンス
ユーザー定義関数はコードを記述しているユーザー自身で定義することが出来る関数です。スクリプト中で何度も使用するようなコードなどを関数化します。関数を定義するのは少し面倒かもしれませんが、コードの使用頻度が高ければその恩恵は計り知れません。スクリプト中何度か使用するようなコードであれば関数化しておくと良いでしょう。
組み込み関数もユーザー定義関数も同じ関数形式であり予め用意されているか、新規に定義するか、の違いです。
この頁ではユーザー定義関数の説明を進めます。
基本的な関数を作ってみる
- 関数の構文は
[変数 = ] function [&]関数名([引数,,,,,,]){ 処理 [return文] } //[ ]は省略可能
※「[ ]」は省略可能です。
構文を見ただけでは、良く分からないと思いますので、実際に簡単な関数を作ってみて、徐々に理解を深めてみましょう。
簡単な関数を作る
- 引数(パラメータ)やreturn文を省略して関数を定義できる
早速簡単な関数を作ってみましょう。
以下の例は最小限の記述で定義した非常にシンプルな関数です。これは、引数(パラメータ)の指定や返り値の指定がない場合の関数です。引数(パラメータ)や返り値については以下の各項目で詳しく説明しますので今は無視して下さい。関数を先に定義してから関数を呼び出します。
例
1 2 3 4 5 6 7 8 9 | <!-- サンプルコード --> <?php //関数を定義 function echo_hello(){ echo "Hello World!!<br>\n"; } //関数を呼び出す echo_hello(); ?> |
結果は
となります。
関数を定義するには、最初に「function」というキーワードを記述します。キーワードの後に半角スペースを挿入し、其の後「関数名」を記述します。関数名には自分で任意の名前を付与します。例では「echo_hello」が関数名になります。関数名の後に「( )」丸括弧を連続して記述します。更に「{ }」中括弧を記述して其の中に処理を記述します。例の処理は「echo "Hello World!!<br>\n";」の部分です。
//シンプルな関数の定義 function 関数名(){ 処理 }
※関数名の記述にはルールがありますので、下記の「関数名のルール」で詳しく説明します。
これで関数が定義できました。次に関数を呼び出します。関数を呼び出すには関数名を記述して、関数名の後に「( )」丸括弧を連続して記述します。例では「echo_hello();」で関数を呼び出しています。呼び出しが成功して初めて 結果 を得ることが出来ます。
//関数の呼び出し 関数名();
関数を作る場合、関数名でその処理内容をイメージできるようにすると良いと言われます。関数には明確な処理内容を定義して、「この関数を使用すれば、このような結果が得られる」ということが明確になるとよいでしょう。
引数(パラメータ)を指定する
- 引数(パラメータ)とは関数内部の処理へ渡す値のこと
それでは次ぎに引数(パラメータ)を指定した関数を定義してみましょう。引数(パラメータ)とは、関数内部の処理へ渡す 値 のことです。関数処理の材料のような働きをします。引数(パラメータ)を指定することで、関数内部へ値を渡すことができ、渡した値に応じた結果を取得することが出来ます。
引数を指定する場合は以下のように記述します。
//関数の定義 function 関数名(引数の変数){//引数を変数で指定 処理 } //関数の呼び出し 関数名(引数の値);//引数の値を指定
早速、引数(パラメータ)を指定した簡単な関数を定義してみます。
例
1 2 3 4 5 6 7 8 9 10 11 12 | <!-- サンプルコード --> <?php //引数(パラメータ)を指定した関数を定義 function echo_greeting($greeting){ echo $greeting."<br>\n"; } //関数を呼び出す echo_greeting('おはよう!'); echo_greeting('こんにちは!'); echo_greeting('こんばんは!'); ?> |
結果は
こんにちは!
こんばんは!
となります。
まず関数定義時の引数の指定方法を説明します。引数は関数名の後の「( )」丸括弧の中に記述し、 変数 で指定します。
function echo_greeting($greeting)・・・
この場合、変数 $greeting が 引数 となります。
引数として指定した変数は関数内部の処理で使用されます。
・・・{ echo $greeting; }
このように引数として渡された変数 $greeting が内部の処理で使用されています。
次に、関数呼び出し時の引数の指定方法です。関数を呼び出す時、関数名の後の「( )」丸括弧の中に実際の引数の値を記述します。この値が引数の値として関数内部へ渡されて処理されます。
echo_greeting('おはよう!');
「おはよう」の文字列が引数の 値 になります。この文字列の値は関数定義時の引数として指定した変数 $greeting へ渡され、関数内部の処理 echo $greeting."<br>\n"; で使用されます。
順番としては、
1
echo_greeting('おはよう!');
↓
2
//おはよう → ($greeting) function echo_greeting($greeting)・・・
↓
3
//($greeting) → echo $greeting ・・・{ echo $greeting."<br>\n"; }
という感じです。
そして、引数の値に応じて取得する値も変化するので
1 2 3 4 | <!-- サンプルコード --> <?php echo_greeting('おはよう!'); ?> |
の処理結果は、
となり、
1 2 3 4 | <!-- サンプルコード --> <?php echo_greeting('こんにちは!'); ?> |
の処理結果は、
となります。
また、引数は「,(カンマ)」で区切って複数指定できるなどの使用方法があります。詳細は以下の「関数の引数(パラメータ)」の項目で説明します。
return文で返り値を指定する
- 関数から値を取得することが出来る。これを返り値という。
- 関数から返り値を得る場合はretrun文を使用する
- return文が実行されると関数の処理がその時点で終了して値が返される
では次に、関数から値を取得する定義方法を説明します。引数(パラメータ)では関数へ値を渡しますが、逆に関数から値を取得することが出来ます。この値を関数の返り値と言います。返り値を得るには、関数内部の処理でreturn文を使用します。これまでの例では、関数内部で結果自体も表現していますが、内部処理中にreturn文を記述すると、「return文が実行されると同時にreturn文で指定した値が関数の返り値として出力」されます。さらに、「return文が実行された時点で処理が終了し、以降の処理は中止」されます。また、return文では、配列やオブジェクトを含むあらゆるデータ型を指定できます。return文の詳細はこちらを参照下さい。
return文を指定する関数は以下のように記述します。
返り値 = function 関数名([引数,,]){ 処理 return 返り値 }
では返り値を得る簡単な関数を定義してみます。
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <!-- サンプルコード --&g <?php //関数を定義 function hello_return(){ $string = "Hello World!!<br>\n"; return $string; } //関数を呼び出す 1 echo hello_return(); //関数を呼び出す 2 $string = hello_return(); echo $string; ?> |
結果は
Hello World!!
となります。
例では、関数定義の処理中に「return $string;」でreturn文を記述しています。return文ではあらゆるデータ型を指定出来ますが、この場合は、文字列型の変数が指定されています。
1 2 3 4 5 6 7 8 | <!-- サンプルコード --&g <?php //関数を定義 function hello_return(){ $string = "Hello World!!<br>\n"; return $string; } ?> |
return文で指定された内容は関数が呼び出された場合に、返り値として出力されます。また、return文が実行されると、関数の処理はそこで終了して以降の処理は実行しません。
次に、関数を呼び出します。例の関数定義のreturn文で指定した内容は「return $string;」で、変数「$string」には、「$string = "Hello World!!<br>\n";」と文字列が格納されています。つまり、関数「hello_return()」を呼び出した時に得られる返り値は、「"Hello World!!<br>\n";」の文字列になります。従って、
1 2 3 4 5 | <!-- サンプルコード --&g <?php //関数を呼び出す 1 echo hello_return(); ?> |
のように、echo で返り値である文字列を出力したり、
1 2 3 4 5 6 7 8 | <!-- サンプルコード --&g <?php //関数を定義 function hello_return(){ $string = "Hello World!!<br>\n"; return $string; } ?> |
返り値の文字列を変数に格納してその変数を echo するなどして値を出力することが出来ます。
返り値は複数の値を指定できるなどの用法があります。詳細は「関数返り値」の項目で説明します。
関数名のルール
- 関数名は関数に付ける任意の名前
- 関数名では大文字小文字は区別されない
- 1文字目使用できる文字
[ a ~ z ]
[ A ~ Z ]
[ Ox7F ~ 0xFF ] コードを持つ文字
[ _ ] アンダーバー - 2文字目以降
[ 0 ~ 9 ]数字が上記に加わる - 一度定義されている関数名は使用できない
- 関数名は識別子です。識別子は名前のことです。識別子の詳細についてはこちらを参照下さい。
- 関数名では大文字小文字は区別されません。
- 最初の1文字目として使用できるのは、「アルファベットの大文字と小文字」、「アンダースコア( _ )」、「ASCIIコードで、( 0x7F )から( 0xFF )までの文字」のいずれかのみとなります。0x7F~0xFF(ASCIIコード)を使用することで、日本語の関数名も付けることが出来ます。ひらがな、カタカナ、漢字などです。アルファベットは大文字小文字が区別されません。
- 2番目以降には、1文字目で使用できる文字に加えて「数字」も使用できます。
- 一度定義されている関数名は使用できません。使用した場合エラーが発生しPHPの処理が停止します。
関数の引数(パラメータ)
- 引数(パラメータ)とは関数内部の処理へ渡す値のこと
- 関数内部へ 引数 を渡し、それに応じた 値 や 結果 を得ることが出来る
- 引数には任意の式を指定できる
- 引数は「,(カンマ)」で区切って複数指定できる
- 引数は省略できる
- 引数では、値渡し、参照渡し、デフォルト引数値、可変長引数 がサポートされている
ここでは、引数を指定する関数定義の詳しい用法について説明したいと思います。基本的な用法については、「引数(パラメータ)を指定する」で説明していますので、読んでない方は最初にこちらを確認してください。
引数(パラメータ)とは、関数に渡す値のことです。関数定義の処理で使用する値のことで、関数の材料のようなものです。例えば、ある工場に様々な資材を搬入して生産された車が出てくるとします。この場合、工場が関数で資材が引数です。
引数には任意の式を指定できます。式とは値のあるもののことで、変数、定数、リテラル値、演算子を使用した複雑な式、などです。式についてはこちらを参照下さい。
式は「,(カンマ)」で区切って複数指定することが出来ます。式が評価されその結果が関数に渡されます。
引数は省略可能で、指定しない場合は括弧の中を空白「( )」にしておきます。
引数には幾つか種類があります。デフォルトでは「値渡し」となります。値渡しでは引数に式を指定します。次に「参照渡し」の引数です。この形で引数を指定すると、関数内部から関数外部の変数の値を直接操作できます。「値渡し」の引数では関数外部の変数に影響を与えることはありません。PHPでは、「デフォルト引数値」をサポートしています。デフォルト引数値を指定すると関数を呼び出す場合に引数を指定しなくても、自動でデフォルト値の引数が指定されます。最後に、「可変長」の引数です。これは、引数の数を可変させることが出来る機能です。ざっと説明しましたが各引数の種類について以下で詳しく説明します。
「値渡し」の引数
引数なしの関数
括弧の中を空白「()」にしておきます。
1 2 3 4 5 6 7 8 9 10 | <!-- サンプルコード --> <?php //関数を定義 function hello_one_time(){ //処理を記述 echo '"Hello World !!"'; } //関数を実行 hello_one_time(); ?> |
結果は
となります。
引数に 変数 を指定
関数 hello_name() の引数に変数$nameを指定しています。変数$nameには文字列を指定しています。
1 2 3 4 5 6 7 8 9 | <!-- サンプルコード --> <?php //関数を定義 function hello_name ( $name ) { echo "こんにちは ” $name ” さん。"; } //関数呼び出し hello_name('山田'); ?> |
結果は
となります。
引数に 演算子を使用した式 を指定
関数 int_twice() の引数に変数$intを指定しています。変数$intには「+(加算演算子)」を使用した式を指定しています。
1 2 3 4 5 6 7 8 9 | <!-- サンプルコード --> <?php //関数を定義 function int_twice ( $int ) { echo $int*$int; } //関数呼び出し int_twice( 5+5 ); ?> |
結果は
となります。
引数に 配列 を指定
関数 array_diplay() の引数に配列型の変数$abcを指定しています。
1 2 3 4 5 6 7 8 9 10 11 12 | <!-- サンプルコード --> <?php //関数を定義 function array_diplay ( $ary ) { foreach($ary as $value){ echo $value."<br>\n"; } } //関数呼び出し $abc = array('あ','い','う'); array_diplay( $abc ); ?> |
結果は
い
う
となります。
引数を複数指定
関数 echo_plural_value() の引数に複数の変数を指定しています。引数の値は文字列です。
1 2 3 4 5 6 7 8 9 10 11 | <!-- サンプルコード --> <?php //関数を定義 function echo_plural_value ( $a, $b, $c ) { echo $a."<br>\n"; echo $b."<br>\n"; echo $c."<br>\n"; } //関数呼び出し echo_plural_value( 'PHP','Ruby','Perl' ); ?> |
結果は
Ruby
Perl
となります。
引数に様々な値を複数指定
関数 echo_various_value() の引数にリテラル値、数式、論理値、変数、定数などの値を複数指定しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <!-- サンプルコード --> <?php //関数を定義 function echo_various_value ( $string, $int, $formula, $bool, $variable, $constant ) { echo $string."<br>\n"; echo $int."<br>\n"; echo $formula."<br>\n"; if(is_bool($bool) && $bool === TRUE) echo "TRUEです<br>\n"; echo $variable."<br>\n"; echo $constant."<br>\n"; } //変数と定数を定義 $hensu = '変数'; define("TEISU", "定数"); //関数呼び出し echo_various_value( 'PHP', 123, 10*10*10, TRUE, $hensu, TEISU); ?> |
結果は
123
1000
TRUEです
変数
定数
となります。
「参照渡し」の引数
- 引数を参照渡しで指定すると、関数内部から関数外部の変数の値を直接操作できる
- 引数を参照渡しにするには引数の前に「&(アンド)」をつける
引数を参照渡しで指定すると、関数内部から関数外部の変数の値を直接操作できるようになります。通常変数のスコープの規定により「値渡し」の引数では、関数内部から関数外部の変数の値は操作できません。
引数を参照渡しにするには引数の前に「&(アンド)」を付けます。
function 関数名( &引数 ){ 処理 }
例:参照渡しの場合
1 2 3 4 5 6 7 8 9 10 11 12 13 | <!-- サンプルコード --> <?php //関数を定義 function int_double ( &$int ) { $int *= $int; } //関数外部で変数を作成 $i = 5; //関数呼び出し int_double( $i ); //関数が変数の値を操作 echo $i; ?> |
[/PHP]
結果は
となります。
通常の値渡しの場合「function int_double ( $int )・・・」であれば、
結果は
となります。
引数のデフォルト値
- 引数に値を指定しなかった場合は常にデフォルト値を使用することができる
- デフォルト値の指定はデフォルト値がない引数の右側に指定する必要がある
関数を呼び出す(コール)とき、引数に値を指定しなかった場合は常にデフォルト値を使用するということが出来ます。引数に値を指定した場合はその値が使用されます。
デフォルト値は定数式である必要があります。例えば、変数やクラスのメンバーではエラーが発生します。
1 2 3 4 5 6 7 | <!-- サンプルコード --> <?php //関数を定義 function admission_fees($price = 1000){ echo "入場料金は $price 円です。<br>\n"; } ?> |
引数に値を指定しないで関数を呼び出すとデフォルト値が適用されます。
1 2 3 4 5 | <!-- サンプルコード --> <?php //関数呼び出し admission_fees(); ?> |
結果は
となります。
引数に値を指定するとその値が適用されます。
1 2 3 4 | <!-- サンプルコード --><?php //関数呼び出し admission_fees(1200); ?> |
結果は
となります。
引数を複数指定いる場合にデフォルト値を指定するには、デフォルト値の指定をデフォルト値がない引数の右側に指定する必要があります。
以下の例では期待通りに動作しません。
1 2 3 4 5 6 7 | <!-- サンプルコード --> <?php function member_list($sex = "男性", $name, $age){ return "氏名:{$name} , 年齢:{$age} , 性別:{$sex} \n"; } echo member_list('鈴木', 39); ?> |
結果は
となります
以下のようにデフォルト値の指定を右側に配置すると正常に動作します。
1 2 3 4 5 6 7 | <!-- サンプルコード --> <?php function member_list($name, $age, $sex = "男性"){ return "氏名:{$name} , 年齢:{$age} , 性別:{$sex} \n"; } echo member_list('鈴木', 39); ?> |
結果は
となります
可変長の引数
- 可変長の引数では、引数の数を可変させることが出来る
- 可変長の引数を指定するには、PHPの組み込み関数「func_num_args() func_get_arg() func_get_args()」を使用する
可変長の引数では、引数の数を可変させることが出来ます。上記で説明してきましたが、引数は0個で省略することができ、また「,(カンマ)」で区切って複数指定することも出来ます。そしてさらに引数の数を可変させることが出来ます。引数が1個の場合もあり、5個の場合もある、という具合です。
引数を可変させる場合はPHPの組み込み関数(PHPで予め用意されている関数)を使用します。以下の組み込み関数を利用して可変引数に対応したユーザー定義関数を作成することが出来ます。
1 2 3 4 5 6 7 8 9 10 11 | <!-- サンプルコード --> <?php //関数に渡された引数の個数を返します。 $count = func_num_args(); //関数に渡された引数の指定された値を返します。 $ary = func_get_arg(); //関数に渡されて全引数を配列として返します。 $ary = func_get_args(); ?> |
これらの関数はユーザー定義関数の内部処理で使用します。そうでないとPHPからエラー警告が出ます。
<?php function 関数名(){ 処理 $count = func_num_args(); $ary = func_get_arg(); $ary = func_get_args(); } ?>
それでは、それぞれの関数の動作を見てみましょう。
func_num_args()
1 2 3 4 5 6 7 8 | <!-- サンプルコード --> <?php function param_count(){ return func_num_args(); } echo param_count()."<br>\n"; echo param_count(5, 23, 98)."<br>\n"; ?> |
結果は
3
となります。
引数(パラメーター)が空の場合は、0 を返し、3個の場合は、 3 を返しています。
func_get_args()
1 2 3 4 5 6 7 8 9 10 | <!-- サンプルコード --> <?php function get_param_ary(){ return func_get_args(); } $ary = get_param_ary(); print_r($ary)."<br>\n"; $ary = get_param_ary('a', 'b', 'c'); print_r($ary)."<br>\n"; ?> |
結果は
Array ( [0] => a [1] => b [2] => c )
となります。
func_get_arg()
1 2 3 4 5 6 7 8 9 10 | <!-- サンプルコード --> <?php function get_param_ary(){ return func_get_arg(2); } $ary = get_param_ary('あ', 'い', 'う', 'え', 'お'); print_r($ary)."<br>\n"; $ary = get_param_ary('a', 'b', 'c', 'd', 'e'); print_r($ary)."<br>\n"; ?> |
結果は
c
となります。
return func_get_arg(2); が return func_get_arg(0); であれば、
結果は
a
となります。
これらの関数を利用して引数可変対応のユーザー定義関数を作成してみる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <!-- サンプルコード --> <?php //関数定義 function variable_param_hello(){ //引数が無ければ if(func_num_args() == 0){ echo "”こんにちは! 名無しさん”<br>\n"; } else{ //引数を配列として取得する $ary = func_get_args(); foreach($ary as $value){ echo "”こんにちは! ".$value."”<br>\n"; } } } //関数の呼び出し variable_param_hello(); variable_param_hello('青木さん', '伊藤さん', '遠藤さん'); ?> |
結果は
”こんにちは! 青木さん”
”こんにちは! 伊藤さん”
”こんにちは! 遠藤さん”
となります。
引数の省略
1 2 3 4 5 6 7 8 | <!-- サンプルコード --> <?php function param_two($a, $b){ if(isset($a)) echo "引数 a は設定されています。<br>\n"; if(isset($b)) echo "引数 b は設定されています。<br>\n"; } param_two('引数a'); ?> |
結果は
となります。
2つ目の引数が指定されていないので、PHPから警告が発生しています。
返り値
- 関数ではreturn文で値を返すことが出来る、これを返り値という
- 返り値はすべてのデータ型を扱える
- return文が実行されると其の時点で関数の処理が終了する
- return文は複数指定可能
- return文は省略しても大丈夫
- 返り値がない場合は関数内部の処理で出力する
関数はreturn文で値を返すことが出来ます。関数を実行したときに得られる値のことです。これを返り値といいます。基本的な用法については、「return文で返り値を指定する」で説明していますので、最初にこちらを読んでから引き続きこの項を読んでください。
返り値を求める関数定義の構文
返り値 = function 関数名([引数,,]){ 処理 return 返り値 }
return文の返り値は、文字列、数値、浮動小数点数、論理値、配列、オブジェクトなど、すべてのデータ型を扱うことが出来ます。return文が実行されると、其の時点で関数の処理が終了し、その関数を呼び出した箇所に制御が戻ります。関数からの返り値は、変数などに格納して利用すると便利です。return文はオプション機能なので省略しても大丈夫です。返り値がない場合は、関数内部の処理で出力処理を記述します。また、return文で複数の値を返すには、return文に配列を指定します。
return文で値を返す
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <!-- サンプルコード --> <?php //文字列を返す関数を定義 function return_str(){ return 'Hello!!'; } $str = return_str(); echo $str."<br>\n"; //数値を返す関数を定義 function return_int(){ return 100; } $int = return_int(); echo $int."<br>\n"; ?> |
結果は
100
となります。
return文で複数の値を返す1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <!-- サンプルコード --> <?php //関数定義 function return_args(){ $args = array(10,20,30,40,50); return $args; } //関数の呼び出し echo "返り値を変数に格納して配列型変数を展開<br>\n"; $numbers = return_args(); foreach($numbers as $int){ echo $int."<br>\n"; } //関数の呼び出し echo "list関数を利用して複数の返り値をそれぞれ変数に格納する<br>\n"; //list関数を使用して複数の値を変数に格納 list($num1,$num2,$num3,$num4,$num5) = return_args(); echo $num1."<br>\n"; echo $num2."<br>\n"; echo $num3."<br>\n"; echo $num4."<br>\n"; echo $num5."<br>\n"; ?> |
結果は
10
20
30
40
50
list関数を利用して複数の返り値をそれぞれ変数に格納する
10
20
30
40
50
となります。
return文に配列を指定しているので、複数の返り値は配列型データとして返されます。返り値は変数などに格納し、配列展開することで値を取得できます。また、list()関数を利用することで、配列の値をそれぞれ指定した変数へ格納して利用することが出来ます。
return文で複数の値を返す2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | <!-- サンプルコード --> <?php //ユーザー名を確認する関数 function auth_user($user){ if($user == 'adminuser') return array(TRUE,$user); elseif($user == 'poweruser') return array(TRUE,$user); elseif($user == 'defaultuser') return array(TRUE,$user); else return array(FALSE,$user); } //関数実行して返り値を配列で取得 $result = auth_user('adminuser'); //取得配列をif文で判別 if($result[0] === TRUE) echo $result[1]."です。<br>\n"; else echo $result[1]."を識別できません。<br>\n"; //関数実行して返り値を配列で取得 $result = auth_user('testuser'); //取得配列をif文で判別 if($result[0] === TRUE) echo $result[1]."です。<br>\n"; else echo $result[1]."を識別できません。<br>\n"; ?> |
結果は
testuserを識別できません。
となります。
可変関数
- 関数名を変数で指定することが出来る
ユーザー定義関数では、関数名を変数で指定することが出来ます。これを可変関数と言います。
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | <!-- サンプルコード --> <?php //ユーザー定義関数の作成 function greet_morning(){ echo "おはよう!<br>\n"; } function greet_afternoon(){ echo "こんにちは!<br>\n"; } function greet_evening(){ echo "こんばんは!<br>\n"; } //関数名を変数で指定する //if文で時間帯によって関数名を指定 $timeHour = date('G'); if($timeHour >= 4 && $timeHour < 11) $varFunctionName = 'greet_morning'; elseif($timeHour >= 11 && $timeHour < 16) $varFunctionName = 'greet_afternoon'; else $varFunctionName = 'greet_evening'; //変数で関数名を指定 //関数名の存在を確認してから実行 if(function_exists($varFunctionName)) $varFunctionName(); ?> |
結果は
となります。
例では、if文によって条件を分岐し、時間帯により実行する関数名を変更しています。午前4~11時までは、文字列「greet_morning」を変数「$varFunctionName」に格納し、午前11~16時までは、文字列「greet_afternoon」を変数「$varFunctionName」に格納、それ以外は、文字列「greet_evening」を変数「$varFunctionName」に格納しています。この変数「$varFunctionName」を関数名に指定し、関数を呼び出すことで、時間帯によって実行する関数を変更することが出来ます。
このように可変関数では、関数名を変数で指定できるので、変数名によって呼び出す関数を動的に変更することが可能です。
関数と変数のスコープ
- 変数の影響範囲を変数のスコープといい、関数の内部と外部で分けることが出来る
- 変数のスコープは4種類、「グローバルスコープ」「ローカルスコープ」「スタティック変数」「関数の引数(パラメータ)」がある
変数のスコープとは宣言された変数がコード中の何処まで影響を及ぼすかという範囲のことです。一度宣言された変数が何処でも使用できるという訳ではありません。変数が宣言された場所とその変数の有効範囲が決められており、それが変数のスコープです。変数のスコープは全部で4種類あります。「グローバルスコープ」「ローカルスコープ」「スタティック変数」「関数の引数(パラメータ)」です。これらの変数のスコープ、宣言の場所と有効範囲は関数内部か関数外部で分けることができます。「グローバルスコープ」は関数の外部で宣言された変数のスコープです。「ローカルスコープ」と「スタティック変数」は関数の内部で宣言された変数のスコープです。そして、「関数の引数」として宣言された変数のスコープがあります。以下でそれぞれの詳細を説明します。
グローバルスコープ
- 関数の外部で定義した変数はグローバルスコープのグローバル変数
- 関数の内部からグローバル変数にはアクセスできない
- 関数の内部からグローバル変数にアクセスする場合は、globalキーワードを使用する
関数の外部で定義した変数は、グローバル変数となります。グローバルスコープのグローバル変数です。この変数はコード中のどこからでもアクセスできます。ですが、関数の内部からグローバル変数にアクセスすることはできません。関数の内部からグローバル変数にアクセスするには、関数内でglobalキーワードを使用してその変数を宣言する必要があります。
以下の例では、関数外部で「$iCount = 1;」と変数(グローバル変数)を宣言しています。そして、関数内部で、「$iCount++;」とし、変数「$iCount」に対して加算子で加算しています。ですが、関数内部から関数外部の変数へはアクセスできないので、echoの結果は「1」となります。
1 2 3 4 5 6 7 8 9 10 11 | <!-- サンプルコード --> <?php function increment(){ //内部 $iCount++; } //外部 $iCount = 1; increment(); echo $iCount; ?> |
結果は
となります。
そこで、globalキーワードを使用して関数内部で変数を宣言します「global $iCount;」。そうすると、関数内部から外部の変数(グローバル変数)へアクセスできるので、関数外部で宣言された「$iCount = 1;」に対して関数内部の「$iCount++;」が有効となり、結果は「2」となります。
1 2 3 4 5 6 7 8 9 10 11 12 | <!-- サンプルコード --> <?php function increment(){ //内部 global $iCount; $iCount++; } //外部 $iCount = 1; increment(); echo $iCount; ?> |
結果は
となります。
グローバル変数とは別にスーパーグローバル変数があります。スーパーグローバル変数は関数やメソッドの内部で使用する場合、globalキーワードを使用して宣言する必要がありません。グローバル変数とは異なります。こちらを参照下さい。
ローカルスコープ
- 関数の内部で定義した変数はローカルコープのローカル変数(関数内で定義した別の関数も含む)
- 関数の外部からローカル変数にはアクセス出来ない
関数の内部で宣言した変数は、宣言した関数内でのみ有効になります。これは、ローカルスコープのローカル変数です。関数内で定義した別の関数も含みます。このローカル変数へは、関数の外部からアクセスすることはできません。
例
1 2 3 4 5 6 7 8 9 | <!-- サンプルコード --> <?php $iCount = 1; function increment(){ $iCount++; } increment(); echo $iCount; ?> |
結果は
となります。
例では、関数内部の変数 $iCount(ローカル変数) を加算しても、関数外部の変数 $iCount(グローバル変数) には影響がありません。
スタティック変数
- 関数の内部でstaticキーワードを使用して定義した変数はスタティック変数
- スタティック変数は関数内でしか使用できない
- スタティック変数は関数が終了しても破棄されない
関数の内部でstaticキーワードを使用して宣言する変数をスタティック変数と言います。スタティック変数の値は関数が終了しても破棄されませんが、その関数内でしか使用できません。スタティック変数を宣言するには、キーワードstaticを使用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 | <!-- サンプルコード --> <?php function increment(){ static $iCount = 0; $iCount++; echo "スタティック変数カウンタの現在の値は $iCount です。<br>\n"; } $iCount = 10; increment(); increment(); increment(); echo "グローバル変数カウンタの値は{$iCount}です。<br>\n"; ?> |
結果は
スタティック変数カウンタの現在の値は 2 です。
スタティック変数カウンタの現在の値は 3 です。
グローバル変数カウンタの値は10です。
となります。
関数の引数(パラメータ)
- 関数の引数としての変数のスコープは関数内部で有効なローカルスコープ
- 参照渡しの引数の場合、関数内部から関数外部の変数へアクセスできる
関数の定義時に、関数の引数(パラメータ)として変数を指定することができます。引数とは関数の内部へ渡すデータのことです。この関数の引数としての変数のスコープは、関数内部で有効なローカルスコープです。関数外部の変数には影響を与えません。ですが、引数を指定する場合に、参照渡しという用法で指定することが可能で、この場合、関数外部の変数の値を操作することが出来ます。
詳細は上記の関数の引数(パラメータ)を参照下さい。
以下の例では、関数外部で「$choise = ‘train’;」とグローバル変数を定義し、関数の引数として「means_transportation($choise)」と引数の変数を指定しています。引数の変数$choiseは、グローバル変数の$choiseに影響を与えません。
1 2 3 4 5 6 7 8 9 | <!-- サンプルコード --> <?php $choise = 'train'; function means_transportation($choise){ echo "I go by ,{$choise}<br>\n"; } means_transportation('airplane'); echo $choise."<br>\n"; ?> |
結果は
train
となります。
以下の例では参照渡しで引数の変数を指定しています。この場合関数内部から関数外部の変数を操作することが出来ます。
1 2 3 4 5 6 7 8 9 10 | <!-- サンプルコード --> <?php $choise = 'train'; function means_transportation( &$choise ){ $choise .= ' and airplane'; echo "I go by ,{$choise}<br>\n"; } means_transportation($choise); echo $choise."<br>\n"; ?> |
結果は
train and airplane
となります。
関数の入れ子(ネスト)
- 関数は入れ子(ネスト)に出来る
関数は関数の中に関数を記述する入れ子(ネスト)が可能です。
以下の例では、関数 func_calculate() の中に function func_addition() と func_subtraction() の二つの関数を入れ子にして記述しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | <!-- サンプルコード --> <?php function func_calculate($a, $b){ //初期化 $ad = 0; $sb = 0; $result = array(); //加算 function func_addition($a, $b){ $c = 0; $c = $a + $b; return $c; } //減算 function func_subtraction($a, $b){ $c = 0; $c = $a - $b; return $c; } //計算 $ad = func_addition($a, $b); $sb = func_subtraction($a, $b); //結果 $result = array($ad, $sb); return $result; } //関数呼び出し list($rltAdd, $rltSub) = func_calculate(51, 23); echo '加算:'.$rltAdd."<br>\n"; echo '減算:'.$rltSub."<br>\n"; ?> |
結果は
減算:28
となります。
関数内のHTML処理
- 関数は処理にHTMLを記述出来る
関数は処理にHTMLを記述出来ます。とても便利な機能なので、利用してみましょう。
1 2 3 4 5 6 7 8 9 | <!-- サンプルコード --> <?php function html_string(){ ?> <a href="https://wepicks.net">TRY PHP!</a> <?php } html_string(); ?> |
結果は
となります。
型宣言(タイプヒンティング)
指定できる型は、文字列型、整数型、浮動小数点数型、配列型、論理型、Callable(コールバック)、クラス、インターフェースです。引数の前に型指定のキーワード や クラス名/インターフェース名 を指定します。
1 2 3 4 5 6 7 8 9 | <?php function func_typehinting(string $message){ echo $message."<br>\n"; } //引数文字列型 func_typehinting('こんにちは!'); //引数配列型 func_typehinting(arrya('こんにちは!')); ?> |
となります。
引数に配列型を指定している方ではPHP Fatal error:が発生します。
キーワード | 型 | 内容 | バージョン |
---|---|---|---|
string | 文字列型 | 引数は文字列型(string)を指定 | PHP7.0.0 |
int | 整数型 | 引数は整数型(integer)を指定 | PHP7.0.0 |
float | 浮動小数点型 | 引数は浮動小数点型(float)を指定 | PHP7.0.0 |
float | 論理型 | 引数は論理型(boolean)を指定 | PHP7.0.0 |
array | 配列型 | 引数は配列型(array)を指定 | PHP5.1.0 |
クラス名/ インターフェース名 | オブジェクト型 | 引数は指定してクラスやインターフェースのインスタンス | PHP5.0.0 |
callable | callable | 引数はcallableを指定 | PHP5.4.0 |
関数 簡単まとめ
1 Minute Note
関数とは
- 関数は処理をまとめて名前を付けたもの
- 関数を呼び出すだけで、必要な 値 や 結果 を簡単に得ることが出来る
- PHPの関数は2種類、組み込み関数(予め定義されている)とユーザー定義関数(新規に定義する)
- 関数の構文は
[変数 = ] function [&]関数名([引数,,,,,,]){ 処理 [return文] } //[ ]は省略可能
関数名 規則
- 関数名は関数に付ける任意の名前
- 関数名では大文字小文字は区別されない
- 1文字目使用できる文字
[ a ~ z ]
[ A ~ Z ]
[ Ox7F ~ 0xFF ] コードを持つ文字
[ _ ] アンダーバー - 2文字目以降
[ 0 ~ 9 ]数字が上記に加わる - 一度定義されている関数名は使用できない
引数
- 引数(パラメータ)とは関数内部の処理へ渡す値のこと
- 関数内部へ 引数 を渡し、それに応じた 値 や 結果 を得ることが出来る
- 引数には任意の式を指定できる
- 引数は「,(カンマ)」で区切って複数指定できる
- 引数は省略できる
- 引数では、値渡し、参照渡し、デフォルト引数値、可変長引数 がサポートされている
- 引数を参照渡しで指定すると、関数内部から関数外部の変数の値を直接操作できる
- 引数を参照渡しにするには引数の前に「&(アンド)」をつける
- 引数に値を指定しなかった場合は常にデフォルト値を使用することができる
- デフォルト値の指定はデフォルト値がない引数の右側に指定する必要がある
- 可変長の引数では、引数の数を可変させることが出来る
- 可変長の引数を指定するには、PHPの組み込み関数「func_num_args() func_get_arg() func_get_args()」を使用する
返り値
- 関数ではreturn文で値を返すことが出来る、これを返り値という
- 返り値はすべてのデータ型を扱える
- return文が実行されると其の時点で関数の処理が終了する
- return文は複数指定可能
- return文は省略しても大丈夫
- 返り値がない場合は関数内部の処理で出力する
可変関数
- 関数名を変数で指定することが出来る
関数と変数のスコープ
- 変数の影響範囲を変数のスコープといい、関数の内部と外部で分けることが出来る
- 変数のスコープは4種類、「グローバルスコープ」「ローカルスコープ」「スタティック変数」「関数の引数(パラメータ)」がある
- 関数の外部で定義した変数はグローバルスコープのグローバル変数
- 関数の内部からグローバル変数にはアクセスできない
- 関数の内部からグローバル変数にアクセスする場合は、globalキーワードを使用する
- 関数の内部で定義した変数はローカルコープのローカル変数(関数内で定義した別の関数も含む)
- 関数の外部からローカル変数にはアクセス出来ない
- 関数の内部でstaticキーワードを使用して定義した変数はスタティック変数
- スタティック変数は関数内でしか使用できない
- スタティック変数は関数が終了しても破棄されない
- 関数の引数としての変数のスコープは関数内部で有効なローカルスコープ
- 参照渡しの引数の場合、関数内部から関数外部の変数へアクセスできる
その他
- 関数は入れ子(ネスト)に出来る
- 関数は処理にHTMLを記述出来る
サンプル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 | <!-- サンプルコード --> <h3>簡単な関数の作成と実行</h3> <?php //関数を定義 function echo_hello(){ echo "Hello World!!<br>\n"; } //関数を呼び出す echo_hello(); ?> <br><br> <h3>簡単な関数の作成と実行 return文</h3> <?php //関数を定義 function hello_return(){ $string = "Hello World!!<br>\n"; return $string; } //関数を呼び出す 1 echo hello_return(); //関数を呼び出す 2 $string = hello_return(); echo $string; ?> <br><br> <h3>関数の引数を指定</h3> <?php //引数(パラメータ)を指定した関数を定義 function echo_greeting($greeting){ echo $greeting."<br>\n"; } //関数を呼び出す $goodMorning = 'おはよう!'; echo_greeting($goodMorning); $goodAfternoon = 'こんにちは!'; echo_greeting($goodAfternoon); $goodEvening = 'こんばんは!'; echo_greeting($goodEvening); ?> <br><br> <h3>関数の引数に配列を指定</h3> <?php //関数を定義 function array_diplay ( $ary ) { foreach($ary as $value){ echo $value."<br>\n"; } } //関数呼び出し $abc = array('あ','い','う'); array_diplay( $abc ); ?> <br><br> <h3>関数の引数を参照渡しで指定</h3> <?php //関数を定義 function int_double ( &$int ) { $int *= $int; } //関数外部で変数を作成 $i = 5; //関数呼び出し int_double( $i ); //関数が変数の値を操作 echo $i; ?> <br><br> <h3>関数の引数をデフォルト値で指定</h3> <?php //関数を定義 function admission_fees($price = 1000){ echo "入場料金は $price 円です。<br>\n"; } //関数呼び出し admission_fees(); ?> <br><br> <h3>関数の引数を可変長の引数で指定</h3> <?php //関数定義 function variable_param_hello(){ //引数が無ければ if(func_num_args() == 0){ echo "”こんにちは! 名無しさん”<br>\n"; } else{ //引数を配列として取得する $ary = func_get_args(); foreach($ary as $value){ echo "”こんにちは! ".$value."”<br>\n"; } } } //関数の呼び出し variable_param_hello(); variable_param_hello('青木さん', '伊藤さん', '遠藤さん'); ?> <br><br> <h3>関数の返り値をreturn文で複数指定</h3> <?php //関数定義 function return_args(){ $args = array(10,20,30,40,50); return $args; } //関数の呼び出し echo "返り値を変数に格納して配列型変数を展開<br>\n"; $numbers = return_args(); foreach($numbers as $int){ echo $int."<br>\n"; } //関数の呼び出し echo "list関数を利用して複数の返り値をそれぞれ変数に格納する<br>\n"; //list関数を使用して複数の値を変数に格納 list($num1,$num2,$num3,$num4,$num5) = return_args(); echo $num1."<br>\n"; echo $num2."<br>\n"; echo $num3."<br>\n"; echo $num4."<br>\n"; echo $num5."<br>\n"; ?> <br><br> <h3>可変関数を作成</h3> <?php //ユーザー定義関数の作成 function greet_morning(){ echo "おはよう!<br>\n"; } function greet_afternoon(){ echo "こんにちは!<br>\n"; } function greet_evening(){ echo "こんばんは!<br>\n"; } //関数名を変数で指定する //if文で時間帯によって関数名を指定 $timeHour = date('G'); if($timeHour >= 4 && $timeHour < 11) $varFunctionName = 'greet_morning'; elseif($timeHour >= 11 && $timeHour < 16) $varFunctionName = 'greet_afternoon'; else $varFunctionName = 'greet_evening'; //変数で関数名を指定 //関数名の存在を確認してから実行 if(function_exists($varFunctionName)) $varFunctionName(); ?> <br><br> <h3>関数の入れ子(ネスト)</h3> <?php function func_calculate($a, $b){ //初期化 $ad = 0; $sb = 0; $result = array(); //加算 function func_addition($a, $b){ $c = 0; $c = $a + $b; return $c; } //減算 function func_subtraction($a, $b){ $c = 0; $c = $a - $b; return $c; } //計算 $ad = func_addition($a, $b); $sb = func_subtraction($a, $b); //結果 $result = array($ad, $sb); return $result; } //関数呼び出し list($rltAdd, $rltSub) = func_calculate(51, 23); echo '加算:'.$rltAdd."<br>\n"; echo '減算:'.$rltSub."<br>\n"; ?> <br><br> |
Hello World!!
簡単な関数の作成と実行 return文
Hello World!!
Hello World!!
関数の引数を指定
おはよう!
こんにちは!
こんばんは!
関数の引数に配列を指定
あ
い
う
関数の引数を参照渡しで指定
25
関数の引数をデフォルト値で指定
入場料金は 1000 円です。
関数の引数を可変長の引数で指定
”こんにちは! 名無しさん”
”こんにちは! 青木さん”
”こんにちは! 伊藤さん”
”こんにちは! 遠藤さん”
関数の返り値をreturn文で複数指定
返り値を変数に格納して配列型変数を展開
10
20
30
40
50
list関数を利用して複数の返り値をそれぞれ変数に格納する
10
20
30
40
50
可変関数を作成
こんばんは!
関数の入れ子
加算:74
減算:28
タグ(=記事関連ワード)
日付
最終更新日:2024年11月12日