はじめに
PHPは、長年にわたりWebサービス開発の第一線で使われ続けているプログラミング言語です。これからプログラミングを始める初心者にとって最も参入障壁が低い言語の一つでありながら、大規模なWebアプリケーションを支える堅牢な機能を備えています。
しかし、「初心者向け」と言われる一方で、独学で実務レベルまで到達しようとすると、古い書き方(レガシーPHP)と最新の書き方(モダンPHP)の情報が混ざり合い、混乱してしまうケースが非常に多く見られます。
本記事では、「猿でもわかる」圧倒的なわかりやすさを意識しつつ、単なる基礎文法の解説にとどまらず、実務現場で必須となるオブジェクト指向、データベース操作、セキュリティ、そしてフレームワークの基礎までを網羅的に解説します。
1. PHPとは?なぜ今学ぶのか
1-1. PHPの概要と特徴
PHP(PHP: Hypertext Preprocessor)は、主にWebサーバー上で動作するサーバーサイドのスクリプト言語です。
通常、ブラウザ(ChromeやSafariなど)からWebサイトにアクセスすると、サーバーからHTML/CSS/JavaScriptが返送され、画面が表示されます。PHPはこの「サーバー内部」で動作し、アクセスしたユーザーや状況に応じて動的にHTMLを組み上げて送り返す役割を果たします。
PHPの主な特徴は以下の通りです。
- Web開発に特化している: HTMLの中に直接コードを埋め込むことができる構造からスタートしており、Webリクエストの処理が非常に簡単です。
- 学習コストが低い: 文法が比較的シンプルで、環境構築から最初の「Hello World」を出力するまでの手順が他の言語に比べて圧倒的に少ないです。
- 圧倒的なシェアと情報量: 世界中のWebサイトの大部分(WordPressで構築されたサイトを含む)でPHPが使われており、エラーの解決方法やトラブルシューティングの情報がネット上に豊富に存在します。
1-2. 2026年現在におけるPHPのリアルと現場での評価
インターネット上には「PHPはもう古い」「これからは他の言語の時代だ」といった意見が見られることもあります。しかし、それはPHP 5系時代(10年以上前)のイメージを引きずっている誤解に過ぎません。
現在のPHP(PHP 8.x系以降)は、過去の言語構造から劇的な進化を遂げています。
- 処理速度の劇的な向上: JIT(Just-In-Time)コンパイラの導入やエンジン自体の最適化により、旧世代のPHPと比較して実行速度が飛躍的に向上しました。
- 厳密な型システムの導入: 以前のPHPは「型があいまい」でバグを引き起こしやすいと言われていましたが、現在のPHPは厳密な型指定が可能になり、大規模開発にも耐えうる安全な言語になっています。
-
強力なエコシステムの存在: パッケージ管理ツールである
Composerや、世界的に大ヒットしているWebフレームワークLaravelの存在により、モダンで生産性の高い開発が標準となっています。
新規自社サービスの開発、大規模ECサイトの構築、WordPress案件のカスタマイズ、基幹システムの運用保守など、Web業界においてPHPの需要が途切れることはありません。
2. 開発環境を構築しよう
プログラミングを学ぶ上で最初のハードルとなるのが「環境構築」です。ここでは初心者から実務まで対応できる開発環境の作り方を解説します。
2-1. 開発環境の選択肢
PHPを動かすためには、PC内に「PHP実行環境」と「Webサーバー」が必要です。主な構築方法は以下の通りです。
| 手法 | 難易度 | 特徴・用途 |
|---|---|---|
| PHPビルトインサーバー | ★☆☆ | PHP本体を入れるだけ。コマンド1発で動くため、文法学習に最適。 |
| XAMPP / MAMP | ★★☆ | インストーラーを実行するだけで、PHP・MySQL・Apacheが一括で入る入門用パッケージ。 |
| Docker | ★★★ | コンテナ技術を使い、本番環境と全く同じ構成を再現できる。実務現場でのデファクトスタンダード。 |
初心者の方は、まずは手軽に文法を試せるPHPビルトインサーバーかXAMPP/MAMPからスタートし、Webアプリを作る段階でDockerに移行するのが最もスムーズです。
2-2. ビルトインサーバーによる最速セットアップ
お使いのPC(MacやLinuxには標準で入っている場合が多く、Windowsでも公式からzipを落としてパスを通すだけです)にPHPがインストールされているか確認しましょう。
ターミナル(Command Prompt / PowerShell)で以下のコマンドを実行します。
php -v
バージョンが表示されたら、適当なフォルダを作成してPHPファイルを実行してみましょう。
# プロジェクト用のフォルダを作成
mkdir php-study
cd php-study
# index.php ファイルを作成して記述
echo "<?php echo 'PHPの学習を始めよう!';" > index.php
# PHP内蔵の簡易Webサーバーを起動
php -S localhost:8000
起動後、ブラウザで http://localhost:8000 にアクセスし、「PHPの学習を始めよう!」と表示されれば、環境構築は完了です。
3. 【超基礎編】PHPの基本文法マスター
ここからは具体的にPHPのコードを書きながら基礎文法を学んでいきます。
3-1. PHPタグと文の区切り
PHPのコードは、<?php で始まり、?> で閉じます。
<?php
echo "こんにちは!";
?>
ただし、純粋なPHPコードのみが書かれたファイルでは、末尾の ?>(閉じタグ)は書かないのが実務上の標準ルールです。閉じタグの後に余計な改行やスペースが入ると、意図しない出力エラーを引き起こす原因になるためです。
<?php
// 実務では閉じタグを省略するのが一般的です
echo "これが標準的な書き方です";
3-2. コメントの書き方
コード中にメモを残したり、特定の処理を一時的に無効化したりするためにコメントを使用します。
<?php
// 1行コメント(行末までが無効化される)
# これも1行コメント(Shell形式)
/*
複数行にわたる
コメントアウトを
記述する場合はこれを使います
*/
3-3. 変数(Variable)の基本
値(データ)を一時的に保存しておくための「箱」を変数と呼びます。PHPの変数は、必ず頭に $(ドル記号)を付けます。
<?php
// 変数の定義と代入
$name = "山田太郎";
$age = 25;
// 変数の呼び出し
echo $name; // 山田太郎
echo $age; // 25
変数命名のルール
-
$1st_nameのように、数字から始まる変数名は使用できません。 - 英数字とアンダースコア(
_)が使用可能です。 - 大文字・小文字は区別されます(
$nameと$Nameは別の変数)。 - 実務では、単語の区切りを大文字にするキャメルケース(
$userName)またはアンダースコアで繋ぐスネークケース($user_name)で統一して記述します。
3-4. データ型(Data Types)
PHPは変数に代入された値に応じて、自動的に型を判別してくれます。代表的なデータ型は以下の通りです。
<?php
$string = "文字列です"; // 文字列型 (string)
$integer = 100; // 整数型 (integer)
$float = 3.14; // 浮動小数点型 (float)
$bool = true; // 論理型 (boolean: true または false)
$array = ["赤", "青"]; // 配列型 (array)
$null = null; // ヌル値 (null: 値が存在しない状態)
シングルクォートとダブルクォートの違い
文字列を囲む際、' '(シングルクォート)と " "(ダブルクォート)には重要な違いがあります。
<?php
$price = 500;
// シングルクォート:書いた文字がそのまま出力される
echo '価格は $price 円です'; // 出力: 価格は $price 円です
// ダブルクォート:変数展開(変数の値を置き換える)や特殊文字(\n など)が評価される
echo "価格は {$price} 円です"; // 出力: 価格は 500 円です
3-5. 演算子(Operators)
値の計算や比較を行うための記号です。
算術演算子
<?php
echo 10 + 3; // 加算: 13
echo 10 - 3; // 減算: 7
echo 10 * 3; // 乗算: 30
echo 10 / 3; // 除算: 3.3333...
echo 10 % 3; // 剰余(あまり): 1
echo 10 ** 3; // 累乗(10の3乗): 1000
比較演算子
実務では、型まで含めて厳密にチェックする === や !== を使用するのが原則です。
<?php
$a = 100;
$b = "100";
// あいまいな比較 (==) : 値が等しければ true になってしまう
var_dump($a == $b); // bool(true)
// 厳密な比較 (===) : 値とデータ型が共に一致する場合のみ true
var_dump($a === $b); // bool(false) ※片方は整数、片方は文字列のため
4. 【基礎編】配列と制御構造
プログラムに複雑な動きを持たせるために、複数のデータをまとめる「配列」と、条件によって処理を変える「制御構造」を学びます。
4-1. 配列(Array)の活用
配列には、番号で要素を管理するインデックス配列と、名前(キー)で要素を管理する連想配列があります。
インデックス配列
<?php
// 配列の宣言(角かっこ [] を使用)
$colors = ["赤", "青", "緑"];
// 要素の取得(0から始まるインデックス番号を指定)
echo $colors[0]; // 赤
echo $colors[2]; // 緑
// 要素の追加
$colors[] = "黄"; // 末尾に追加される
連想配列(Key-Valueペア)
実務でのデータ処理において、最も多用されるのが連想配列です。
<?php
$user = [
"id" => 1,
"name" => "田中角栄",
"email" => "tanaka@example.com",
"age" => 30
];
// キーを指定して値を取り出す
echo $user["name"]; // 田中角栄
echo $user["email"]; // tanaka@example.com
// 値の更新と追加
$user["age"] = 31; // 既存キーの更新
$user["role"] = "admin"; // 新しいキーと値の追加
4-2. 条件分岐(if / switch / match)
if文による分岐
<?php
$score = 85;
if ($score >= 90) {
echo "秀";
} elseif ($score >= 70) {
echo "優";
} elseif ($score >= 60) {
echo "良";
} else {
echo "不可";
}
match式(PHP 8.0以降の標準)
従来の switch 文よりも簡潔で、厳密な比較(===)が行われるため安全です。
<?php
$status = "success";
$message = match ($status) {
"success" => "処理が成功しました。",
"pending" => "処理中または保留です。",
"error", "failure" => "エラーが発生しました。",
default => "不明なステータスです。",
};
echo $message;
4-3. 繰り返し処理(for / while / foreach)
foreach文(配列のループ)
配列の全要素に対して順番に処理を行いたい場合、実務で最も使われるのが foreach です。
<?php
$products = [
["name" => "リンゴ", "price" => 150],
["name" => "バナナ", "price" => 100],
["name" => "みかん", "price" => 80],
];
foreach ($products as $index => $product) {
echo "商品" . ($index + 1) . ": " . $product["name"] . " (" . $product["price"] . "円)\n";
}
5. 【関数編】処理の共通化と組み込み関数
何度も繰り返す処理は、関数(Function)としてまとめることで再利用性と可読性が飛躍的に向上します。
5-1. 関数の定義と呼び出し
PHP 7以降、引数や戻り値に型を指定できる「型宣言」が導入されました。実務コードでは型宣言を明記することが標準です。
<?php
declare(strict_types=1); // ファイルの最先頭に書くことで、厳密な型チェックを有効化
// 税込価格を計算する関数
function calculateTax(int $price, float $taxRate = 0.10): int
{
return (int)($price * (1 + $taxRate));
}
// 関数の実行
$total = calculateTax(1000);
echo $total; // 1100
5-2. 実務でよく使う重要組み込み関数
PHPには標準で数多くの便利関数(組み込み関数)が用意されています。
文字列を扱う関数
<?php
$str = " Hello World! ";
// 前後の空白を削除
$trimmed = trim($str); // "Hello World!"
// 文字列の長さを取得(日本語の場合は mb_strlen を使う)
echo mb_strlen("こんにちは"); // 5
// 文字列の置換
echo str_replace("World", "PHP", $trimmed); // "Hello PHP!"
// 文字列を指定の文字で分割して配列化
$tags = "php,javascript,python";
$tagArray = explode(",", $tags); // ["php", "javascript", "python"]
配列を扱う関数
<?php
$numbers = [1, 2, 3, 4, 5];
// 要素の検索(存在すれば true)
var_dump(in_array(3, $numbers)); // true
// 配列の各要素に対して処理を適用(array_map)
$squared = array_map(function($n) {
return $n * $n;
}, $numbers);
// $squared は [1, 4, 9, 16, 25] となる
// 条件に合う要素だけをフィルタリング(array_filter)
$evens = array_filter($numbers, fn($n) => $n % 2 === 0);
// $evens は [2, 4] となる
6. 【中級編】フォーム処理とWebの仕組み
ここからは、実際にブラウザから送られたデータをPHPで受け取る「Webアプリケーション」としての動作原理を解説します。
6-1. HTTPリクエスト(GETとPOST)
Webブラウザからサーバーへの命令を「HTTPリクエスト」と呼びます。主に以下の2つが使われます。
-
GETリクエスト: データを取得したい時に使用。データはURLの後ろに
?name=yamada&age=20のような形式(クエリ文字列)で付与される。検索画面などで使用。 - POSTリクエスト: サーバー上のデータを更新・登録したい時に使用。データはリクエストの内部(ボディ)に隠されて送信される。フォーム入力、ログイン画面、決済などで使用。
6-2. スーパーグローバル変数
PHPには、どこからでもアクセスできる特殊な定義済み配列(スーパーグローバル)が存在します。
-
$_GET: GETリクエストで送信された値が格納される -
$_POST: POSTリクエストで送信された値が格納される -
$_SERVER: アクセス元のIPアドレスやリクエスト手法、実行ヘッダー情報などが格納される -
$_SESSION: サーバー側でユーザーのセッション状態を保持するために使用
6-3. 実践:お問い合わせフォームの作成
実際にフォームを作成し、送信された値をPHPで受け取ってみましょう。
入力画面:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>お問い合わせフォーム</title>
</head>
<body>
<h2>お問い合わせ</h2>
<form action="contact.php" method="POST">
<div>
<label for="username">お名前:</label>
<input type="text" id="username" name="username" required>
</div>
<div>
<label for="message">内容:</label>
<textarea id="message" name="message" required></textarea>
</div>
<button type="submit">送信する</button>
</form>
</body>
</html>
受信画面:contact.php
<?php
declare(strict_types=1);
// POSTで送信されたデータを受け取る(存在しない場合は空文字)
$username = $_POST['username'] ?? '';
$message = $_POST['message'] ?? '';
// XSS対策のためのエスケープ処理関数
function h(string $str): string
{
return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>送信完了</title>
</head>
<body>
<h2>送信内容の確認</h2>
<p><strong>お名前:</strong> <?php echo h($username); ?></p>
<p><strong>内容:</strong><br><?php echo nl2br(h($message)); ?></p>
<a href="index.html">戻る</a>
</body>
</html>
7. 【実務への第一歩】オブジェクト指向プログラミング(OOP)
大規模なプログラムを作る際、コードを整理して変更に強くするための設計思想がオブジェクト指向プログラミング(OOP)です。モダンPHPやLaravelなどのフレームワークは、100% オブジェクト指向で書かれています。
7-1. クラスとインスタンスの概念
オブジェクト指向はよく「金型」と「実体」に例えられます。
- クラス(Class): 設計図・金型(プロパティとメソッドを定義)
- インスタンス(Instance): クラスから生成された実体(たい焼き)
<?php
declare(strict_types=1);
// クラス(設計図)の定義
class User
{
// プロパティ(属性)
private string $name;
private string $email;
// コンストラクタ(インスタンス化時に自動実行される初期化処理)
public function __construct(string $name, string $email)
{
$this->name = $name;
$this->email = $email;
}
// メソッド(振る舞い・処理)
public function getProfile(): string
{
return "名前: {$this->name} / メールアドレス: {$this->email}";
}
}
// インスタンス化(実体の作成)
$user1 = new User("佐藤", "sato@example.com");
$user2 = new User("鈴木", "suzuki@example.com");
// メソッドの実行
echo $user1->getProfile(); // 名前: 佐藤 / メールアドレス: sato@example.com
7-2. カプセル化とアクセス修飾子
クラス内部の変数(プロパティ)を外部から勝手に書き換えられないように保護する仕組みをカプセル化と呼びます。
-
public: どこからでもアクセス可能 -
protected: 自身のクラスおよび継承した子クラスからのみアクセス可能 -
private: 自身のクラス内からのみアクセス可能(一番厳密)
<?php
class BankAccount
{
private int $balance = 0; // 外部から直接書き換えられないよう private に設定
public function deposit(int $amount): void
{
if ($amount > 0) {
$this->balance += $amount;
}
}
public function getBalance(): int
{
return $this->balance;
}
}
$account = new BankAccount();
$account->deposit(5000);
// $account->balance = 1000000; // エラー! privateプロパティへの直接操作は禁止されている
echo $account->getBalance(); // 5000
7-3. 継承とインターフェース
- 継承(Inheritance): 既存のクラスのプロパティやメソッドを引き継ぎ、新しい機能を追加したクラスを作る仕組み。
- インターフェース(Interface): クラスが持つべきメソッドのルール(契約)を定義する仕組み。実装を強制することでコードの統一感を保ちます。
<?php
// インターフェースの定義
interface LoggerInterface
{
public function log(string $message): void;
}
// インターフェースを具現化(実装)したクラス
class FileLogger implements LoggerInterface
{
public function log(string $message): void
{
// ファイルにログを書き込む処理
file_put_contents('app.log', date('Y-m-d H:i:s') . ' ' . $message . PHP_EOL, FILE_APPEND);
}
}
8. 【実践編】データベース(MySQL)連携 PDOの使い方
多くのWebアプリではユーザー情報や記事データをデータベース(RDBMS)に保存します。PHPから安全にデータベースと接続・操作するために PDO(PHP Data Objects) を使用します。
8-1. PDOでのデータベース接続
PDOを使うことで、MySQLやPostgreSQLといったデータベースの違いを抽象化して同じ書き方で操作できます。
<?php
declare(strict_types=1);
$dsn = 'mysql:host=localhost;dbname=sample_db;charset=utf8mb4';
$user = 'root';
$password = 'password';
try {
// PDOインスタンスの作成(DB接続)
$pdo = new PDO($dsn, $user, $password, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // エラー発生時に例外をスローする設定
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // データを連想配列形式で取得
PDO::ATTR_EMULATE_PREPARES => false, // プリペアドステートメントのエミュレーションを無効化
]);
echo "データベース接続に成功しました。";
} catch (PDOException $e) {
// エラーハンドリング
exit("DB接続エラー: " . $e->getMessage());
}
8-2. プリペアドステートメントによる安全なCRUD処理
SQLに変数を直接埋め込むと後述する「SQLインジェクション」という極めて危険な脆弱性が発生します。必ずプレースホルダー(? や :name)を使ったプリペアドステートメントを使用します。
C: Create(データ挿入)
<?php
$sql = "INSERT INTO users (name, email) VALUES (:name, :email)";
$stmt = $pdo->prepare($sql);
// 値のバインドと実行
$stmt->execute([
':name' => '高橋健太',
':email' => 'takahashi@example.com'
]);
echo "ID: " . $pdo->lastInsertId() . " でユーザーを登録しました。";
R: Read(データ取得)
<?php
// 条件検索
$sql = "SELECT * FROM users WHERE email = :email";
$stmt = $pdo->prepare($sql);
$stmt->execute([':email' => 'takahashi@example.com']);
// 1件取得
$user = $stmt->fetch();
if ($user) {
echo "該当ユーザー: " . $user['name'];
} else {
echo "ユーザーが見つかりません。";
}
U: Update(データ更新) / D: Delete(データ削除)
<?php
// 更新処理
$updateSql = "UPDATE users SET name = :name WHERE id = :id";
$updateStmt = $pdo->prepare($updateSql);
$updateStmt->execute([
':name' => '高橋新一',
':id' => 1
]);
// 削除処理
$deleteSql = "DELETE FROM users WHERE id = :id";
$deleteStmt = $pdo->prepare($deleteSql);
$deleteStmt->execute([':id' => 1]);
9. 【セキュリティ編】実務で絶対に落とせないWebセキュリティ知識
実務での開発において、セキュリティ対策を怠ったコードは企業に重大な損害を与えるリスクがあります。主要な3大脆弱性と対策を必ず理解しておきましょう。
9-1. クロスサイトスクリプティング(XSS)
ユーザーが入力した悪意あるJavaScriptが、閲覧者のブラウザ上で実行されてしまう攻撃です。セッションハイジャックや偽画面への誘導などが起こります。
- 原因: ユーザーの入力値をエスケープ(害のない文字列に変換)せずにそのままHTMLに出力すること。
-
対策: HTML出力部分で
htmlspecialchars()関数を適用する。
// 対策用エスケープ関数
function h(string $string): string
{
return htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
}
// 出力時
echo h("<script>alert('ハックされました');</script>");
// 出力結果: <script>alert('ハックされました');</script>
9-2. SQLインジェクション
入力フォームなどに悪意あるSQLの一部を注入し、データベースを不正に操作(全データ削除や個人情報漏洩)する攻撃です。
-
原因: SQL文の中に文字列連結で直接変数(
$_POST['id']など)を埋め込むこと。 - 対策: データベース操作時は必ずPDOのプリペアドステートメント(パラメータバインド)を使用する。
9-3. クロスサイトリクエストフォージェリ(CSRF)
他の悪意あるサイトに仕込まれた罠リンクやフォームを経由して、ログイン中のユーザーに意図しない操作(パスワード変更、投稿、商品の購入など)を強制させる攻撃です。
- 対策: フォーム表示時にランダムな暗号トークンを発行してセッションに保持し、送信時にトークンの一致を検証する。
<?php
session_start();
// 1. トークンの生成とセッション保存
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
// 2. POST処理時の検証
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$postedToken = $_POST['csrf_token'] ?? '';
if (!hash_equals($_SESSION['csrf_token'], $postedToken)) {
http_response_code(403);
exit("不正なリクエスト(CSRF検証失敗)です。");
}
// 正常処理...
}
?>
<!-- フォーム内にトークンを埋め込む -->
<form method="POST">
<input type="hidden" name="csrf_token" value="<?php echo h($_SESSION['csrf_token']); ?>">
<button type="submit">送信</button>
</form>
10. 【モダン開発編】ComposerとモダンPHPの潮流
現代のPHP実務開発は、外部の便利なライブラリを組み合わせて開発を進めるスタイルが一般的です。それを支えているのが Composer です。
10-1. Composerとは?
Composerは、PHPのための依存関係管理ツールです。
Pythonでいう pip、Node.jsでいう npm にあたります。
プロジェクトで利用したい外部ライブラリ(ログ出力のMonolog、メール送信のSwiftMailer、HTTP通信のGuzzleなど)のバージョン管理やインストールを一元化してくれます。
10-2. Composerの基本コマンド
プロジェクト直下で以下のコマンドを実行します。
# 1. プロジェクトの初期化 (composer.json が作成される)
composer init
# 2. パッケージの追加 (例: Guzzle HTTPクライアントの追加)
composer require guzzlehttp/guzzle
# 3. 構成の更新・ダウンロード
composer install
10-3. オートロード(Autoloading)とPSR-4
Composerを導入する最大のメリットの一つがオートロード機能です。
従来は各ファイルの先頭に require_once 'ClassA.php'; を何行も書く必要がありましたが、Composerのオートローダーを使えば、ファイルの読み込みを全自動化できます。
<?php
// プロジェクトの先頭で1回だけ読み込む
require_once __DIR__ . '/vendor/autoload.php';
use GuzzleHttp\Client;
// require を書かなくても自動でクラスが読み込まれて使える
$client = new Client();
$response = $client->request('GET', 'https://api.github.com/repos/php/php-src');
echo $response->getStatusCode(); // 200
11. 【フレームワーク編】Laravelで学ぶモダンWeb開発入門
現在のPHP開発現場において、生のPHP(プレーンPHP)だけで大型システムを一から構築することは滅多にありません。多くの場合、Laravel に代表されるWebアプリケーションフレームワークが使用されます。
11-1. MVCアーキテクチャとは?
Laravelなどのフレームワークは MVC(Model-View-Controller) と呼ばれる設計パターンに基づいて構成されています。役割を明確に分離することで、コードの可読性と保守性を最大化します。
【ユーザーのリクエスト】
│
▼
[ Routing ] (URLの判定)
│
▼
[ Controller ] ── (データの要求・処理) ──> [ Model ] (DB操作)
│ │
│ <───────── (処理結果の返却) ──────────┘
│
(データを渡す)
│
▼
[ View ] ──> 【ユーザーにレスポンス(HTML)を返す】
- Model(モデル): データベースとのやりとりやビジネスロジック(計算や処理)を担当。
- View(ビュー): ユーザーに見せる画面の見た目(HTMLテンプレート)を担当。
- Controller(コントローラ): 全体の指示役。ユーザーからのリクエストを受け取り、Modelに必要な処理をさせ、結果をViewに渡す。
11-2. Laravelの構造(コード例)
1. ルーティング (routes/web.php)
特定のURLにアクセスがあった際、どの処理を呼び出すかを定義します。
use App\Http\Controllers\UserController;
// /users/{id} にGETアクセスが来たら UserController の show メソッドを実行
Route::get('/users/{id}', [UserController::class, 'show']);
2. コントローラ (app/Http/Controllers/UserController.php)
ビジネスロジックと画面表示を繋ぎます。
<?php
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\View\View;
class UserController extends Controller
{
public function show(int $id): View
{
// Eloquent ORM(Model)を使ってDBからユーザーを取得(なければ404表示)
$user = User::findOrFail($id);
// 'user.profile' ビューに $user データを渡して表示
return view('user.profile', ['user' => $user]);
}
}
3. ビュー (resources/views/user/profile.blade.php)
Laravel独自のBladeテンプレートエンジンを使い、安全かつシンプルな記述でHTMLを出力します。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>ユーザープロフィール</title>
</head>
<body>
<!-- {{ $user->name }} で自動的にエスケープ処理が行われる -->
<h1>{{ $user->name }} さんのマイページ</h1>
<p>メールアドレス: {{ $user->email }}</p>
</body>
</html>
12. まとめ:実務で活躍するPHPエンジニアになるために
本記事では、PHPの完全な初心者から実務レベルを目指すエンジニアに向けて、必須となる知識を一通り解説してきました。
これからの学習ロードマップ
-
基礎文法の完全定着: 変数、配列、制御構造(
if/foreach)、関数の基本を身につける。 - Webとデータベースの連携: フォームからのPOSTデータ処理と、PDOを用いたMySQLの操作(CRUD処理)を学ぶ。
- セキュリティ対策の実践: XSS対策(エスケープ)、SQLインジェクション対策(プリペアドステートメント)、CSRF対策(トークン)を徹底する。
- オブジェクト指向とComposerの理解: クラス設計とオートロード、パッケージ管理の基礎を押さえる。
- Laravelによる実践開発: 実際に「掲示板」「TODOアプリ」「ユーザー認証付きのECサイト」などのWebアプリケーションを構築し、Web開発の一連の流れを習得する。
PHPは文法が親しみやすく、学んだ結果がすぐにブラウザの画面に反映されるため、モノづくりの楽しさを実感しやすい言語です。ぜひ手元で実際にコードを動かしながら学習を進め、価値あるプロダクトを生み出せるエンジニアを目指してください!