本文へスキップ
Typle
ログイン状態を確認中

プログラミング · 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:遅延反復

ほかの公式パックを見る