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

タイトル: 文法
SEOタイトル: PHP 文法の基礎完全ガイド — 変数・配列・関数・クラス・PHP 8 新機能

この記事の要点
  • PHP コードは <?php ... ?> で囲む。 終了タグ ?> は省略推奨(純粋な PHP ファイルでは出力混入防止)
  • 変数は $ プレフィックス。 配列は 添字配列 [1, 2, 3]連想配列 ["key" => "value"] の区別なし
  • 関数定義は function、 クラスは class、 namespace は namespace App\Http;
  • PHP 8 新機能: match 式、 named arguments、 readonly プロパティ、 type declarations、 attributes
  • 依存読み込みは require_once / include。 モダンには Composer の autoload (vendor/autoload.php) で完結

PHP の基本構造

<?php
// 1 行コメント
# 1 行コメント(あまり使わない)
/* 複数行
   コメント */

// 変数
$name = "Taro";
$age = 30;
$pi = 3.14;
$is_active = true;
$nothing = null;

// 出力
echo "Hello, $name!\n";        // 変数展開
echo 'Hello, $name!' . "\n";   // シングルクォートは展開しない
printf("年齢: %d\n", $age);
print_r($_GET);                // 配列をデバッグ表示

// 純粋 PHP ファイルでは終了タグを書かない(推奨)

基本データ型

備考
int4232/64bit プラットフォーム依存
float3.14倍精度浮動小数点
string&quot;hello&quot;シングル/ダブル/Heredoc/Nowdoc
booltrue / false小文字推奨
array[1, 2]添字/連想を区別しない
objectnew User()クラスのインスタンス
nullnull値なし
callableクロージャ・関数名コールバック
iterable配列 or Iteratorforeach 可能なもの

配列(添字・連想)

// 添字配列
$fruits = ["apple", "banana", "cherry"];
echo $fruits[0];               // apple
$fruits[] = "orange";          // 末尾追加
count($fruits);                // 4

// 連想配列
$user = [
    "name" => "Taro",
    "age" => 30,
    "email" => "taro@example.com",
];
echo $user["name"];

// PHP 7.4+ スプレッド展開
$a = [1, 2, 3];
$b = [0, ...$a, 4];            // [0, 1, 2, 3, 4]

// foreach
foreach ($fruits as $fruit) {
    echo $fruit;
}

foreach ($user as $key => $value) {
    echo "$key = $value\n";
}

// 主要な配列関数
array_map(fn($x) => $x * 2, [1, 2, 3]);   // [2, 4, 6]
array_filter([1, 2, 3, 4], fn($x) => $x % 2 === 0);  // [2, 4]
array_reduce([1, 2, 3], fn($carry, $x) => $carry + $x, 0);  // 6
in_array("apple", $fruits);    // true
array_keys($user);             // ["name", "age", "email"]

文字列

// シングル: 変数展開なし、 \n もそのまま
$s1 = 'Hello\n$name';          // 文字列 "Hello\n$name"

// ダブル: 変数展開あり、 エスケープ有効
$s2 = "Hello\n$name";          // 変数展開 + 改行

// Heredoc (ダブル相当)
$s3 = <<<EOT
$name さん
こんにちは
EOT;

// Nowdoc (シングル相当)
$s4 = <<<'EOT'
$name は展開されない
EOT;

// 主要関数
strlen("hello");               // 5 (バイト数)
mb_strlen("こんにちは");        // 5 (文字数)
strtoupper("abc");             // "ABC"
trim("  abc  ");               // "abc"
str_replace("a", "A", "abc");  // "Abc"
explode(",", "a,b,c");         // ["a","b","c"]
implode(",", ["a","b","c"]);   // "a,b,c"
sprintf("%05d", 42);           // "00042"

制御フロー

// if / elseif / else
if ($score >= 90) {
    $grade = "A";
} elseif ($score >= 80) {
    $grade = "B";
} else {
    $grade = "C";
}

// 三項演算子
$msg = $age >= 18 ? "成人" : "未成年";

// Null 合体 (PHP 7+)
$name = $_GET["name"] ?? "ゲスト";

// Null 合体代入 (PHP 7.4+)
$config["debug"] ??= false;

// switch
switch ($code) {
    case 200: $msg = "OK"; break;
    case 404: $msg = "Not Found"; break;
    default:  $msg = "Unknown";
}

// match 式 (PHP 8.0+) — 厳密比較、 値を返す
$msg = match($code) {
    200, 201 => "OK",
    404      => "Not Found",
    500      => "Server Error",
    default  => "Unknown",
};

// for / while / foreach
for ($i = 0; $i < 10; $i++) { ... }
while ($n < 100) { ... }
foreach ($items as $key => $val) { ... }

関数

// 基本(型宣言推奨、 PHP 7+)
function add(int $a, int $b): int {
    return $a + $b;
}

// デフォルト引数
function greet(string $name, string $msg = "Hello"): string {
    return "$msg, $name!";
}

// Named arguments (PHP 8.0+)
greet(name: "Taro", msg: "Hi");

// 可変長引数
function total(int ...$nums): int {
    return array_sum($nums);
}
total(1, 2, 3, 4);             // 10

// アロー関数 (PHP 7.4+)
$double = fn(int $x) => $x * 2;
$double(5);                    // 10

// クロージャ (use で外部変数キャプチャ)
$prefix = "User: ";
$tag = function(string $name) use ($prefix) {
    return $prefix . $name;
};

クラスと名前空間

<?php
namespace App\Models;

use App\Traits\HasTimestamps;
use DateTime;

class User
{
    use HasTimestamps;

    // PHP 8.1+ readonly
    public readonly int $id;

    // コンストラクタプロモーション (PHP 8.0+)
    public function __construct(
        public string $name,
        public int $age = 0,
        private ?DateTime $birthday = null,
    ) {}

    public function greet(): string {
        return "Hi, I am {$this->name}";
    }

    public static function create(string $name): self {
        return new self($name);
    }
}

// 継承・インターフェース
interface Greeter {
    public function greet(): string;
}

abstract class Animal {
    abstract public function bark(): string;
}

class Dog extends Animal implements Greeter {
    public function bark(): string { return "ワン"; }
    public function greet(): string { return $this->bark(); }
}

名前空間と Composer autoload

<?php
// app/Models/User.php
namespace App\Models;

class User { ... }

// app/Http/Controllers/UserController.php
namespace App\Http\Controllers;

use App\Models\User;          // フルパス省略のため
use App\Models\Post as BlogPost;  // エイリアス

class UserController {
    public function show(int $id): User {
        return User::find($id);
    }
}

// composer.json で PSR-4 マッピング
{
    "autoload": {
        "psr-4": {
            "App\\": "app/"
        }
    }
}

// エントリポイント
require_once __DIR__ . '/vendor/autoload.php';

PHP 8 の主要な新機能

機能バージョン
Named arguments8.0htmlspecialchars($s, double_encode: false)
Constructor promotion8.0__construct(public string $name)
match 式8.0match($x) { 1 => ..., default => ... }
Nullsafe operator8.0$user?->profile?->name
Enums8.1enum Status { case Active; case Inactive; }
readonly プロパティ8.1public readonly int $id;
First-class callable syntax8.1$fn = strlen(...);
readonly classes8.2readonly class Point { ... }

FAQ

Q: ?> 終了タグを書く / 書かない?
A: 純粋な PHP ファイルでは 書かない。 後ろの空白文字が headers already sent エラーの原因になります。

Q: requirerequire_once の違い?
A: _once 付きは多重読込防止。 ライブラリ読込は _once 推奨。 ただし autoload で完結するのがモダン。

Q: PHP 7 と 8 で書き方変える?
A: PHP 7.4 までサポート切れ済。 PHP 8.1+ を前提に readonly / enum / match を活用しましょう。