タイトル: 関数の定義と呼び出し方法
SEOタイトル: PHP 関数の定義と呼び出しの完全ガイド(引数・型宣言・無名関数・アロー関数)
| この記事の要点 |
|
基本構文
<?php
// 定義
function greet($name) {
return "Hello, $name!";
}
// 呼び出し
echo greet('World'); // Hello, World!
// 関数名は大文字小文字を区別しない(クラスとの違い)
echo Greet('PHP'); // Hello, PHP! ← 動くが推奨しない
型宣言(PHP 7+)
<?php
// 引数と戻り値に型を付ける
function add(int $a, int $b): int {
return $a + $b;
}
add(1, 2); // 3
add('1', '2'); // 3 (strict_types 無しなら自動変換)
// strict モード (ファイル先頭)
declare(strict_types=1);
function divide(float $a, float $b): float {
return $a / $b;
}
// divide('1', '2'); // TypeError
// Nullable 型 (PHP 7.1+)
function findUser(?int $id): ?User {
if ($id === null) return null;
return User::find($id);
}
// Union 型 (PHP 8.0+)
function format(int|float|string $value): string {
return (string) $value;
}
// Intersection 型 (PHP 8.1+)
function process(Countable&Iterator $obj): void { ... }
デフォルト引数
<?php
// 末尾にデフォルト値を持つ引数を置く
function greet(string $name, string $prefix = 'Hello'): string {
return "$prefix, $name!";
}
greet('Alice'); // Hello, Alice!
greet('Bob', 'Hi'); // Hi, Bob!
// 配列をデフォルトに
function config(array $opts = ['debug' => false, 'env' => 'prod']) {
// ...
}
// オブジェクトをデフォルトには NG (定数式のみ可)
// function f($x = new Date()) {} // ❌ PHP 8.0 以前
// PHP 8.1+ では new 式が許可される
function f($x = new \DateTime()): void {} // ✅ PHP 8.1+
可変長引数 (Variadic) と Spread
<?php
// ... で可変個の引数を配列として受け取る
function sum(int ...$nums): int {
return array_sum($nums);
}
sum(1, 2, 3); // 6
sum(1, 2, 3, 4, 5); // 15
// 配列展開 (spread) で呼び出し
$args = [1, 2, 3];
sum(...$args); // 6
// 通常引数と組み合わせ
function log_with_tags(string $level, string ...$tags): void {
// $level = 'info', $tags = ['db','slow']
}
log_with_tags('info', 'db', 'slow');
名前付き引数 (PHP 8.0+)
<?php
function createUser(string $name, int $age = 0,
bool $admin = false, ?string $email = null): User {
// ...
}
// 位置引数(従来)
createUser('Alice', 30, false, 'a@example.com');
// 名前付き引数 (PHP 8.0+)
createUser(name: 'Alice', email: 'a@example.com', admin: true);
// → age はデフォルトの 0、順序を気にしなくて良い
// 位置 + 名前 (位置が先)
createUser('Alice', admin: true);
無名関数 (Closure) と use
<?php
// 変数に代入できる
$double = function (int $x): int {
return $x * 2;
};
echo $double(5); // 10
// コールバックとして渡す
$nums = array_map(function ($x) { return $x * 2; }, [1, 2, 3]);
// [2, 4, 6]
// 外部変数を取り込む use
$multiplier = 3;
$multiply = function (int $x) use ($multiplier): int {
return $x * $multiplier;
};
echo $multiply(5); // 15
// 参照キャプチャ
$count = 0;
$inc = function () use (&$count) { $count++; };
$inc(); $inc(); $inc();
echo $count; // 3
アロー関数 (PHP 7.4+)
fn () => expr という短縮構文。外部変数は自動キャプチャ(値渡し)、本体は単一式のみ。
<?php
// 無名関数版
$double = function ($x) { return $x * 2; };
// アロー関数版(短い)
$double = fn ($x) => $x * 2;
// 外部変数を自動キャプチャ (use 不要)
$multiplier = 3;
$multiply = fn ($x) => $x * $multiplier;
echo $multiply(5); // 15
// コールバックで威力発揮
$prices = [100, 200, 300];
$withTax = array_map(fn ($p) => $p * 1.10, $prices);
// ネストもスッキリ
$matrix = [[1,2,3],[4,5,6]];
$doubled = array_map(
fn ($row) => array_map(fn ($v) => $v * 2, $row),
$matrix
);
First-class Callable Syntax (PHP 8.1+)
<?php
// 関数を Closure として取り出す
$upper = strtoupper(...);
echo $upper('hello'); // HELLO
// メソッドも同様
class Calc {
public function add(int $a, int $b): int { return $a + $b; }
public static function mul(int $a, int $b): int { return $a * $b; }
}
$c = new Calc();
$add = $c->add(...);
echo $add(2, 3); // 5
$mul = Calc::mul(...);
echo $mul(2, 3); // 6
// 従来の書き方 (PHP 8.0 以前)
$upper = Closure::fromCallable('strtoupper');
$add = Closure::fromCallable([$c, 'add']);
変数関数と callable
<?php
// 関数名を文字列で渡す
$fn = 'strtoupper';
echo $fn('hello'); // HELLO
// callable 型ヒント
function apply(callable $fn, array $items): array {
return array_map($fn, $items);
}
apply('strtoupper', ['a', 'b', 'c']); // ['A','B','C']
apply(fn ($x) => $x * 2, [1, 2, 3]); // [2, 4, 6]
apply([new Foo(), 'bar'], $items); // インスタンスメソッド
apply(['Foo', 'bar'], $items); // 静的メソッド
apply([Foo::class, 'bar'], $items); // 同上 (PHP 5.5+)
参照渡し(必要時のみ)
<?php
// 引数を & で参照渡し
function increment(int &$x): void {
$x++;
}
$n = 10;
increment($n);
echo $n; // 11
// 配列の要素を直接操作
function normalize(array &$arr): void {
foreach ($arr as &$v) {
$v = strtolower($v);
}
unset($v); // foreach の参照は最後に解除
}
FAQ
Q: 関数とメソッドの違い?
A: グローバル空間で function 宣言したものが関数、クラス内の関数がメソッド。呼び出しは $obj->method() または Class::method()。
Q: アロー関数と無名関数、どう使い分ける?
A: 単一式・外部変数を読むだけならアロー関数。複数行や外部変数を書き換えるなら無名関数 + use。
Q: 関数の存在チェック
A: function_exists('myFunc') で確認。プラグイン形式の処理や PHP バージョン差吸収に使う。