こんにちは!ライターのmuramatsuです。
今回はPHPの引数についてです。PHPの勉強を始めたばかりの方、
と思っていませんか?またある程度勉強してきた方は、コマンドライン引数を使ってコマンドから実行したいと思っていたりしませんか?
この記事では、
- 引数とは
- 引数と関数の関係
という基礎知識から、
- 引数を指定して関数を呼び出す
- 引数のデフォルト値を設定する
- 複数の引数を指定する
- 引数に配列を指定する
という引数の基本的な使い方、コマンドライン引数の使い方の応用的な使い方に関して解説していきます。引数は、一度書いた処理の動きを変えて何度も使うことができ、とても便利ですよ。そんな引数について、わかりやすく解説していきます!
引数とは
関数を処理するときに渡す値のことを引数といいます。ある情報(値)を引数が持っており、それを関数に渡すことで、関数はその情報に応じた処理をしてくれるようになります。
引数はパラメーターとも呼ばれ、関数内で処理をしてもらって返ってくる結果の値を戻り値や返り値と呼びます。引数は関数のカッコ()内に直接数字や文字列を書いたり、その変数を書きます。
さて、ここでは「関数」というワードが何回か出来てきましたが、引数と関数はいったいどういった関係なのでしょうか。
関数と引数の関係
まず関数について学び、関数と引数がどのような関係なのかを見ていきましょう。
関数とは
処理をひとまとめにして定義したものを関数といいます。「命令する機能」の様なものです。機能なので、それを動かすには呼び出してあげないと使うことはできません。
定義した関数は何度でも呼び出すことができ、同じコードを書くことを避けられます。呼び出しは関数名と引数をコードに記述することで指定した関数を呼び出し、引数が持っている情報を渡して、関数内で処理をしています。
命令をする機能の関数は、PHPでは既に定義されている内部関数(ビルトイン関数・組み込み関数)とユーザーが定義するユーザー定義関数があります。ユーザーが関数を定義するには、functionを使って定義していきます。
書き方:
function 関数名($変数) { 実行処理; return 式; //省略可能 }
関数はfunctionの後にユーザーが定義した関数名を指定します。関数名のカッコ()内の$変数が、引数になります。returnは戻り値を返す処理を行ってくれますが、省略する事もできます。
さて、関数を定義した次は、その関数の呼び出しをしないと処理が行われません。関数は呼び出し先、呼び出しは呼び出し元と呼ばれ、呼び出し先(関数)の処理が終わると呼び出し元に処理結果が戻ってきます。
処理を実行するための関数の呼び出しは以下のようになります。
関数名($変数);
functionで定義した引数($変数)はfunction 関数名() { 実行処理 } のようにカッコ()内に引数を書かず、省略することもできます。省略した場合の関数の呼び出しは関数名();となります。
関数定義後の流れは、
2.関数内(呼び出し先)で処理が行われる
3.呼び出し元に処理が戻る
というように処理が実行されていきます。なお、関数名を使用しないfunctionのみの関数である無名関数(クロシージャ)を記述することもできますので、頭の片隅にでも入れておきましょう。
では実際に、自分で定義した関数を実際に呼び出して処理をしてみましょう。以下にfunctionを指定して引数のないユーザー定義関数を使用する簡単なサンプルを記述します。
サンプルプログラム:
<?php function foo(){ echo 'Processing of foo is being executed.'; } echo 'fooの呼び出し<br>'; foo(); ?>
実行結果:
fooの呼び出し Processing of foo is being executed.
サンプルでは関数名をfooとし、その処理echoを記述しました。
次にecho ‘fooの呼出し<br>’;による出力を実行し、その後foo()で関数を呼び出しています。echo ‘fooの呼出し<br>’;の処理後、foo()で関数を呼出し、foo関数内の処理(echoによる出力)が実行されていることがわかりますね!
関数と引数
関数は、引数がなくても定義することができ、呼び出して処理をすることが可能なことが分かりました。ではどのような時に引数が必要なのでしょうか。関数ではある処理をまとめている黒いボックスとよくイメージされます。
引数はその黒いボックスの中に入れる値で、その後箱から出てきた処理結果が戻り値というイメージです。引数は関数が柔軟な処理を行う方法として必要な情報になっているのです。関数は何度も繰り返し使うことができ、同じコードを何度も書かなくてもいいと解説しました。
しかし関数を呼び出して実行するだけでは、処理結果は毎回同じとなってしまいますね。そこで関数に異なる引数(値)を渡すことにより、同じ結果ではなく違う実行結果を得ることができるようになり、更に便利に使えるようになります。
なお、引数はfunctionで定義した関数本体で$変数として定義されるので、その値は変動的です。呼び出しの際に引数を指定しない場合は、関数本体に定義されている値が渡されますが、呼び出し時に引数を指定した場合は、その引数の値が関数に渡されます。
またこの関数本体が持っている引数のことを仮引数といい、関数を呼び出す際に指定している引数を実引数と呼びます。関数本体に仮引数を設定し、呼び出し時に実引数を指定するとどのようにして処理されるのか、実際に次で見ていきましょう。
引数を指定して値を関数に渡す
ここでは引数の値がどのように渡されているのかを実際に見ていきます。仮引数と実引数がどのように変化するのか、値渡しと参照渡しの場合の2つの方法を紹介します。
実引数を関数に渡す、値渡し
値渡しとは、呼び出し元が実引数に格納されている値を関数に渡していることです。値渡しの場合、関数本体の引数(値)と呼び出し元になる引数(値)は異なる値となっています。
そのため、呼び出しの際に違う値を渡したとしても、関数本体の値が変わることはありません。以下に関数に実引数を渡す簡単なサンプルを紹介します。
サンプルプログラム:
<?php //functionでfruitsの関数を定義。$valueは仮引数 function fruits($value){ echo 'これは'.$value.'です。'; echo '<br>'; } //fruits関数の呼び出しで実引数‘apple’を指定 fruits('apple'); //変数$fruits1に'orange'を代入 $fruits1 = 'orange'; //fruits関数の呼び出しで実引数$fruits1を指定 fruits($fruits1); ?>
実行結果:
これはappleです。 これはorangeです。
functionで関数fruitsを定義し、仮引数に$valueを設定しました。関数の処理として、echoで引数の値$valueを出力させます。関数の呼び出しで、1つは呼び出しの実引数に値を直接指定し、もう1つは変数$fruits1に値を代入し実引数にその変数を指定しました。
呼び出し時のカッコ()内に実引数を書くときは、直接書いても、値を代入した$変数を書いても問題ありません。実行結果のとおり、渡された引数によって、fruits関数の中で出力結果が異なることが分かりますね。
関数内で実引数の値を変える参照渡し
値渡しでは、実引数の値そのものが関数内の仮引数にコピーして渡されているため、呼び出し先で処理されても、呼び出し元の実引数の値が変わることはありませんでした。
参照渡しの場合は、実引数と仮引数は値が入っている場所を見ています。呼び出し元の値ではなく、値が入っている場所が渡されるため、関数内で定義されている変数(仮引数)は呼び出し元の変数(実引数)と同じになります。
つまり実引数で渡された値を関数内で処理しその結果を返すと、処理されて返ってきた値に変わり、呼び出し元の実引数の値も変更されます。
- 値渡しのイメージ: 実引数 !== 仮引数 … 実引数と仮引数の値は同じではない
- 参照渡しのイメージ: 実引数 === 仮引数 … 実引数と仮引数の値は同じ
参照渡しのコードの書き方は、仮引数にアンド(&)をつけるだけで、あとは値渡しとほぼ変わりません。書き方:
function 関数名(&$変数) { 実行処理; return 式; //省略化 }
では実際にサンプルコードで、値渡しと参照渡しを比べてどのように引数の値が変わるのか、見てみましょう。サンプルコード:
<?php //値渡し function calculation( $int ) { return $int += $int; } $ex = 3; echo calculation( $ex ); echo '<br>'; echo $ex; echo '<br>'; echo '<br>'; //参照渡し function calculation2( &$int ) { return $int += $int; } $ex = 3; echo $ex. '<br>'; //関数呼び出し、出力 echo calculation2( $ex ); echo '<br>'; //関数内で処理され変数の値を操作 echo $ex; ?>
実行結果:
6 3 3 6 6
値渡しでは、関数を呼び出した際に実引数の値が仮引数に渡され関数内の処理が行われています。その後の処理で再度実引数の値を確認しても、変数の値$exは3のままになっています。
一方参照渡しでは、関数を呼び出す前の変数$exは代入された値のままになっていますが、関数を呼び出した後は値が変更されているので、値が6と変わっていますね。ただPHPでは実際のプロジェクトではあまり参照渡しはしないので、こう言う方法があるくらいに覚えて起きましょう。
引数のデフォルト値を設定する
引数を使用するように定義した関数でも、引数を省略して実行することができます。そして、引数が渡されなかった場合のデフォルト値(初期値)を設定することもできます。
書き方:
function 関数名($値 = デフォルト値) { 実行処理 }
以下に引数のデフォルト値を設定して、関数の処理を実行する方法を記述します。サンプルプログラム:
<?php function fruits($value = 'orange'){ echo 'これは'.$value.'です。'; echo '<br>'; } fruits(); fruits(null); fruits('banana'); ?>
実行結果:
これはorangeです。 これはです。 これはbananaです。
サンプルでは、fruits関数の引数$valueのデフォルト値を’orange’に設定してあります。最初のfruits関数の呼び出しでは引数を指定していないので、引数$valueのデフォルト値’orange’が使用されています。
次の呼び出しではnullを渡していますので、引数$valueはnullとなり何も表示されていません。
最後の呼び出しでは’banana’を渡していますので、引数$valueは’banana’となり表示されています。デフォルト値のある引数はデフォルト値がない引数より後に記述しなければいけません。
複数の引数を指定する
関数には引数を複数指定することも可能です。引数を複数指定する場合は、カンマ(,)を用いて引数を書いていきます。書き方:
function 関数名($値1, $値2, $値3) { 実行処理 }
例えば関数の中で配列に含まれている特定の値を調べたい場合、引数に検索する対象の値と配列を指定して処理を実行することもできます。以下に引数を複数指定して、関数の処理を実行する方法を記述します。
サンプルプログラム:
<?php //3つの仮引数をカンマで区切って書く function fruits ($fruit, $count, $price) { echo $fruit. '1つの値段は'. $price. '円です。<br>'; echo $fruit. $count. 'つで金額は'.$count * $price. '円になります。<br>'; echo '<br>'; } //3つの実引数もカンマで区切って書く fruits('リンゴ', 3, 120); fruits('オレンジ', 5, 100); fruits('メロン', 2, 780); ?>
実行結果:
リンゴ1つの値段は120円です。 リンゴ3つで金額は360円になります。 オレンジ1つの値段は100円です。 オレンジ5つで金額は500円になります。 メロン1つの値段は780円です。 メロン2つで金額は1560円になります。
関数fruitsに仮引数で果物の$fruitと個数の$countと値段の$priceをカンマで区切って入れました。関数の呼び出しでは、リンゴとオレンジ、メロンのそれぞれの個数と値段を実引数に入れ処理を行なっています。
引数が複数ある場合、仮引数と実引数のそれぞれの場所はリンクしているため注意が必要です。仮引数に書いてある$fruit、$count、$priceの順番通りに実引数を指定しないと実行結果は意味不明な文章になってしまいます。
引数に配列を指定する
関数に渡す引数には、数値や文字列などの値だけではなく、真偽値や配列などを指定することもできます。以下に文字列と数値が設定されている配列をそれぞれ引数で渡して、関数の中で処理を実行する方法を記述します。
サンプルプログラム:
<?php function foo($array){ foreach($array as $value){ echo $value; echo '<br>'; } } $fruits_array = ['apple', 'orange', 'melon', 'banana', 'pineapple']; //文字列の配列を渡す foo($fruits_array); $value_array = [100,200,300,400,500]; //数値の配列を渡す foo($value_array); ?>
実行結果:
apple orange melon banana pineapple 100 200 300 400 500
サンプルでは、文字列と数値の値が設定された配列を、それぞれ関数の引数に渡しています。関数fooでは、呼び出された配列の引数を元にforeach文で配列の要素を取得しています。
PHPで関数を扱う注意点として、JavaやCなどのプログラミング言語は、引数に渡す型を明確に指定する必要がありますが、PHPでは引数に渡す型を指定する必要がありません。
そのため、関数の中の処理で配列の引数を渡す前提で処理を記述しても、引数で渡された値が配列以外だった場合、正常に処理されずに思わぬ不具合を引き起こす要因ともなります。関数で渡す引数については、十分に注意しましょう。
他にも、関数の中で配列に含まれている特定の値を調べたい場合、引数に検索する対象の値と配列を指定して処理を実行することもできます。以下に引数を複数指定して、関数の処理を実行する方法を記述します。
サンプルプログラム:
<?php // 第一引数:配列 第二引数:検索する値 function fruits($array, $search){ if (in_array($search, $array)){ echo $search.'は存在します。'; } else{ echo $search.'は存在しません。'; } echo '<br>'; } $fruits_array = ['apple', 'orange', 'melon', 'banana', 'pineapple']; $fruits1 = 'orange'; fruits($fruits_array, $fruits1); $fruits2 = 'strawberry'; fruits($fruits_array, $fruits2); ?>
実行結果:
orangeは存在します。 strawberryは存在しません。
サンプルでは、配列と検索する値を関数の引数で渡し、関数の中でin_array関数を使用して、配列の中に引数で渡した検索する値が配列の中に存在するかチェックしています。
このように関数と引数をうまく利用すれば、処理ごとに条件文を記述する必要がなく、関数を呼び出すだけで特定の処理が実行できることがわかりますね! なお、サンプルで使用したin_array関数については、以下の記事でも詳しく解説していますので、ぜひ参考にしてください。
コマンドライン引数とは
PHPのプログラムはコマンドラインから実行することができます。コマンドラインとはキーボードからコマンドを打ち込むツールです。
Windowsであればコマンドプロンプト、MacやLinuxであればターミナルを使用します。コマンドラインからの実行時にプログラムに渡す値を、コマンドライン引数といいます。
コマンドライン引数の使い方
コマンドライン引数は以下のように指定します。コマンドラインからの実行方法:
> php 実行プログラム名 引数1 引数2 引数3…
変数$argvにコマンドライン引数が格納され、プログラム内で使用することができます。$argvは文字列の配列であり、$argv[0]には実行プログラム名、$argv[1]には引数1、$argv[2]には引数2のように値が格納されています。
$argv[0]はコマンドライン引数ではない点に注意してください。コマンドライン引数を使ったサンプルです。
サンプルプログラム:
<?php $num1 = intval($argv[1]); $num2 = intval($argv[2]); $sum = $num1 + $num2; echo $num1.' + '.$num2.' = '.$sum ?>
コマンドラインからの実行方法:
> php add.php 5 3
実行結果:
5 + 3 = 8
ひとつめの引数$argv[1]を$num1に、ふたつめの引数$argv[2]を$num2に代入しています。intval関数は値を整数に変換する関数です。最後に2つの値の合計を出力しています。
引数リストからオプションを取得する
PHPプログラムをコマンドラインから実行する時に、オプションを指定することもできます。オプションは以下のように指定します。
コマンドラインからの実行方法:
> php 実行プログラム名 -オプション名 オプションの値
オプションはオプション名だけの指定もできますし、複数のオプションを指定することもできます。このオプションをプログラムで受け取るには、getopt関数を使用します。getopt関数は以下のように記述します。
書き方:
array getopt ($取得するオプション名)
引数:取得するオプション名を指定します。
値のないオプションの場合はオプション名をそのまま指定します。値も一緒に取得するオプションは「オプション名:」のようにコロン(:)を後ろにつけます。複数同時に指定することもでき、「-x」オプションと「-y」オプションを同時に取得する場合は「xy」のように指定できます。
戻り値:オプション名と値の連想配列が返ります。
実行時に指定していないオプションをgetopt関数に指定した場合は、配列にそのオプション名のキーは含まれません。値のない「-x」オプションと値のある「-y」オプションを取得するサンプルです。
サンプルプログラム:
<?php // xオプション 値なし var_dump(getopt('x')); // yオプション 値あり var_dump(getopt('y:')); // xオプションとyオプション var_dump(getopt('xy:')); // 指定されていないオプション var_dump(getopt('z')); ?>
コマンドラインからの実行方法:
> php options.php -x -y optval
実行結果:
array(1) { ["x"]=> bool(false) } array(1) { ["y"]=> string(6) "optval" } array(2) { ["x"]=> bool(false) ["y"]=> string(6) "optval" } array(0) { }
var_dump関数は配列の構造をわかりやすく表示する関数で、getopt関数の戻り値を確認するために使用しています。
「getopt(‘x’)」では「-x」オプションを指定しており、戻り値の配列には”x”をキーにした値が格納されています。「-x」オプションは値がないので、”x”に対応する値「bool(false)」に意味はありません。
「getopt(‘y:’)」では「-y」オプションを指定しています。「-y」オプションは値があるのでコロン(:)が必要です。戻り値には”y”とそれに対応する値が格納されています。
「getopt(‘xy:’)」では「-x」オプションと「-y」オプションを同時に指定しています。戻り値には、”x””y”両方が格納されています。
「getopt(‘z’)」は、実行時に指定していないオプションです。戻り値は空の配列になります。
まとめ
今回は、コマンドライン引数、関数の引数について解説しました。引数はPHPに限らず、他の言語でもよく使われますので、この機会に覚えておきましょう。コマンドライン引数、関数の引数について忘れてしまったら、この記事を思い出してくださいね。