---
title: "JS/TS 経験者のための PHP Tips"
draft: false
publish: 2026-02-25
description: ""
tags: ["PHP", "JavaScript", "TypeScript"]
---

## はじめに

フロントエンド開発者向けの、知ってるとちょっとだけ幸せになる PHP の Tips を書き溜めています。
私自身も PHP より前に JavaScript・TypeScript を学習していました。PHP を学習していく中で似ていると感じた箇所、先に知りたかった箇所が多かったので共有します。

## 変数・値系

### テンプレートリテラル

ダブルクォート `"` 内では変数が展開されます。単純な変数は `$var` で、配列やオブジェクトプロパティなど複雑な式は `{$var}` で囲みます。
シングルクォート `'` 内では変数展開されず、そのままの文字列になるので注意です。

```php
$name = 'John';
$message = "Hello, $name!"; // Hello, John!

// シングルクォートでは展開されない
$message = 'Hello, $name!'; // Hello, $name!

// 単純じゃない変数の場合
$user = (object)['name' => 'Alice'];
$config = ['name' => 'Bob'];
$message = "Hello, {$user->name}!";     // Hello, Alice!
$message = "Hello, {$config['name']}!"; // Hello, Bob!
```

### 分割代入

配列、連想配列でカッコが同じですが、同等のことができます。

```php
$user = ['name' => 'John', 'email' => 'john@example.com'];
['name' => $name, 'email' => $email] = $user;

$array = ['first', 'second', 'third'];
[$first, $second] = $array;

// PHP 7.1 + 数値インデックスの場合
$user = ['Alice', 'alice@example.com'];
[$name, $email] = $user;
```

### オプショナルチェーン

JavaScript の `?.` とは構文が若干違いますが、同じ事ができます。
PHP 8 以降から使用可能です。

```php
// $user はオブジェクト（例: DBから取得したレコード）
$country = $user?->address?->country;
```

### NULL 合体演算子

`null` チェックをしている三項演算子を簡略化できます。
合体演算子は PHP 7 以降、代入は PHP 7.4 以降から使用可能です。

```php
$user = null;
$username = $user ?? 'guest';

$config = [];
$config['name'] ??= 'anonymous';
```

## 配列系

### 配列のスプレッド演算子

PHP 標準の `array_merge` 関数は、数値キーが重複しても上書きせず、インデックスを振り直して追加します。
スプレッド演算子 `...` の場合は JavaScript と同様に同じキーならあとの値で上書きするので、近い感覚で使用できます。
配列は PHP 7.4 以降、連想配列は PHP 8.1 以降で使用可能です。
また、可変長引数の宣言も PHP 5.6 から使えます。

```php
// 配列
$array1 = [1, 2, 3];
$array2 = [4, 5, 6];
$merged = array_merge($array1, $array2);

// PHP 7.4 +
$merged = [...$array1, ...$array2]; // [1, 2, 3, 4, 5, 6]


// 連想配列
$map1 = ['a' => 1, 'b' => 2];
$map2 = ['c' => 3, 'd' => 4];
$merged = array_merge($map1, $map2);

// PHP 8.1 +
$merged = [...$map1, ...$map2]; // {a => 1, b => 2, c => 3, d => 4}

// 可変長引数
function debug_log(... $params) {
    foreach($params as $value) {
        echo $value;
    }
}
```

### 配列操作（map/filter/reduce）

JavaScript の高階関数に対応する PHP 関数があります。引数の順番が異なる点に注意してください。

```php
$numbers = [1, 2, 3, 4, 5];

// array_map = JS の map
$doubled = array_map(fn($n) => $n * 2, $numbers);

// array_filter = JS の filter
$evens = array_filter($numbers, fn($n) => $n % 2 === 0);

// array_reduce = JS の reduce
$sum = array_reduce($numbers, fn($acc, $n) => $acc + $n, 0);
```

### JSON の扱い

`json_encode()` で配列やオブジェクトをJSON文字列に変換し、`json_decode()` でJSON文字列をPHPの値に戻します。

```php
// エンコード: PHP → JSON
$data = ['name' => 'Alice', 'age' => 25];
$json = json_encode($data);
// {"name":"Alice","age":25}

// デコード: JSON → PHP
$json = '{"name":"Bob","age":30}';
$data = json_decode($json);       // オブジェクト (stdClass)
$data = json_decode($json, true); // 連想配列
```

## 関数系

### アロー関数

無名関数（ラムダ式）の短縮構文です。親スコープの変数を自動キャプチャするため `use` が不要になります。PHP 7.4 以降で使用可能です。

```php
// PHP 7.4 +
$double = fn($x) => $x * 2;

$items = [(object)['price' => 100], (object)['price' => 200]];
$prices = array_map(fn($item) => $item->price, $items);
```

### 名前付き引数

PHP 8.0 以降で使えます。JavaScript のオブジェクト引数パターンに近い感覚で、引数の順番を気にせず指定できます。

```php
function createUser(string $name, int $age = 0, bool $active = true) { /* ... */ }

// 名前付き引数で呼び出し
createUser(name: 'Alice', active: false);
```

## 型システム

### 型宣言・strict_types

TypeScript ユーザーにはおなじみの型指定が PHP でも使えます。`declare(strict_types=1);` をファイル先頭に書くと、型の厳密チェックが有効になります（なしだと `"5"` → `5` のような自動変換が行われます）。

```php
declare(strict_types=1);

function greet(string $name): string {
    return "Hello, $name!";
}

// PHP 8.0+ Union型
function process(int|string $value): void { /* ... */ }

// PHP 8.0+ ?型 (nullable)
function find(int $id): ?User { /* ... */ }
```

## 関連リソース

https://www.php.net/manual/ja/

https://www.php.net/manual/ja/migration80.php
