PHPの関数の作り方: 処理を分割する
- 作成日: 2020-08-27
- 更新日: 2023-12-24
- カテゴリ: PHP
PHPの関数
PHPでは関数を作ることが出来ます。
処理を分割したい時に便利な代物です。
PHPでは関数は↓のように書きます。
<?php
function myfunc($arg1, $arg2) {
return $arg1 + $arg2;
}
echo myfunc(1, 2) . "\n";
?>
関数の構造
PHPの関数は↓のような構造を持っています。
function 関数名(引数1, 引数2, ...) {
処理
return 値;
}
関数名は関数の名前です。
半角英数字か_
を使うことが出来ます。
また、関数名の先頭は半角英字か_
で始まらなければいけません(日本語もOK)。
日本語を関数名に使うことも出来ます。
引数は関数の引数、つまり関数外部から渡される入力のことです。
カッコの中にカンマ区切りで複数書くことが出来ます。
処理は関数内で実行される処理のことです。
処理はif
分やfor
文など、いろいろな処理を書くことが出来ます。
return文は関数から値を戻す時に使います。
return
は省略することが出来ます。
引数を出力してみる
関数の引数を出力してみます。
PHPの関数の引数には、数値や文字列、配列などありとあらゆるオブジェクトを渡すことが可能です。
また、引数名は一般的な変数の命名規則を適用できますが、ここでは簡易的に$arg1
, $arg2
などとしています。
<?php
function myfunc($arg1, $arg2, $arg3) {
echo gettype($arg1) . " -> $arg1\n";
echo gettype($arg2) . " -> $arg2\n";
echo gettype($arg3) . " -> " . implode(',', $arg3) . "\n";
}
myfunc(1, "cat", [3, 4, 5]);
?>
出力結果。
integer -> 1
string -> cat
array -> 3,4,5
厳密には関数の定義側の引数を仮引数、呼び出し側の引数を実引数と言います。
しかし「引数」とまとめてしまうのがネットでは一般的です。
言語制作者などはこの違いを明確に意識します。
デフォルト引数
関数の引数にはデフォルト値を設定できます。
<?php
function myfunc($arg1 = "cat") {
echo "$arg1\n";
}
myfunc();
?>
出力結果。
cat
$arg1 = "cat"
の部分がデフォルト引数を設定している所です。
↑のように、デフォルト値が設定されている引数には、関数呼び出し時に値を渡さなくても警告が出ません。
if文による関数の動的定義
PHPでは関数は動的に定義することが出来ます。
たとえばif
文で処理を分岐させて、動的に関数を定義するということが可能です。
<?php
$doDef = true;
if ($doDef) {
function myfunc() {
echo "hi\n";
}
}
myfunc();
?>
実行結果。
hi
$doDef
がfalse
の場合、関数が定義されないのでmyfunc
の関数呼び出し時にエラーになります。
<?php
$doDef = false;
if ($doDef) {
function myfunc() {
echo "hi\n";
}
}
myfunc();
?>
出力結果。
PHP Fatal error: Uncaught Error: Call to undefined function myfunc() in sample.php:11
Stack trace:
#0 {main}
thrown in sample.php on line 11
Call to undefined function
, つまり「未定義の関数を呼び出した」というエラー内容ですね。
関数の後方参照
PHPの関数は定義前に参照することが出来ます。
<?php
// ここで関数を呼び出せる
myfunc();
// ここで関数を定義している
function myfunc() {
echo "hi\n";
}
?>
出力結果。
hi
ただしif
文などで動的に関数を定義している場合は参照できません。
<?php
// ここで関数を呼び出せない
myfunc();
$doDef = true;
if ($doDef) {
// ここで関数を定義している
function myfunc() {
echo "hi\n";
}
}
?>
出力結果。
PHP Fatal error: Uncaught Error: Call to undefined function myfunc() in sample.php:4
Stack trace:
#0 {main}
thrown in sample.php on line 4
関数内で関数を定義
関数内で動的に関数を定義することも出来ます。
<?php
function func1() {
function func2() {
echo "I am func2.\n";
}
}
// func1を呼び出してfunc2が定義された
func1();
// func2を呼び出せるようになった
func2();
?>
出力結果。
I am func2.
やはり動的な定義の場合、関数の定義前に関数を参照することは出来ません。
<?php
// func2は定義されていないので、ここでfunc2を呼び出せない
func2();
function func1() {
function func2() {
echo "I am func2\n";
}
}
?>
実行結果。
PHP Fatal error: Uncaught Error: Call to undefined function func2() in sample.php:4
Stack trace:
#0 {main}
thrown in sample.php on line 4
再帰関数
関数内で関数自身を呼び出すことができます。
これを再帰関数と言います。
<?php
function recursive($n) {
if ($n >= 4) {
return $n;
}
return recursive($n + 1) + $n;
}
echo recursive(0) . "\n";
?>
↑は0~4
の総和を求める再帰関数です。
再帰関数を書くときは再帰の停止条件を忘れずに定義しましょう。
↑の場合はif ($n >= 4)
というのが再帰の停止条件です。
これを書いておかないとあなたの再帰関数は暴走するかもしれません。
使用例
PHPの関数の使用例です。
引数に応じてHTMLを出力する関数
引数に応じてHTMLを出力する関数です。
<?php
function draw($title, $lead) {
?><html>
<head>
<title><?= $title ?></title>
</head>
<body>
<h1><?= $lead ?></h1>
</body>
</html>
<?php
}
draw("My homepage", "Welcome to my homepage!");
?>
出力結果。
<html>
<head>
<title>My homepage</title>
</head>
<body>
<h1>Welcome to my homepage!</h1>
</body>
</html>
動的に定義する関数を切り替える
定義する関数を動的に切り替えます。
<?php
$debug = true;
if ($debug) {
function draw() {
echo "(debug mode) hi\n";
}
} else {
function draw() {
echo "hi\n";
}
}
draw();
?>
出力結果。
(debug mode) hi
問題
Q1: 関数を定義するときに使われるキーワードを答えよ
- fn
- func
- function
Q2: 関数の引数に渡せるオブジェクトを答えよ
- 整数
- 文字列
- 配列
Q3: 関数の動的な定義の振る舞いとして正しいものを答えよ
- 定義前の関数を参照できる
- 定義前の関数は参照できない
- 関数を参照できない時がある
正解
Q1: 3
Q2: 1, 2, 3
Q3: 2, 3