関数

関数を定義する

関数を定義する(function)

functionを使用して、関数を定義します。

tashizan関数を定義する(test1.php)

    <?php

        // 引数との加算関数
        function tashizan( $number ) {

            return $number + 50;
        }

        // tashizan()関数を呼び出します
        echo tashizan( 50 );
    ?>
    

上記のスクリプトでは、functionに続けて任意の関数名「tashizan」を指定しています。

このtashizan()関数は、引数として渡される変数$numberに50の加算を行います。よって、関数名の変数に続けて「()かっこ」の中に、引数を記述します。なお、関数の範囲を明示するために「{}(中かっこ)」で、実行するコードを囲います。

関数を実行するためには、関数名に「()かっこ」を付けて呼び出します。もし、引数が必要な場合は、「()かっこ」に記述します。

実行結果

100

また、下記の関数のように、複数の引数を渡すこともできます。その際には、引数を「,(カンマ)」で区切って並べます。

複数の引数を渡すkakezan関数を定義する(test2.php)

    <?php

        function kakezan( $number1, $number2 ) {

            return $number1 * $number2;
        }

        // kakezan()関数を呼び出します
        echo kakezan( 10, 20 );
    ?>
    

実行結果

200

引数を渡す

関数に引数を渡す

前節のスクリプトのように、関数では引数を使用して値を渡すことができます。引数は「,(カンマ)」で区切ることによって、複数指定することができ、また、その引数に配列を渡すこともできます。

引数に配列を渡すwarizan関数を定義する(test3.php)

    <?php

        // 引数に配列を指定します
        function warizan( $number ) {

            return $number[0] / $number[1];
        }

        // warizan()関数を実行します
        echo warizan( array( 3000, 10 ) );
    ?>
    

実行結果

300

上記スクリプトでは、「echo warizan( array( 3000, 10 ) );」の「array( 3000, 10 )」の「3000」と「10」はそれぞれ[0]と[1]に格納され、「3000/10」という計算がされています。

関数の参照渡し

引数名に「&(アンパサンド)」を付けると、引数を参照渡しで渡すことができます。引数を参照渡しにすると、参照先の変数の値を変更することができます。

参照渡しで引数を渡す

    <?php

        // 引数参照渡しで渡します
        function job( &$syokugyo ) {

            $syokugyo = '会社員';
        }

        $str = '大学生';
        echo "関数実行前の¥$str : $str<br />¥n";

        // job()関数を実行します
        job( $str );
        echo "関数実行後の¥$str : $str";
    ?>
    

実行結果

関数実行前の$str : 大学生
関数実行後の$str : 会社員

上記の関数の実行結果を見てみると、変数$strには初期値として「大学生」がセットされています。しかし、job()関数の実行後には、「会社員」に変更されていることがわかります。

デフォルト引数値

PHPで定義される関数では、※スカラー引数に関して以下のようにC++スタイルのデフォルト値を定義することができます。

引数にデフォルト値を指定する

    <?php

        function job( $syokugyo = "大学生" ) {

            return "職業は $syokugyo です。<br />¥n";
        }

        echo job();
        echo job( "会社員" );
    ?>
    

実行結果

職業は 大学生 です。
職業は 会社員 です。

上記のスクリプトでは、「job( $syokugyo = "大学生" )」によって、$syokugyoはデフォルトで「大学生」となっています。以上から「echo job();」の「job()関数」を引数に何もない状態で実行すると必ず「大学生」が出力されます。

返り値

関数の返り値を返す(return)

関数を実行した結果を得るためには、returnを使います。

returnで関数の実行結果を返す

    <?php

        // 引数と100の乗算関数
        function kakezan( $number ) {

            return $number * 100;
        }

        // kakezan()関数を呼び出します
        echo kakezan( 4 );
    ?>
    

上記の関数では、計算式「$number * 100」の結果をreturnで返しています。よって、関数を呼び出したechoの出力結果に、kakezan()関数の計算結果が表示されます。

returnは複数の値を返すことができません。しかし、値ではなく配列を返すことによって、複数の値を返すことができます。

実行結果

400

返り値に配列を指定する

    <?php

        // 返り値を配列で返します
        function kakezan( $number1, $number2 ) {

            $number1 = $number1 * 100;
            $number2 = $number2 * 1000;

            return array( $number1, $number2 );
        }

        // kakezan()関数を実行します
        list( $result1, $result2 ) = kakezan( 5, 6 );

        echo "$result1<br />¥n";
        echo "$result2";
    ?>
    

実行結果

500
6000

ファイルを読み込む

require文

よく使う関数は別ファイルに用意しておき、複数ページで共通に利用できるようにしておけば、同じ関数を何度もコードに書くよりは、はるかに手間が省けます。

別ファイルにまとめたプログラム処理を読み込むことができれば、開発の効率やメンテナンスの点で非常に有用です。

require()関数は、スクリプト内で別ファイルを読み込むことができます。

実際にスクリプト内で別ファイルを読み込んでみます。まず、読み込む対照の「language.php」ファイルを作成します。

language.phpのソース

    <?php
        define( "language", "PHP" );
    ?>
    

次に、require()関数でlanguage.phpを読み込みます。

language.phpを呼び出すスクリプト

    <?php
        require( "language.php" );
        echo language;
    ?>
    

上記のスクリプトでは、require文の引数に、読み込む対照のファイル名を渡しています。すると、このスクリプトが実行されるとき、指定されたlanguage.phpに置き換えられます。

実行結果

PHP

require_once文

require_once()関数は、require()関数と同様に、スクリプト内で別ファイルを読み込むことができます。ただし、require()関数と異なる点は、require()関数は外部ファイルを取り込む回数に制限がないのに対して、require_once()関数は外部ファイルを1回だけ取り込みます。

例えば、「a.php」に「b.php」をrequire()関数で読み込んだ場合、「b.php」に「a.php」のrequire()命令が記述されていた場合、無限ループになってしまいます。

include文

require()関数と同様にinclude()関数も、スクリプト内で別ファイルを読み込むことができます。

これから記述するスクリプトは、ループ処理の中にinclude文を置いて、毎回異なるファイルを読み込むようにしています。

include文で繰り返し実行する(include.php)

    <?php

        for( $i=1 ; $i<=3 ; $i++ ) {

            include( "test" . $i . ".php" );
        }
    ?>
    

上記のスクリプトでは、ループが実行されるたびに「test1.php」「test2.php」「test3.php」のファイルが存在した場合、各phpファイルを読み込んでいます。読み込む対照の各phpファイルは、同章でtashizan関数、kakezan関数、warizan関数をそれぞれ定義したファイルです。

実行結果

100200300

include_once文

include_once()関数は、include()関数と同様に、スクリプト内で別ファイルを読み込むことができます。include_once()関数も、require()関数とrequire_once()関数との違いと同様に、include_once()関数は外部ファイルを1回だけ取り込みます。

require()とinclude()の違い

require()とinclude()は、エラーの扱い方を除けば、その振る舞いは全く同じです。エラーが発生するとinclude()は「Warning」を出力しますが、require()を使用している場合は「Fatal Error」となります。

言い換えると、指定されたファイルが無い場合に処理を停止したい場合は、require()を使用した方が良いということになります。 include()を使用すると、読み込むべきファイルが存在しない場合も処理が続行されます。

具体的に、include()文で記述したスクリプトを使用して、実際に読み込むべきファイル「test2.php」が存在しない場合、require()とinclude()では結果にどのような違いが現れるかを試してみます。

存在しない「test2.php」をrecuire()で読み込む

    <?php

        for( $i=1 ; $i<=3 ; $i++ ) {

            require( "test" . $i . ".php" );
        }
    ?>
    

実行結果

100

Warning: require(test2.php) [function.require]: failed to open stream: No such file or directory in C:\require.php on line 5

Fatal error: require() [function.require]: Failed opening required 'test2.php' (include_path='.;C:\xampp\php\pear\') in C:\require.php on line 5

上記のスクリプトでは、「test1.php」を読み込んだ後、次に読み込もうとした「test2.php」が存在しないため処理を停止し、「Fatal Error」を表示しています。

存在しない「test2.php」をinclude()で読み込む

    <?php

        for( $i=1 ; $i<=3 ; $i++ ) {

            include( "test" . $i . ".php" );
        }
    ?>
    

実行結果

100

Warning: include(test2.php) [function.include]: failed to open stream: No such file or directory in C:\include.php on line 5

Warning: include() [function.include]: Failed opening 'test2.php' for inclusion (include_path='.;C:\xampp\php\pear\') in C:\include.php on line 5

300

上記のスクリプトでは、「test1.php」を読み込んだ後、次に読み込もうとした「test2.php」が存在しないため「Warning 」を表示しています。しかし、処理は停止することなく、次の「test3.php」を読み込み、最後まで処理が続行されました。