【独学PHP】関数の基本

※この記事は「2020年9月11日」に更新しました。

独学できる PHP講座。

今回は、関数の基本について。

前回は、繰り返し処理(forなど)について、解説しました。

【独学PHP】繰り返し処理(forなど)

【独学PHP】繰り返し処理(forなど)

2020年9月4日

関数の基本

関数は、いくつかの引数(入力値)を与えることによって、決められた処理を行い、戻り値(結果)を返す仕組みのことです。

つまり、ひとまとまりの処理を行ってくれる機能のことです。

例えば、今まで使ったものだと print_r関数があります。

PHP は、最初から関数が豊富に用意されているので、提供されているものを組み合わせるだけでも自分のプログラムをある程度構築できるようになっています。



関数の呼び出し

関数の呼び出しは以下のように記述します。

戻り値 = 関数名(引数1, 引数2, …);

引数は、一つのときもありますし、必要ない場合もあります。

戻り値がない関数もあり、その場合は以下のように記述しても構いません。

関数名(引数1, 引数2, …);

関数の定義

print_r は、定義済みの関数で内部関数と言います。

これに対して、自分で定義する関数をユーザー定義関数と言います。

function命令を使って、定義します。

function 関数名(仮引数1, 仮引数2, …) {
    // 処理
    return 戻り値;
}

関数名は、識別子の命名規則に従う必要があります。

関数名は、動詞+名詞 の形式で命名するとわかりやすいかと思います。

例えば、getAddress といった感じです。

このように名前を付けると第三者が関数の定義部分を見なくても何をする関数かなんとなく推測できます。

値渡しと参照渡し

関数に引数を渡す方法として、値渡しと参照渡しがあります。

  • 値渡し
  • 参照渡し

順番に解説していきます。

値渡し

引数を値として渡して、関数内でその値を変更したとしても呼び出し元の変数の値に影響はありません。

値渡しのサンプルプログラムです。

<?php

function setName($setName_name){
    $setName_name = "鈴木";
}

$name = "本田";
print "私は、{$name}です。<br />";

setName($name);
print "私は、{$name}です。<br />";

?>

実行結果は以下の通りです。

値渡し

参照渡し

引数として渡された値を関数内で変更したときに呼び出し元の変数の値も変更したいときに使います。

ただし、参照渡しは使い方を間違うと処理の流れをわかりにくくする原因にもなります。

基本は値渡しを使いましょう。

参照渡しのサンプルプログラムです。

<?php

function setName(&$setName_name){
    $setName_name = "鈴木";
}

$name = "本田";
print "私は、{$name}です。<br />";

setName($name);
print "私は、{$name}です。<br />";

?>

実行結果は以下の通りです。

参照渡し

値渡しと異なる点は、変数の前に &(アンパサンド)をつけているところです(仮引数部分)。

引数、戻り値の型宣言(PHP7)

PHP7 で型宣言が本格的に使えるようになりました。

PHP5 でも、タイプヒンティング(型宣言)は存在しましたが、戻り値の型宣言ができなかったり、他にも色々制限がありました。

PHP は、良くも悪くも型に対して柔軟なプログラミング言語です。

しかし、場合によっては、明示的に型を指定したいときもあります。

不正な型が渡されるのを未然に防ぐことができるからです。

function 関数名(引数の型 仮引数1, 引数の型 仮引数2): 戻り値の型 {
    // 処理
    return 戻り値;
}

関数のモジュール化

ユーザー定義関数は、複数のスクリプトで共有することが多いです。

関数をモジュール化、つまり、部品として独立させると使いやすくなります。

別ファイルで保存して、それぞれのスクリプトからはインクルードするのがおすすめです。

  • include_once ‘スクリプトファイルのパス’
  • require_once ‘スクリプトファイルのパス’
  • include ‘スクリプトファイルのパス’
  • require ‘スクリプトファイルのパス’

include は、エラーになったときに、警告を発するだけで、その先の処理は継続して行われます。

それに対して、require は、エラーになったとき、致命的なエラーとして、その先の処理を中断します。

once あるなしの違いは、指定ファイルを何度も読み込むかどうかです。

基本的には、include_once、require_once を使うようにしましょう。

循環呼び出しのような不具合を未然に防ぐことができます。

最後に

いかがでしょうか。

今回は、関数について、解説しました。

ユーザー定義関数は、コーディング時間とメンテナンス性にも関わる部分です。

上手く活用すれば便利なので、徐々に慣れていきましょう。