10日で覚えるPHPのキソ 第 7 回 関数

No Photo

第 7 回は、関数についてお話します。

print_rやarrayなど、今までにもすでにいくつか関数が出てきています。
関数とはどのような働きをするものなのでしょうか?

関数とは?

080512_ichikawa_02.gif

今までの回では、関数は「命令するもの」と説明してきました。
もう少し詳しく言うと、「ひとまとまりの処理を行ってくれる機能の事」です。
関数の機能を記述することを「関数を定義する」といいます。
関数は定義するだけでは機能しません。呼び出して、初めて処理が実行されます。

関数のイメージは、ブラックボックス。
渡された値(引数)を指示通りに処理し、結果を返してくれる箱のようなものです。
処理の材料となる値のことを引数(パラメータ)といい、結果の値のことを戻り値(返り値)といいます。

例えば、date関数を例にとってみましょう。

080512_ichikawa_01.gif

date関数に、引数「Y」を渡します。

<?php
    print date("Y");
?>
ブラウザからアクセスすると、戻り値が表示されます。
(date関数は、引数Yを渡すと現在の4桁の年を数値で返してくれます。)
2008
  • 引数(ひきすう)
  • 関数を呼び出す時に渡す情報。それを元に結果(戻り値)が返ってくる。

  • 戻り値
  • 引数を元に処理を行い、返ってくる結果。

※ 中には引数を必要としない関数や戻り値を返さない関数もあります。

関数の種類

関数には大きく分けて以下の2通りがあります。

  • 内部関数(ビルトイン関数)
  • ユーザー定義関数

それでは、内部関数から説明していきましょう。

内部関数(ビルトイン関数)

PHPにあらかじめ用意されている関数です。
今までに出てきたprint_rやarrayは内部関数です。
PHPには便利な関数がたくさん用意されています。

次は、ユーザー定義関数です。

ユーザー定義関数

関数は、自分で定義する(作る)ことも出来ます。それがユーザー定義関数です。
内部関数とは違い、自分でオリジナルな処理をまとめてひとつの関数として定義する事ができます。
ユーザー定義関数の中では、内部関数などPHPのプログラムとして有効なものを使用することができます。
ユーザー定義関数の名前は基本的に自由ですが、【動詞】または【動詞+名詞】となるように命名すると分かりやすいでしょう。
この時、動詞は全て小文字で記述し、名詞の頭文字を大文字、2文字目以降を小文字で記述することが推奨されています。
(例)
get()
getInstance()

Zendコーディング指針 命名規則

関数のオンラインリファレンスの使い方

PHPには内部関数が1000以上用意されています。
それらをすべて覚えるのは大変です。必要なものから調べていくようにしましょう。
関数の働きをリファレンスで調べたい時は下記のURLにアクセスします。

  • http://php.net/関数名

例えば、dateという関数を調べたい時には、
http://php.net/date
とします。(自動的に日本語のサイトに遷移します。)

080512_ichikawa_08.gif

他にも、PHPマニュアルから検索することもできます。
(Windowsをお使いの方であれば、chm版のマニュアルをダウンロードしてローカルで使用することも可能です。)

関数の定義と呼び出し

関数定義の{}の中の処理は、関数を呼び出した時に実行されます。

<?php
    // 関数の定義
    /*
    function 関数名(引数) {
        処理
    }
    */
    function samplefunc($a) {
        print $a;
    }

    // 関数の呼び出し
    // 関数名(引数);
    $word = "PHPのキソ";
    samplefunc($word);
?>

ブラウザの表示は…

PHPのキソ

ユーザー定義関数を記述する場所

080512_ichikawa_07.gif

ユーザ定義関数を記述する場所は、関数を呼び出す位置の前でも後でもどちらでもOKです。

ユーザー定義関数を作ってみる

080512_ichikawa_09.gif

例えば、2つの値の合計を求める関数を作ってみましょう。

  • 関数を定義する時の書き始めは「function」
  • $aと$bは、引数を格納する変数です。(変数・配列を指定できます。)
  • 関数名は半角英数字と_(アンダースコア)が使えます。
    (先頭が数字はNG。大文字と小文字は区別されません。)
  • return文で関数を終了し、戻り値を返します。
080512_ichikawa_03.gif
<?php
    function addNum($a, $b) {
        $add = $a + $b;
        return $add ;
    }
    // 戻り値を$totalに格納
    $total = addNum(2, 3);
    print $total;
?>

ブラウザで表示させると…

5

戻り値や引数を持たない関数

関数で返す値がない時は、戻り値を指定する必要はありません。
下記のプログラムで書かれている戻り値のないreturnは省略可能です。

<?php
    function printNum($a) {
        print "引数の値は".$a."です";
        // 関数を終了します。戻り値は返しません。
        return;
    }
?>

また、引数が必要ないときには次のように関数を定義します。
引数はなくても必ず()は必要です。

<?php
    function printHello() {
        print "Hello PHP!!";
    }
?>

引数の値渡しと参照渡し

関数の引数には2種類のタイプがあります。

  • 引数の値渡し
  • 通常、関数への引数は値を直接渡すので、関数内でその値を変更しても、呼び出し元の変数の値に影響を与えることはありません。

  • 引数の参照渡し(リファレンス渡し)
  • 引数の変数の前に「&」がある場合、関数内でその値を変更すると、呼び出し元の変数の値に影響を与えます。この事を「参照渡し」といいます。

    ※ PHP 5以降、デフォルトで値は参照渡しとなります。

この違いは、送った引数の値を変更する変数なのか、そうでないかです。
実際、プログラムを書いてみましょう。

まずは値渡しから

080512_ichikawa_04.gif
<?php
    // 関数を定義します。
    function getMenu($a) {
        $a = "Coffee";
    }
    $b = "Tea";
    echo "頼んだメニューは".$b."です<br />";

    // 引数は値渡しです。
    getMenu($b);
    echo "頼んだメニューは".$b."です";
?>

ブラウザの表示は…

頼んだメニューはTeaです
頼んだメニューはTeaです

次に参照渡し

080512_ichikawa_05.gif
<?php
    // 関数を定義します。
    function getMenu(&$a) {
        $a = "Coffee";
    }
    $b = "Tea";
    // この時点では$bの値は"Tea"
    echo "頼んだメニューは".$b."です<br />";
    // 引数は参照渡しです。
    getMenu($b);
    // 引数の参照渡しにより、$bの値は"Coffee"に
    echo "頼んだメニューは".$b."です<br />";
?>

ブラウザの表示は…

頼んだメニューはTeaです
頼んだメニューはCoffeeです

デフォルト引数

引数にはデフォルト値を設定できます。

080512_ichikawa_06.gif
<?php
    function getMenu($a = 'Drink') {
        print $a."<br />";
    }
    // 引数を設定
    getMenu('Tea');
    // 引数を設定しないとデフォルト値が適応される。
    getMenu();
?>

引数の必要なユーザー定義関数で引数と指定しない場合エラーとなりますが、デフォルト値が設定してある場合に引数を指定しないと、デフォルト値が適応されます。

ブラウザからの表示は…

Tea
Drink

引数のデフォルト値を使用する際には、デフォルト値を持つ引数はデフォルト値がない引数の右側に全てなければいけません。
以下のプログラムはエラーです。

<?php
    function getDrink($a = "Drink", $b) {
        print $a."<br />";
        print $b;
    }

    getDrink("Tea");
?>

下記のようなエラーが出ます。

Warning: Missing argument 2 for getDrink(), called in /home/phptest/phpsample.php on line 7 and defined in /home/phptest/phpsample.php on line 2
Tea

正しいプログラムに直します。デフォルト値を持つ引数を右側にします。

<?php
    function getDrink($b, $a = "Drink") {
        print $a."<br />";
        print $b;
    }

    getDrink("Tea");
?>

ブラウザの表示は…

Drink
Tea

言語構造

echo(), unset(), isset(), empty(), include(), print()などは、関数と似たような働きをしますが、関数ではありません。
言語構造と呼ばれます。
そのため、関数とは違い、引数を必ずしもカッコで括る必要はありません。

第 7 回 まとめ

  • 関数とは、ひとまとまりの処理を行う機能
  • 関数には内部関数(定義済みの関数)とユーザー定義関数(自分で定義する関数)がある。
  • 引数とは、関数が処理を行うための情報
  • 戻り値とは、関数の処理の結果の値

次回はPOSTとGETについてお話します。

■ 用語集

■ 参考サイト・文献

  • このエントリーをはてなブックマークに追加

この記事を読んだ人にオススメ