関数は、次のような構文で定義されます。
function foo( $arg_1, $arg_2, ..., $arg_n ) {
echo "関数の例です。\n";
return $retval;
}
関数の中では、他の関数や クラス 定義 を含む PHP3 のあらゆる有効なコードを使用することができます。
オプションの return 文により値を返すことができます。 リストやオブジェクトを含むあらゆる型を返すことができます。
function my_sqrt( $num ) {
return $num * $num;
}
echo my_sqrt( 4 ); // '16' を出力します。
複数の値を返すことはできませんが、リストを返すことにより 同じ効果を得ることができます。
function foo() {
return array( 0, 1, 2 );
}
list( $zero, $one, $two ) = foo();
引数のリストにより関数へ情報を渡すことができます。 このリストは、カンマで区切られた変数や定数のリストです。
PHP3 は、値渡し(デフォルト)、 参照渡し、 デフォルト引数値 をサポートしています。 可変長引数はサポートしていませんが、 配列を渡すことにより、同様の効果が得られます。
デフォルトで、関数の引数は値で渡されます。 関数がその引数を修正できるようにするには、その引数を参照渡しと する必要があります。
関数の引数を常に参照渡しとしたい場合には、関数定義において アンパサンド(&) を引数名の前に付加することができます。
function foo( &$bar ) {
$bar .= ' and something extra.';
}
$str = 'This is a string, ';
foo2( $str );
echo $str; // 'This is a string, and something extra.' を出力します
変数へある変数を参照渡しとしたいが、デフォルトでは参照渡しではない 場合、関数コール時に引数名の前にアンパサンドを付加することができます。
function foo( $bar ) {
$bar .= ' and something extra.';
}
$str = 'This is a string, ';
foo2( $str );
echo $str; // 'This is a string, ' を出力します
foo2( &$str );
echo $str; // 'This is a string, and something extra.' を出力します
関数は、スカラー引数に関して次のように C++ スタイルのデフォルト値を 定義することができます。
function makecoffee( $type = "cappucino" ) {
echo "一杯の $type を作ります\n";
}
echo makecoffee();
echo makecoffee( "espresso" );
上のコードにより、次のような出力が行われます。
一杯の cappucino を作ります
一杯の espresso を作ります
デフォルト引数の機能を使うとき、全てのデフォルト値は、 デフォルト値としない引数の右側にある必要があります。 そうしないと、期待通りの動作は得られないでしょう。 次の短いコードを見てみましょう。
function makeyogurt( $type = "acidophilus", $flavour ) {
return "ボール一杯の $type $flavour を作ります。\n";
}
echo makeyogurt( "raspberry" ); // 期待通りには動作しません
上記の例の出力は次のようになります。
Warning: Missing argument 2 in call to makeyogurt() in /usr/local/etc/httpd/htdocs/php3test/functest.html on line 41
ボール一杯の raspberry を作ります。
ここで、上の例を次のコードと比べてみましょう。
function makeyogurt( $flavour, $type = "acidophilus" ) {
return "ボール一杯の $type $flavour を作ります。\n";
}
echo makeyogurt( "raspberry" ); // 期待通りに動作します
この例の出力は、次のようになります。
ボール一杯の acidophilus raspberry を作ります。