Site logo
devhx2.blog

JS/TS 経験者のための PHP Tips

はじめに

フロントエンド開発者向けの、知ってるとちょっとだけ幸せになる 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 { /* ... */ }

関連リソース

PHP: 序文 - Manual

PHP マニュアル

www.php.net

PHP: PHP 7.4.x から PHP 8.0.x への移行 - Manual

PHP 7.4.x から PHP 8.0.x への移行

www.php.net