JS/TS 経験者のための PHP Tips
はじめに
フロントエンド開発者向けの、知ってるとちょっとだけ幸せになる PHP の Tips を書き溜めています。 私自身も PHP より前に JavaScript・TypeScript を学習していました。PHP を学習していく中で似ていると感じた箇所、先に知りたかった箇所が多かったので共有します。
変数・値系
テンプレートリテラル
ダブルクォート " 内では変数が展開されます。単純な変数は $var で、配列やオブジェクトプロパティなど複雑な式は {$var} で囲みます。
シングルクォート ' 内では変数展開されず、そのままの文字列になるので注意です。
$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! 分割代入
配列、連想配列でカッコが同じですが、同等のことができます。
$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 以降から使用可能です。
// $user はオブジェクト(例: DBから取得したレコード)
$country = $user?->address?->country; NULL 合体演算子
null チェックをしている三項演算子を簡略化できます。
合体演算子は PHP 7 以降、代入は PHP 7.4 以降から使用可能です。
$user = null;
$username = $user ?? 'guest';
$config = [];
$config['name'] ??= 'anonymous'; 配列系
配列のスプレッド演算子
PHP 標準の array_merge 関数は、数値キーが重複しても上書きせず、インデックスを振り直して追加します。
スプレッド演算子 ... の場合は JavaScript と同様に同じキーならあとの値で上書きするので、近い感覚で使用できます。
配列は PHP 7.4 以降、連想配列は PHP 8.1 以降で使用可能です。
また、可変長引数の宣言も PHP 5.6 から使えます。
// 配列
$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 関数があります。引数の順番が異なる点に注意してください。
$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 → 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 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 のオブジェクト引数パターンに近い感覚で、引数の順番を気にせず指定できます。
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 のような自動変換が行われます)。
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 マニュアル
PHP: PHP 7.4.x から PHP 8.0.x への移行 - Manual
PHP 7.4.x から PHP 8.0.x への移行