Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

  1. トップページ
  2. PHP入門編 - 関数と引数

関数と引数

みなさまどうも。いかがお過ごしでしょうか。

続きまして『関数』とか『引数』とかををやっていきましょう。『関数』は「かんすう」、『引数』は「ひきすう」と読みます。『引数』は「いんすう」じゃないので間違えないようにしましょう。

さて、「『関数』と『引数』ってなにそれ?」ってお話なんですが、一般に『関数』とは『引数』のデータを受け取りそこから何らかの処理を行う一連の処理群のことを指します。『引数』とは関数実行時に渡す値の事です。

と、こんな感じで言葉で説明されてもよく分からないですよね。なので『関数』の概念についてはちょっと置いておいて、先に関数を作るための記述方法を確認していきましょう。その後でこれまで勉強してきた数学の概念と照らしあわせつつ『関数』とはどういうものなのかみていきたいと思います。

プログラム言語によっては関数のような一連の処理群のことを『メソッド』と呼んだりします。

ここがちょっとややこしいのですが、普通に関数定義すると『関数』、オブジェクト(データや処理をまとめたもの)に関数(一連の処理)を突っ込むと『メソッド』になるといった感じになります。

『関数』と『メソッド』の違いについてですが、これはほぼ同じものと思って頂いて問題ありません。一連の処理に名前をつけて保存して後から呼び出せるようにする、という本質的なところは同じなのでただの呼び名の違いになります。一連の処理を保存する場所が違うだけの話です。

例えば完全なるオブジェクト指向型言語である『Ruby』では関数ではなく『メソッド』と呼ぶのが一般的ですが、PHPはそこまでオブジェクト指向で構築された言語ではないので『関数』と呼ぶのが一般的です。

ちなみに『関数』のことを『メソッド』と言ったり、『メソッド』のことを『関数』と言ったりしてしまっても特に問題はありません。

というわけでPHPでの関数定義の記述は以下のような感じです。日本語で書いてみました。

<?php
function 関数名(引数){
    // ここに処理
}

『hoge』という関数名で関数を定義するときはこんな感じになりますね。

<?php
function hoge(){
    // ここに処理
}

では解説していきます。

まず『function』と記載します。『function』の読み方は『ファンクション』です。

そしたら半角スペースを1つ空けて『関数名』を記述します。PHPは半角スペースとかタブ文字とか改行とかはいい感じでシカトしてくれるので、半角スペースを複数記述したりタブ文字に変更したりしても問題なく動きます。しかし、ソースが汚くなりますし全く意味がないので半角スペースを1つだけ置くようにすると良いです。逆に1つ以上の半角スペースを置いてあげないと単語の区切りがなくなってしまい、関数定義文だと認識してくれなくなるのでご注意下さい。

この『関数名』のネーミングルールは変数の時と同じです。もし不安だったら今一度見返してみると良いかもしれません。
※変数のネーミングルールを忘れちゃった方はこちら

と、ここでちょっと注意点です。PHPでは変数名などは大文字と小文字が区別され別のものとして扱われますが、関数名に関しては大文字と小文字が区別されず同じものとして扱われます

ちょっと実験してみましょう。以下のサンプルをみてください。

<?php
function hoge(){
	echo 'hoge';
}

function Hoge(){
	echo 'hoge';
}

PHPでは先に定義した関数を関数定義文では上書きできなかったりするのですが、上記のサンプルも見事にエラーとなります。関数名が『hoge』と『Hoge』で違うのに同じものとして扱われちゃってますね。これ、結構ハマりやすいところなので気をつけてください。特に他のプログラム言語に精通している方は要注意です。

では続けます。関数名のとなりには『引数』を記述します。括弧『()』の部分ですね。『引数』を取る必要がない関数でも『()』は省略できません。関数を定義するときは必ず『()』を記述する必要があるということです。複数の『引数』を取る場合は『,』で区切ります。こんな感じです。

function 関数名(引数1, 引数2, 引数3){
    // ここに処理
}

注意すべきは文のおしりに『;』を書く必要がないということです。関数定義の際は文末の『;』はいらないです。

function 関数名(引数1, 引数2, 引数3){
    // ここに処理
}; // ここの『;』は書く必要がありません。

ちなみに『;』を書いてしまってもエラーにはなりません。PHPでは空文が許可されていますので何も処理を行わない文として処理されます。ただし、ファイルを重くするだけで意味がないので書かないのが一般的です。

このような関数を定義する記述を『function文』(関数宣言文、関数定義文)といいます。

そして『関数』を定義した段階では実行されるというわけではありません。あくまでも定義しただけなので『関数』の中の処理は実行されません。ここ間違いやすいので要注意です。

定義した関数を実行する記述は

関数名(引数);

となります。例えば『hoge』という関数の引数に『1』を渡して実行する場合はこうなります。

hoge(1);

引数を複数渡すときはこうです。『,』で区切ります。

hoge(1, 2, 3);

引数を渡さないで実行する場合はこうです。

hoge();

引数を渡す渡さないに関わらず実行させる際は『()』は必ず記述する必要がある、というところに注意です。『()』は関数を実行するトリガーのような感じですね。

定義した関数を実行したり処理を走らせることを正式には『評価』と呼びます。参考書などでは『評価』と書いてあることが多いですね。

ただし、『評価』という単語だとちょっとイメージしにくい感じがありますので当サイトでは普通に『実行』という単語を使って解説していきます。

と、ここまでが関数定義の方法です。なんとなくご理解いただけましたでしょうか。ではそろそろ関数ってなんなんだぜぇってお話をしていきたいと思います。これまでと同じく数学と照らしあわせてみていきましょう。

(´-`).。oO(プログラミングの本質は数学と同じなのでございます...)

まずこんな数式があるとします。

1 + 1 = 2

『1 + 1 = 2』というだけの式ですね。これは『2』という答えが出るだけの数式で全く汎用性はありません。これを方程式にして色々な値をとれるようにしてみましょう。

x + 1 = y

こうすると『x』に代入した値に『1』が加算されたものが『y』となる数式になりました。

簡単な数学レベルだとこの辺で「『x = 1』の場合の『y』を求めよ!」とか言われて自分で計算するわけでございますが、プログラミングの世界ではちょっと違った形で進めていきます。

数学と大きく違う点は『自分で計算をしない』ということです。コンピューターに計算させる演算式を書くのがプログラマーの仕事です。

(´-`).。oO(たまに思うのですが、このウェブサイトは私が構築したわけでありまして...)

(´-`).。oO(ということは、このサーバーは24時間年中無休で文句も言わず壊れるまで永遠と私なんかが書いたプログラム通りに処理を続けてくれているわけでありまして...)

(´-`).。oO(そう考えるとサーバー君(パソコン君)は本当に可愛いやつでございますね...)

そしてプログラミングの世界では何度か使う可能性のある処理を構築した場合はその処理をいつでも呼び出せるようにしておきたいと考えます。変数の時と同じですね。よく使う値は変数に入れていつでも呼び出せるようにしておくのが合理的です。関数も然りです。

というわけで先ほどの数式をPHPで実装してみましょう。

処理の内容は「変数『x』の値に1を足した数値を変数『y』に代入し、その値を文字列として出力する処理を関数として定義し、いつでも呼び出せるようにする」という感じです。

処理をいつでも呼び出して実行できる状態にしたい、ということは呼び出すための名前が必要ですね。ということでまず関数(処理)に識別するための名前をつけましょう。これが『関数名』です。

今回は『addition』という関数名で関数を定義してみます。こんな感じになりますね。まだ中身は空でございます。

<?php
function addition(){

}

引数の『()』を忘れないよう要注意です。そして『{}』の中に処理を書きます。「変数『x』の値に1を足した数値を変数『y』に代入し、その値をコンソールに出力する」というわけなので普通に書くとこんな感じになります。

<?php
function addition(){
    $x = 1;
    $y = $x + 1;

    echo $y;
}

加算処理がありますので仮で変数『x』には数値の『1』を初期値として代入しています。これでとりあえずの形ですが関数を定義することができました。これを実行してみると以下となります。

<?php
function addition(){
    $x = 1;
    $y = $x + 1;

    echo $y;
}
 
addition(); // 実行します。
2

変数『y』の値がちゃんとされてますね、ここまでは問題なさそうです。

しかし、これではまだ汎用性が高いとはいえません。この記述では変数『x』の値が常に『1』になってしまうので変数『y』はずっと『2』になります。関数を実行させるたびに変数『x』に違った値を渡すことができれば色々な結果を出すことができるのにちょっと惜しい感じです。

そこで登場するのが『引数』です。『引数』を使えばそれが実現できます。書きなおしてみるとこんな感じです。

<?php
function addition($x){
    $y = $x + 1;
    echo $y;
}

注目すべきは変数『x』の記述場所です。『()』の中に変数『x』が移動しています。こうすれば変数『x』が引数となり、関数を実行するたびに値を渡すことができるようになります。というわけでちょっと関数を実行して実験してみましょう。引数に『10』を渡して実行してみます。

<?php
function addition($x){
    $y = $x + 1;
    echo $y;
}
 
addition(10);

これを実行させると以下となります。

11

いかがでしょうか。変数『x』に『1』が加算された数値が出力される処理なので、ちゃんと『11』が出力されています。このように引数を使って関数を定義すると汎用性が高い処理を構築することができます。

関数を定義する際の引数は『仮引数』(かりひきすう)、または『parameter』(パラメーター)と呼ばれます。

対して関数を実行する際に渡した引数は『実引数』(じつひきすう)、または『argument』(アーギュメント)と呼ばれます。

単純に『引数』といったら両方の事を指す感じです。

<?php
function addition($x){ // この『x』は関数定義なので『仮引数』です。
    $y = $x + 1;
    echo $y;
}

addition(10); // この『10』という数値は関数実行時に渡しているので『実引数』です。

ちょっと難しい参考書やプログラミングの公式ドキュメントなどでよく出てくるので何となく覚えておくようにしましょう。現場ではあんまり出てきません。

では練習がてらもうちょっと複雑な処理を構築してみましょう。

他の記事でも紹介しましたが、「三角形の底辺の長さと高さを入力するとその面積を出力してくれる関数」を定義してみます。関数名は『area_of_triangle』にしましょう。

三角形の面積は『底辺 × 高さ ÷ 2』で求められますのでPHPで構築するとこのような形になります。

<?php
// $widthが底辺で$heightが高さです。
function area_of_triangle($width, $height){
    $area = ($width * $height) / 2;

    echo '底辺の長さが『' . $width . '』、高さが『' . $height . '』の三角形の面積は『' . $area . '』です';
}

慣れないとちょっと構文が難しいかもしれませんが頑張って読み解いてみてください。

では動作チェックがてらこれを実行させてみましょう。試しに底辺『10』、高さ『5』を引数に渡して実行してみると

<?php
// $widthが底辺で$heightが高さです。
function area_of_triangle($width, $height){
    $area = ($width * $height) / 2;

    echo '底辺の長さが『' . $width . '』、高さが『' . $height . '』の三角形の面積は『' . $area . '』です';
}
 
area_of_triangle(10, 5);
25

『25』と出力されました。OKですね。これで底辺の長さと高さを渡してあげれば面積を自動で出力してくれる処理が完成しました。これでイタズラがバレてたくさん宿題を出されても怖くありません。

というわけで関数と引数の概念についてはこんな感じですがいかがでしょうか。少し難しかったかもしれません。

変数の場合は値を呼び出すものでしたが、このように関数の場合は数学で言うところの数式を丸ごと呼び出すような感じになりますね。一連の処理をまるごと呼び出して実行できますので頻繁に使用する処理は関数としてまとめてしまえばとっても合理的になります。

関数と引数の概念があまり理解できなくても処理をいっぱい書いていけば自ずと理解できるようになるかと思います。例えば数学の公式なんかを練習がてらPHPで関数化したりしてみると良い経験になること請け合いです。

長くなりましたが以上となります。大分プログラミングっぽくなってきましたが楽しんで頂けてますでしょうか。次の記事ではループ処理とかをやっていきましょう。

ではではこの辺で。またお会いしましょう。

この記事は桜舞が執筆致しました。

著者が愛する小型哺乳類

桜舞 春人 Sakurama Haruto

ISDN時代から様々なコンテンツを制作しているちょっと髪の毛が心配な東京在住のプログラマー。生粋のロングスリーパーで、10時間以上睡眠を取らないと基本的に体調が悪い。好きなだけ寝れる生活を送るのが夢。ゲームとスポーツと音楽が大好き。誰か髪の毛を分けて下さい。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。