PHP、JavaSciptの関数処理記述方法
PHPとJavaScriptでユーザ関数の定義をするとき、引数をもつ関数の場合には以下のような書式を用います。
//PHP
function dullfunction($arg1,$arg2){
return $arg1 + $arg2;
} |
//PHP
function dullfunction($arg1,$arg2){
return $arg1 + $arg2;
}
//JavaScript
function dullfunction(arg1,arg2){
return arg1 + arg2;
} |
//JavaScript
function dullfunction(arg1,arg2){
return arg1 + arg2;
}
何の変哲も無い、プログラミング言語普遍の関数定義ですね。これは関数の引数が2つであると決まっている場合の書き方になります。arg1、arg2と書いているのが引数(argument)になります。
定義した関数の数より少ない引数を与える場合
上で例に挙げた関数では、そもそも処理内容的に引数が二つとも揃っていないとエラーになってしまいます。それならば、内部処理が2つの引数を必ずしも必要としない関数であれば、定義より少ない関数を与えても大丈夫なのか、という話ですが、PHPとJavaScriptの場合はそこら辺を柔軟に解決しています。
PHPの場合には、無視される可能性のある引数にデフォルト値を設定する事でエラーを抑えます。
//PHP
function dullfunction($arg1,$arg2=null){
return "ダルい";
}
dullfunction(); //これはエラー
dullfunction(100); //$arg1には100が与えられる。$arg2はnull。エラーにはならない。
dullfunction(100,200); //$arg1に100、$arg2に200が与えられる。エラーにはならない。 |
//PHP
function dullfunction($arg1,$arg2=null){
return "ダルい";
}
dullfunction(); //これはエラー
dullfunction(100); //$arg1には100が与えられる。$arg2はnull。エラーにはならない。
dullfunction(100,200); //$arg1に100、$arg2に200が与えられる。エラーにはならない。
関数定義中の引数部分で代入が行えるPHPらしい(ある意味破天荒な)解決です。ただし、デフォルト値を与える引数は必ず与えない引数の後に書くようにしないといけません。
JavaScriptの場合、与えられた引数の数が関数定義より少なくても、全く問題がありません。
//JavaScript
function dullfunction(arg1,arg2){
return "ダルい";
}
dullfunction(); //問
dullfunction(100); //題
dullfunction(100,200); //ナシ |
//JavaScript
function dullfunction(arg1,arg2){
return "ダルい";
}
dullfunction(); //問
dullfunction(100); //題
dullfunction(100,200); //ナシ
この辺が入門用言語としてポピュラーな理由かもしれません。WEB制作者の中には、JavaScriptは気付いたら使えるようになっていたという習得歴の方もいらっしゃるかもしれません。私もそうでした。
関数が受け付ける引数の数を無制限にしたいとき(可変長引数)
表題の通り、引数の数を無制限にしたい場合です。たとえば与えられた引数全ての和を求めるというのは、よくある処理です。
PHPの場合は、とりあえず引数を持たない関数として定義しておいて、関数内部から実際に与えられた引数にアクセスする関数を呼び出します。この、あらゆるものを関数として用意してしまうようなところがPHP的だと言えるのですが、まあそれはどうでも良い事ですね。
//PHP
function dullfunction(){
$sum = 0;
$num = func_num_args();
for($i=0;i<$num;$i++){
$sum += func_get_arg($i);
}
return $sum;
}
//もしくは…
function dullfunction(){
$sum = 0;
$arglist = func_get_args();
for($i=0;i<count($arglist);$i++){
$sum += $arglist[$i];
}
return $sum;
}
dullfunction(100,200...); //お好きな数どうぞ |
//PHP
function dullfunction(){
$sum = 0;
$num = func_num_args();
for($i=0;i<$num;$i++){
$sum += func_get_arg($i);
}
return $sum;
}
//もしくは…
function dullfunction(){
$sum = 0;
$arglist = func_get_args();
for($i=0;i<count($arglist);$i++){
$sum += $arglist[$i];
}
return $sum;
}
dullfunction(100,200...); //お好きな数どうぞ
func_num_args()という引数の数を返す関数と、func_get_arg()/func_get_args()という引数そのものをインデックス指定で/配列として 返す関数があります。
JavaScriptの場合、関数定義とは関数オブジェクトを作るということであり、関数オブジェクトには与えられた引数を自動的に格納するargumentsプロパティがあります。したがって、実は定義式での引数の数の宣言もへったくれも無いわけです。引数が何個来ようが、不真面目にargumentsプロパティにアクセスすればいいのです。
//JavaScript
function dullfunction(){
var sum = 0;
for(i=0;i<dullfunction.arguments.length;i++){
sum += dullfunction.arguments[i];
}
return sum;
}
dullfunction(100,200...); //お好きな数どうぞ |
//JavaScript
function dullfunction(){
var sum = 0;
for(i=0;i<dullfunction.arguments.length;i++){
sum += dullfunction.arguments[i];
}
return sum;
}
dullfunction(100,200...); //お好きな数どうぞ
PHPもJavaScriptも、かなりゆるい言語であることがわかりましたね。そしてゆるさの性格の違いも、垣間見えたのではないかと思います。