オブジェクト指向と非同期通信

「フレームワークに行く前に、これだけは知っておいてほしい!」という技術が2つあります。
それは「オブジェクト指向(クラス)」「非同期通信(API)」です。

これらを知らないままフレームワークに入ると、「なぜファイルが分かれているの?」「魔法みたいで怖い」と混乱してしまいます。
素のPHPでこの仕組みを一度自分で作ってみることで、フレームワークのありがたみが骨身に染みてわかります。


🏗️ 課題4:【脱・ベタ書き】クラスを使ってコードを整理せよ

これまでは $pdo = ... と毎回書いていましたが、これを「データベース管理ロボット(クラス)」に任せてみましょう。

📋 要件定義

  1. Database というクラスを作る。
    • このクラスを呼び出すと、自動でDB接続してくれる。
  2. Todo というクラスを作る。
    • getAll() というメソッド(命令)で、タスク一覧を返す。
  3. メインの画面(index.php)には、SQLを一切書かない。

💡 ヒント

  • クラスの設計図は class Database { ... } で作ります。
  • 関数(function)をクラスの中に入れると「メソッド」と呼ばれます。
  • publicprivate という「アクセス権」を意識してください。
▶︎ 解答コードを見る(クリックで展開)

/* --- db_class.php (設計図) --- */
<?php

// データベース接続担当のクラス
class Database {
    private $pdo;

    // 「コンストラクタ」:このクラスが使われる時に最初に自動で動く
    public function __construct() {
        try {
            $this->pdo = new PDO('mysql:dbname=todo_app;host=localhost;charset=utf8mb4', 'root', '');
        } catch (PDOException $e) {
            exit('DB Error');
        }
    }

    // 接続情報を外から使えるように渡すメソッド
    public function getPdo() {
        return $this->pdo;
    }
}

// Todo操作担当のクラス
class Todo {
    private $pdo;

    public function __construct($pdo_instance) {
        $this->pdo = $pdo_instance;
    }

    // すべてのタスクを取得するメソッド
    public function getAll() {
        $stmt = $this->pdo->query("SELECT * FROM tasks ORDER BY id DESC");
        return $stmt->fetchAll();
    }
}
?>


/* --- index.php (使う側) --- */
<?php
require_once 'db_class.php'; // ファイルを読み込む

// 1. DB接続ロボットを起動
$db = new Database();

// 2. Todo管理ロボットを起動(DB接続情報を渡す)
$todoApp = new Todo($db->getPdo());

// 3. ロボットに「データちょうだい」と命令する
$tasks = $todoApp->getAll();
?>

<!DOCTYPE html>
<html>
<body>
    <h1>クラスを使ったTodo</h1>
    <ul>
        <?php foreach ($tasks as $task): ?>
            <li><?= htmlspecialchars($task['title']) ?></li>
        <?php endforeach; ?>
    </ul>
</body>
</html>

⚡️ 課題5:【API連携】「いいね」ボタンを非同期で作れ

現代のアプリは、ボタンを押すたびに画面が白くなってリロードされたりしません。
裏側でこっそり通信する技術、Ajax(エイジャックス) / Fetch API に挑戦します。

📋 要件定義

  1. フロントエンド(JS):「いいね」ボタンを押すと、JavaScriptが裏側でPHPにリクエストを送る。
  2. バックエンド(PHP):受け取ったリクエストを処理して、データベースの「いいね数」を1増やす。
  3. 結果反映:PHPから「成功したよ!今は15いいねだよ」と返事が来るので、画面をリロードせずに数字だけ書き換える。

💡 ヒント

  • PHP側はHTMLではなく JSON(ジェイソン) というデータ形式を返します。
  • JS側は fetch('api.php', ...) を使います。
▶︎ 解答コードを見る(クリックで展開)

※事前にDBに likes テーブル(id, count)を作り、データ(id:1, count:0)を入れておいてください。

/* --- api.php (裏方のPHP) --- */
<?php
// これはHTMLじゃなくてJSONデータだよ、と宣言
header('Content-Type: application/json');

try {
    $pdo = new PDO('mysql:dbname=test_db;host=localhost;charset=utf8mb4', 'root', '');
    
    // いいねを+1する
    $stmt = $pdo->prepare("UPDATE likes SET count = count + 1 WHERE id = 1");
    $stmt->execute();

    // 最新の数を取得
    $stmt = $pdo->query("SELECT count FROM likes WHERE id = 1");
    $result = $stmt->fetch();

    // 結果をJSON形式でJSに返す
    echo json_encode(['status' => 'success', 'new_count' => $result['count']]);

} catch (Exception $e) {
    echo json_encode(['status' => 'error']);
}
?>


/* --- index.html (表の画面) --- */
<!DOCTYPE html>
<html>
<body>
    <h1>非同期いいねボタン</h1>
    
    <button id="likeBtn">
        👍 いいね! <span id="count">0</span>
    </button>

    <script>
        const btn = document.querySelector("#likeBtn");
        const countSpan = document.querySelector("#count");

        btn.addEventListener("click", () => {
            // 裏側で api.php にアクセス!
            fetch('api.php')
                .then(response => response.json()) // JSONとして受け取る
                .then(data => {
                    // 成功したら数字だけ書き換える
                    if(data.status === 'success') {
                        countSpan.textContent = data.new_count;
                        btn.style.color = "red"; // おまけ:文字を赤くする
                    }
                })
                .catch(error => alert("エラー!"));
        });
    </script>
</body>
</html>

👨‍🏫 先生からのアドバイス

課題4(クラス)は、Laravelなどのフレームワークを使うための基礎体力になります。
課題5(API)は、ReactやVue.jsなどのモダンなフロントエンド技術を使うための入り口です。

これが理解できれば、あなたはもう「どの技術書を読んでも、書いてあることの意味がわかる」状態になっています。
ここまで来れば、怖いものはありません!

 

タイトルとURLをコピーしました