PHP入門 第14回 関数
ユーザー定義関数
関数は次のような構文で定義されます。
1 2 3 4 5 6 7 |
<?php function foo($arg_1, $arg_2, /* ..., */ $arg_n) { echo "関数の例\n"; return $retval; } ?> |
関数の中では、他の関数や クラス 定義 を含む PHP のあらゆる有効なコードを使用することができます。
関数名は、PHP の他のラベルと同じ規則に従います。
関数名として有効な 形式は、まず文字かアンダースコアで始まり、その後に任意の数の文字・ 数字・あるいはアンダースコアが続くものです。
PHP では、関数は参照される前に定義されている必要はありません。
ただし以下の二つの例のように、条件付きで関数が 定義されるような場合を除きます。
条件付きの関数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
$makefoo = true;
/* ここでは関数foo()はまだ定義されていないので
コールすることはできません。
しかし関数 bar()はコールできます。 */
bar();
if ($makefoo) {
function foo()
{
echo "I don't exist until program execution reaches me.\n";
}
}
/* ここでは $makefooがtrueと評価されているため
安全にfoo()をコールすることができます。 */
if ($makefoo) foo();
function bar()
{
echo "I exist immediately upon program start.\n";
}
?>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<?php $makefoo = true; /* ここでは関数foo()はまだ定義されていないので コールすることはできません。 しかし関数 bar()はコールできます。 */ bar(); if ($makefoo) { function foo() { echo "I don't exist until program execution reaches me.\n"; } } /* ここでは $makefooがtrueと評価されているため 安全にfoo()をコールすることができます。 */ if ($makefoo) foo(); function bar() { echo "I exist immediately upon program start.\n"; } ?> |
関数の中の関数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
function foo()
{
function bar()
{
echo "I don't exist until foo() is called.\n";
}
}
/* ここでは関数bar()はまだ定義されていないので
コールすることはできません。 */
foo();
/* foo()の実行によって bar()が
定義されるためここではbar()を
コールすることができます。*/
bar();
?>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?php function foo() { function bar() { echo "I don't exist until foo() is called.\n"; } } /* ここでは関数bar()はまだ定義されていないので コールすることはできません。 */ foo(); /* foo()の実行によって bar()が 定義されるためここではbar()を コールすることができます。*/ bar(); ?> |
PHP では、関数やクラスはすべてグローバルスコープです。
関数の内部で定義したものであっても関数の外部からコールできますし、 その逆も可能なのです。
PHP は関数のオーバーロードをサポートしていません。
また、宣言された関数の定義を取り消したり再定義することも できません。
オーバーロードとは、戻り値や引数の数やデータ型が異なる同名の関数やメソッドを複数定義できる機能のことです。
PHP では、関数を再帰的にコールすることが可能です。
ただし、100 から 200 を超えるような再帰呼び出しは避けてください。
そんなことをすると、 スタックが破壊され、スクリプトが異常終了してしまいます。
再帰的な関数
1
2
3
4
5
6
7
8
9
<?php
function recursion($a)
{
if ($a < 20) {
echo "$a\n";
recursion($a + 1);
}
}
?>
1 2 3 4 5 6 7 8 9 |
<?php function recursion($a) { if ($a < 20) { echo "$a\n"; recursion($a + 1); } } ?> |
関数の引数
引数のリストにより関数へ情報を渡すことができます。
このリストは、カンマで区切られた式のリストです。
PHP は、値渡し(デフォルト)、 参照渡し、 デフォルト引数値 をサポートしています。
また、 可変長引数リスト もサポートしてます。
詳しくは、 func_num_args(), func_get_arg(), func_get_args() に関する関数リファレンスを 参照ください。
使用例)
通常の関数の引数
1 2 3 4 5 6 |
<?php function takes_array($input) { echo "$input[0] + $input[1] = ", $input[0]+$input[1]; } ?> |
参照渡しの関数の引数
(PHP5以降ではデフォルトがこの参照渡しになります。
php.iniの設定項目「allow_call_time_pass_reference」のOn/Offで参照渡しがデフォルトかどうかを制御できます。)
関数がその引 数を修正できるようにするには、その引数を参照渡しとする必要があり ます。
1 2 3 4 5 6 7 8 9 |
<?php function add_some_extra(&$string) { $string .= 'and something extra.'; } $str = 'This is a string, '; add_some_extra($str); echo $str; // outputs 'This is a string, and something extra.' ?> |
デフォルト引数値
関数は、スカラー引数に関して次のようにデフォルト値を 定義することができます。
デフォルト値は、定数式である必要があり、 変数やクラスのメンバーであってはなりません。
引数のデフォルト値を使用する際には、デフォルト値を有する引数はデ フォルト値がない引数の右側に全てある必要があることに注意して下さ い。
(デフォルト値を使用したい引数の右側の引数はすべてデフォルト値が設定されていないといけないということです)
1 2 3 4 5 6 7 8 9 |
<?php function makecoffee($type = "cappuccino") { return "Making a cup of $type.\n"; } echo makecoffee(); echo makecoffee(null); echo makecoffee("espresso"); ?> |
戻り値
オプションの return 文により値を返すことができます。 配列やオブジェクトを含むあらゆる型を返すことができます。
これにより、関数の実行を任意の箇所で終了し、その関数を呼び出した 箇所に制御を戻すことが出来ます。
使用例)
1 2 3 4 5 6 7 |
<?php function square($num) { return $num * $num; } echo square(4); // '16'を出力 ?> |
複数の値を得る為に配列を返すこともできます
1 2 3 4 5 6 7 |
<?php function small_numbers() { return array (0, 1, 2); } list ($zero, $one, $two) = small_numbers(); ?> |
関数からリファレンスを返すこともできます。
リファレンス演算子 & を関数宣 言部および変数への返り値を代入する際の両方で使用します。
1 2 3 4 5 6 7 8 |
<?php function &returns_reference() { return $someref; } $newref =& returns_reference(); ?> |
可変変数
PHP は可変関数(variable functions)の概念をサポートしています。
これにより、変数名の後に括弧が付いている場合、その値が何であろうと PHPは、同名の関数を探し実行を試みます。
この機能は、コールバック、関数テーブル等を実装するために使用可能です。
使用例)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<?php function foo() { echo "In foo()<br />\n"; } function bar($arg = '') { echo "In bar(); argument was '$arg'.<br />\n"; } // This is a wrapper function around echo function echoit($string) { echo $string; } $func = 'foo'; $func(); // This calls foo() $func = 'bar'; $func('test'); // This calls bar() $func = 'echoit'; $func('test'); // This calls echoit() ?> |
オブジェクトのメソッドを可変関数を使ってコールすることもできます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php class Foo { function Variable() { $name = 'Bar'; $this->$name(); // Bar() メソッドのコール } function Bar() { echo "This is Bar"; } } $foo = new Foo(); $funcname = "Variable"; $foo->$funcname(); // $foo->Variable() をコールする ?> |
内部(ビルドイン)関数
PHPは標準で多くの関数と言語構造を持っています。
また他にも コンパイル済みの特定のPHPエクステンションを必要とする関数があります。
それらはもしコンパイルされていなければ"undefined function(未定義の関数)" として致命的エラーを発するでしょう。
例えば、 imagecreatetruecolor()のような 画像関数を使用するには、 GDサポートを有効にしてPHPをコンパイルしておく必要があります。
また、mysql_connect()を使う場合もやはり MySQLサポートを有効にしてPHPが コンパイルされている必要があります。
stringや variable関数のように どのバージョンのPHPでも含まれているコアの関数もたくさんあります。
phpinfo()やget_loaded_extensions()を コールすることで使用しているPHPにロードされているエクステンションを 見ることができます。
コメント:0件
トラックバック:2件
-
PHPで組み合わせを生成する -再帰呼び出し-
PHPで組み合わせの生成を行うプログラムを作る。再帰呼び出しという手法を用いる。
[...] 第14回 関数 [...]