【PHP】第3回:関数・ファイル分割・部品化(LaravelのMVCが理解しやすくなる)|Dockerで学ぶ PHP→Laravel 実務入門

   青いPHPエレファント

この記事のゴール

 

第3回では、PHPを「書ける」から「組める」に進めます。

  • function(関数)の基本
  • 引数と戻り値
  • ファイル分割(require / require_once)
  • 実務での「部品化」の考え方
  • 次回のフォーム処理で必要になる構成を作る

1. なぜ関数とファイル分割が重要なのか?

PHPを学び始めた人が最初にぶつかる壁は、ここです。

  • 1ファイルに全部書く
  • コードが増えて読めなくなる
  • 修正が怖くなる
  • コピペが増える

これを防ぐのが

関数
ファイル分割
部品化

です。

Laravelはこの考え方を「強制的に」綺麗にしてくれるフレームワークなので、
この回を理解するとLaravelが一気に楽になります。

2. 今回のフォルダ構成

ここから src/ の中を少し実務寄りに整理します。

src/
├─ index.php
└─ lib/
    ├─ functions.php
    └─ data.php

3. データを別ファイルに切り出す(data.php)

まずは「タスク一覧データ」を data.php に移します。

src/lib/data.php

<?php

$tasks = [
  [
    "id" => 1,
    "title" => "掃除",
    "status" => "open",
  ],
  [
    "id" => 2,
    "title" => "買い物",
    "status" => "done",
  ],
  [
    "id" => 3,
    "title" => "筋トレ",
    "status" => "open",
  ],
];

4. index.php から読み込む(require)

src/index.php

<?php

require __DIR__ . "/lib/data.php";

?>
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>タスク一覧</title>
</head>
<body>

<h1>タスク一覧</h1>

<ul>
  <?php foreach ($tasks as $task): ?>
    <li>
      #<?= $task["id"] ?>
      <?= htmlspecialchars($task["title"], ENT_QUOTES, "UTF-8") ?>
      (<?= $task["status"] ?>)
    </li>
  <?php endforeach; ?>
</ul>

</body>
</html>

requireは、他のファイルを読み込む命令です。これにより、ファイルの分割が可能になります。

ここがポイント

__DIR__ を使う理由

require "lib/data.php"; でも動くことはありますが、
ファイルの場所が変わると壊れます。

__DIR__ は

このPHPファイルが置かれているディレクトリ

を指すので、安定します。

5. 関数を作る(functions.php)

次に、表示に関する処理を関数化します。

src/lib/functions.php

<?php

function e(string $value): string
{
    return htmlspecialchars($value, ENT_QUOTES, "UTF-8");
}

関数の意味

この e() は、実務でよく使うパターンです。

  • e() = escape(エスケープ)
  • 画面表示のXSS(クロスサイトスクリプティング)対策を強制する(毎回書くhtmlspecialcharsを省略できる)

Laravelでも {{ }} が自動で同じ役割をします。

6. index.php で関数を使う

src/index.php を更新します。

<?php

require __DIR__ . "/lib/data.php";
require __DIR__ . "/lib/functions.php";

?>
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>タスク一覧</title>
</head>
<body>

<h1>タスク一覧</h1>

<ul>
  <?php foreach ($tasks as $task): ?>
    <li>
      #<?= $task["id"] ?>
      <?= e($task["title"]) ?>
      (<?= $task["status"] ?>)
    </li>
  <?php endforeach; ?>
</ul>

</body>
</html>

ここまでで何が良くなったか?

  • htmlspecialchars(...) を毎回書かなくていい
  • 書き忘れを防げる
  • 「表示は必ず e()」というルールを作れる

7. 引数と戻り値(関数を実務っぽくする)

次に「ステータス表示」を関数にします。

src/lib/functions.php に追記します。

><?php

function e(string $value): string
{
    return htmlspecialchars($value, ENT_QUOTES, "UTF-8");
}

function statusLabel(string $status): string
{
    if ($status === "done") {
        return "完了";
    }
    return "未完了";
}

index.php 側で使います。

(<?= statusLabel($task["status"]) ?>)

8. もう一歩:表示用のHTMLを関数にする

次は「タスク1件分の表示」を部品化します。

src/lib/functions.php

<?php

function e(string $value): string
{
    return htmlspecialchars($value, ENT_QUOTES, "UTF-8");
}

function statusLabel(string $status): string
{
    if ($status === "done") {
        return "完了";
    }
    return "未完了";
}

function renderTaskItem(array $task): string
{
    $id = (int)($task["id"] ?? 0);
    $title = e((string)($task["title"] ?? ""));
    $status = statusLabel((string)($task["status"] ?? "open"));

    return "<li>#{$id} {$title} ({$status})</li>";
}

index.php をこうします。

<?php

require __DIR__ . "/lib/data.php";
require __DIR__ . "/lib/functions.php";

?>
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>タスク一覧</title>
</head>
<body>

<h1>タスク一覧</h1>

<ul>
  <?php foreach ($tasks as $task): ?>
    <?= renderTaskItem($task) ?>
  <?php endforeach; ?>
</ul>
</body>
</html>

ここでの学び

  • function は「入力→出力」を作る道具
  • HTML生成も「戻り値」で返せる
  • ?? を使うと未定義キーでも落ちない

9. require / include の使い分け(実務ルール)

どちらも別のファイルを読み込む命令ですが、初心者が混乱しやすいので、ここで整理します。

include
・読み込みに失敗しても「警告」で続行する。なくても致命傷にならず、プログラムを中断したくないようなオプションのファイルに使う。

require
・読み込みに失敗したら「致命的エラー」で止まる。データベース接続設定やコア機能など、ないと正しく動かない必須ファイルに使う。

    実務では基本こうします

    • ほぼ require
    • さらに require_once をよく使う

    require_onceとは、requireと同様に他のファイルを読み込む命令ですが、ファイルがすでに読み込まれている場合はそのファイルを読み込みません。同じファイルを複数回読み込んだ(実行した)場合、関数の再定義や変数値の再代入などの問題が発生する場合が多いので、ほとんどの場合require_onceを使うのがおすすめです。

    require_once にするなら(おすすめ)

    index.php

    require_once __DIR__ . "/lib/data.php";
    require_once __DIR__ . "/lib/functions.php";

    10. Laravelへ繋がるポイント(ここが重要)

    今回やったことは、LaravelのMVCと対応します。

    今回のPHP Laravel
    index.php routes/web.php + Controller
    functions.php Helper / Service
    data.php Model / DB
    HTML表示 Blade

     

    つまり、Laravelは

    この分割を「標準化して、便利にしたもの」

    です。

    11. 次回予告(第4回)

    第4回では、いよいよWebアプリらしい部分に入ります。

    • GET / POST
    • フォーム送信
    • バリデーション(最低限)
    • XSS / CSRFの入口

    そして「タスクを追加できる」状態にします。

    まとめ

    第3回では、

    • 関数(引数・戻り値)
    • ファイル分割(require)
    • 表示処理の部品化
    • を整理しました。

    これができると、Laravelに進んだ時に
    「なぜControllerやViewが分かれているのか」が理解しやすくなります。