この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:5
ページ更新者:guest
更新日時:2026-06-11 07:10:02

タイトル: 関数の定義と呼び出し方法
SEOタイトル: PHP 関数の定義と呼び出しの完全ガイド(引数・型宣言・無名関数・アロー関数)

この記事の要点
  • 基本: function name($args) { return ...; } で定義、name($args) で呼び出し
  • 型宣言: 引数・戻り値に int / string / ?Type / Union int|string を付ける(PHP 7+ / 8+)
  • デフォルト引数 $x = 0可変長引数 (Variadic) ...$args名前付き引数 name: "val"(PHP 8+)
  • 無名関数 function () use ($x) {}アロー関数 fn($x) => $x * 2(PHP 7.4+)
  • First-class Callable Syntax: strtoupper(...) で関数を Closure 化(PHP 8.1+)

基本構文

<?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 バージョン差吸収に使う。