プログラミング · PHP
PHP構文のタイピング練習
PHP 8.2 以降の構文41個を、初級・中級・上級の3つのリストで打って覚えます。declare(strict_types = 1)、switch・for・while、if・elseif・else、match 式などを、コードの形で練習できます。
3リスト・41語
無料・ログインなしで練習できます。押すとこのパックをフォローし、すぐに練習が始まります。
収録している言葉
PHP構文(初級)
| 打つ言葉 | 意味・補足 |
|---|---|
| <?php declare(strict_types = 1); echo "Hello\n"; | PHP 8.2以降:例の基準(コード断片には先頭タグを補う。strict_typesはファイル単位でスカラー引数等の変換に影響) |
| $age = 20; const MAX_COUNT = 100; | $変数 / const:変数・定数(変数名は$から開始) |
| $name = 'Pomo'; $enabled = true; $n = (int)'123'; | 型・型変換:スカラー等(キャストは入力検証の代わりではない) |
| $name = 'Pomo'; echo 'Hello, ' . $name; echo "Hello, {$name}"; | . / 文字列補間:文字列結合(シングルクォートとダブルクォートの解釈に差) |
| var_dump(1 === '1'); var_dump(1 == '1'); | 記法: === / == / !==:比較(通常は意図せぬ型変換を避けて厳密比較を検討) |
| $name = $_GET['name'] ?? 'Guest'; $options['limit'] ??= 20; | ?? / ??=:NULL等の既定値(未定義またはnullの場合) |
| $nums = [1, 2, 3]; $user = ['name' => 'Pomo']; $nums[] = 4; | [] / 連想配列:順序付きマップ(PHP配列は順序付きマップ) |
| var_dump(isset($missing)); var_dump(empty('0')); | isset / empty:未設定等の判定(issetはnullにもfalse。emptyは文字列'0'にもtrue) |
| function add(int $a, int $b): int { return $a + $b; } | function / return:関数定義 |
| $user = null; $name = $user?->name; | -> / ?->:メンバーアクセス(nullsafe演算子。代入先には使えない) |
| namespace App; use DateTimeImmutable; $now = new DateTimeImmutable(); | namespace / use / require:名前空間・読込(実アプリではComposerのautoload等を設定) |
| php app.php | 実行・lint・開発サーバー:コマンドライン(組込みサーバーは開発向け) |
| php -l app.php | 実行・lint・開発サーバー:コマンドライン(組込みサーバーは開発向け) |
| php -S localhost:8000 | 実行・lint・開発サーバー:コマンドライン(組込みサーバーは開発向け) |
PHP構文(中級)
| 打つ言葉 | 意味・補足 |
|---|---|
| switch ($role) { case 'admin': echo '管理者'; break; default: echo '一般'; } | switch:値で分岐(通常は緩い比較。break漏れに注意) |
| for ($i = 0; $i < 3; $i++) { echo $i; } while (false) { break; } | for / while / do:反復 |
| foreach (['a' => 1, 'b' => 2] as $key => $value) { echo "$key:$value\n"; } | foreach:配列の要素を処理(参照付きforeach後は変数の参照残りに注意) |
| $nums = [1, 2, 3]; $result = array_map(fn ($n) => $n * 2, $nums); echo count($result); | count / array_map:数・変換 |
| $nums = [1, 2, 3]; $result = array_values(array_filter($nums, fn ($n) => $n > 1)); | array_filter / array_values:絞り込み・添字再構成(filterは通常キーを保持) |
| function greet(string $name = 'Guest'): string { return "Hello, $name"; } echo greet(name: 'Pomo'); | 既定・名前付き引数:省略と指定 |
| function sum(int . . . $nums): int { return array_sum($nums); } echo sum( . . . [1, 2, 3]); | ...$args / ...配列:可変長と展開 |
| function label(int | string | null $value): string { return (string)$value; } | ?T / union:NULL許容・共用型 |
| class Counter { private int $count = 0; public function get(): int { return $this->count; } } | public / protected / private:アクセス範囲 |
| readonly class Point { public function __construct(public int $x, public int $y) {} } | readonly:一度だけ初期化(PHP 8.2以降。参照先内部の深い不変性ではない) |
| trait Named { public function name(): string { return 'Pomo'; } } class User { use Named; } | trait / use:実装の再利用(namespaceのuseとは別) |
| enum Status: string { case Todo = 'todo'; case Done = 'done'; } echo Status::Todo->value; | enum:値を限定(PHP 8.1以降) |
| file_put_contents('memo.txt', 'Hello'); $text = file_get_contents('memo.txt'); | file_get_contents / file_put_contents:ファイル読み書き(書込は通常上書き。失敗はfalse等、警告・権限に注意) |
| echo htmlspecialchars('<script>', ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); | htmlspecialchars:HTML文脈のエスケープ(JS・URL等の文脈には別処理) |
PHP構文(上級)
| 打つ言葉 | 意味・補足 |
|---|---|
| if ($age >= 20) { echo '成人'; } elseif ($age >= 18) { echo '18歳以上'; } else { echo 'その他'; } | if / elseif / else:条件分岐 |
| $role = 'admin'; $label = match ($role) { 'admin' => '管理者', 'member', 'guest' => '一般', default => '不明' }; | match:厳密比較で値を返す(補足: ===比較。該当なし・defaultなしは例外) |
| var_dump(in_array('1', [1, 2], true)); var_dump(array_key_exists('name', ['name' => null])); | in_array / array_key_exists:要素・キー存在(in_arrayの第3引数trueで厳密比較) |
| $factor = 2; $double = fn ($n) => $n * $factor; $f = function ($n) use ($factor) { return $n * $factor; }; | fn / use:クロージャ(arrow functionは外側変数を値で暗黙捕捉) |
| class User { public function __construct(public string $name) {} public function greet(): string { return 'Hello, ' . $this->name; } } $user = new User('Pomo'); | class / __construct:クラス初期化(コンストラクターのプロパティ昇格) |
| class Base { public function greet(): string { return 'Hello'; } } class Child extends Base { public function greet(): string { return parent::greet() . '!'; } } | extends / parent:継承 |
| interface Greeter { public function greet(): string; } class Bot implements Greeter { public function greet(): string { return 'Hi'; } } | interface / implements:共通契約 |
| class MathUtil { public static function twice(int $n): int { return $n * 2; } } echo MathUtil::twice(2); | static / :::クラスに属するメンバー |
| try { throw new RuntimeException('失敗'); } catch (Throwable $e) { echo $e->getMessage(); } finally { echo '終了'; } | try catch finally / throw:例外処理(ThrowableはErrorも含む。握りつぶさない) |
| $text = json_encode(['name' => 'Pomo'], JSON_THROW_ON_ERROR | JSON_UNESCAPED_UNICODE); $data = json_decode($text, true, 512, JSON_THROW_ON_ERROR); | json_encode / json_decode:JSON変換(型・内容は別途検証) |
| $stmt = $pdo->prepare('SELECT id,name FROM users WHERE id=:id'); $stmt->execute(['id' => 1]); $row = $stmt->fetch(PDO::FETCH_ASSOC); | PDO / prepare / execute:値をバインドしたSQL(設定済みPDOが必要。識別子は値としてバインド不可) |
| $hash = password_hash('example-password', PASSWORD_DEFAULT); $ok = password_verify('example-password', $hash); | password_hash / verify:パスワードハッシュ(平文を保存しない。例の文字列を実資格情報として使わない) |
| function numbers(): Generator { for ($i = 0; $i < 3; $i++) { yield $i; } } foreach (numbers() as $n) { echo $n; } | yield:遅延反復 |