生PHPを本気で学んでみたので、超分かりやすく完全解説していく！


# はじめに

こんにちは、mamiと申します。
メインはフロントエンドをやっているのですが、最近縁があってPHPをガッツリ学ぶ機会がありました。

その際に得た知見などをせっかくならQiitaで記事として書こうと思って、今回書いております。
フロントをずっとやってきた私にとってバックエンドの知識自体がほぼ初めてだったため、概念から何から何まで本当に勉強になりました。
敢えて生PHPの記事を上げるのは、フレームワークに頼らないで基礎の知識をしっかりと付ける目的のもと勉強しております。

なので、これを見られている駆け出しエンジニアの方、私と同じフロントエンドメインの方、未経験の方のご参考になれれば幸いです。




# PHPの特徴

では早速ですが、PHPの特徴を見ていきましょう。

## PHPってなんですの？

そもそもPHPとは、スクリプト言語と呼ばれるもので、プログラミング言語のうち、プログラムの記述や実行を比較的簡単に行うことができる言語の総称である。
多くの場合、スクリプト言語はインタープリタ型言語1であり、コンパイラ型言語2に比べて実行までの処理の手間がかからないという特徴を持っている。

また、他のプログラミング言語に比べると、習得が比較的容易とされています。



## 他言語との比較

そもそも、PHPはWebアプリケーションの開発にとても向いています。しかし、PHP以外にもWebアプリケーション開発に使われるサーバーサイドのプログラム言語は幾つも存在します。
有名どころで言うとRuby,Python,Javaなどですね。これらのサーバーサイド言語と比較したPHPの特徴は以下の通りです。


### ①しなやかに姿形を変えることが求められる、B2Cのサービスに向いている。
業務系などのよりシビアな処理精度が求められる、B2Bのようなサービスには、PHPよりもJavaなどの開発に労力がかかる代わりに、より厳密な言語構造を持つプログラミング言語の方にアドバンテージがあります。

PHPが向いているのは、どちらかと言うと消費者からのニーズに応じた「しなやか」な変化を求められるB2CのWebサービスです。
PHPは言語構造がそれほど複雑ではないため、手早くWebアプリケーションを仕上げることができます。また、サービス公開後の機能追加や変更にかかる労力も、Javaのような厳密な言語に比べると少なく見積もることができます。



### ②手早く仕上げるか、堅牢に仕上げるかはポリシー次第

PHPは手早く書ける分処理速度が低いかと言うと、必ずしもそうではありません。自由度が高いため、手抜きすることもできますし、しっかりとした堅牢なアプリケーションを作ることもできます。

少しばかり雑でもいいから手早く作るか、逆に少しばかり労力がかけてでも堅牢なものを作るかは、PHPの世界では開発チームの匙加減に委ねられています。


### ③習得しやすい

PHPは自由度が高いプログラミング言語なので、習得にあたって覚えるべきルールが他の言語に比べて少ないと言えます。
そのため、他の言語よりも少ない労力で、書き方を身につけることができます。


### ④アーティスティックな書き方がしにくい分、チームメンバー間で理解を共有しやすい

PHPはワンライナー(1行でたくさんの処理をひとまとめに表すこと）が使いにくい言語です。ワンライナーは、手早くプログラム処理を書くの便利である一方、アート性が高い(読解しにくい)プログラムになりがちで、「Aさんが書いたプログラムを、Bさんが読解して修正する」といったチーム開発には不向きであると言えます。

その点、PHPはワンライナーが書きにくいため、キータイプ量は多くなってしまいますが、チームメンバーが連携して開発を進めるには向いています。



### ⑤古くから定評があり、情報や外部ライブラリが得やすい

PHPは古くからある言語で、開発の際の	とらぶるしゅーてょ情報をブログやQiitaなどで発信している方がたくさんいますし、コミュニティも充実しています。

また、開発の手助けをしてくれる外部ライブラリも豊富で、よくある機能(PDF出力やExcel出力など)なども一通り揃っています。






引用元：
[PHP本格入門［上］～プログラミングとオブジェクト指向の基礎からデータベース連携まで](https://gihyo.jp/book/2020/978-4-297-11468-8)





# 基礎文法

では、PHPが何なのかがわかったところで早速基礎文法を見ていきましょう。
この基礎ができていないことには何も書けません。

とは言え、何かしら他の言語をやっていた方にはお馴染みの文法だと思いますので、復習がてら見ていってください。


## if文

個人的よく使う基礎文法第1位です。(独断と偏見です）
条件分岐ってやつですね。

構文は下記の通りで、括弧内の条件が true の場合、その後ろの処理が実行される、という訳です。

```php
if (condition) {
  // 条件がtrueである場合に実行される
}
```

これを応用した実例で見てみましょう。
下記例文では、 x の値が20以上であれば2行目を表示、10以上20未満であれば4行目を表示、それ以外の10未満であれば6行目を表示するif文です。

2個目の条件、3個目の条件などは elseif　や else などで書き分けれると言う訳です。


```php
$x = 15;

// $xの値に応じてメッセージを変える
if ($x > 20) {
  echo "数値は20より大きいです。";
} elseif ($x > 10) {
  echo "数値は10より大きいですが、20よりは大きくありません。";
} else {
  echo "数値は10以下です。";
}
```

余談ですが、条件分岐の他の書き方として「三項演算子」というものがあります。
構文は下記の通りで

```php
expression1 ? expression2 : expression3

```

例えば、以下のような条件分岐があった場合、if文で書くと少し長めの記述になってしまいます。

```php
// if文を使用した場合
$x = 15;
if ($x > 10) {
  $result = "数値は10より大きいです。";
} else {
  $result = "数値は10以下です。";
}
echo $result;

```

これを三項演算子で書くと、下記のように書けて、条件式自体は１行で書けてしまいます。
すごく便利ですよね。


```php
// 三項演算子を使用した場合
$x = 15;
$result = $x > 10 ? "数値は10より大きいです。" : "数値は10以下です。";
echo $result;

```

ただ注意点として、ネストして書くこともできますが、条件が複雑になってくると可読性が著しく下がってくるので
比較的簡単な条件式には三項演算子を使うといいでしょう。

実務でもよく出るコードなので、ぜひ覚えてください。



## foreach文

foreach文は配列の各要素に対して**ループ処理**を行うための構文です。基本的な使用方法は次のとおりです

```php
foreach ($array as $value) {
  // 実行コード
}

```
ここで `$array`は対象の配列を指し、 `$value`は配列の各要素の値を指します。配列の各要素に対して、`// 実行コード` で指定されたコードが実行されます。


ちなみに、配列の各要素のキーと値の両方を取得する場合は次のように書くことができます。

```php
foreach ($array as $key => $value) {
  // 実行コード
}

```

では、実際の例文を見てみましょう。

このコードは、`$fruits配列`の各要素に対して、その値を出力します。
結果として、`"apple", "banana", "cherry"`がそれぞれ新しい行に出力されます。

```php
$fruits = array("apple", "banana", "cherry");

foreach ($fruits as $fruit) {
  echo $fruit . "\n";
}

```

では、もっと実践的な例を見てみましょう。
実務ではよく連想配列をいじることがあります。そんな時に`foreach文`は活躍します。

`$fruits配列`の各要素（果物とその色）に対して、キー（果物の名前）と値（色）を出力します。結果として、`"apple is red", "banana is yellow", "cherry is red"`がそれぞれ新しい行に出力されます。


```php
$fruits = array("apple" => "red", "banana" => "yellow", "cherry" => "red");

foreach ($fruits as $fruit => $color) {
  echo $fruit . " is " . $color . "\n";
}

```

こうやって連想配列の値を編集したりするわけですね。





## while文

while文は**指定した条件が真（true）である限り繰り返し処理（ループ）** を行います。

基本的な構文は以下のようになります。

```php
while (condition) {
  // 実行コード
}

```

イメージがしづらいかもしれないので、例文を見てみましょう。

以下のコードは変数`$i`が10未満である間、`$i`の値を出力し、`$i`の値に1を加え続けます。
よって、実行結果としては0から9までの数字がそれぞれ新しい行に出力されます。

`$i`が10未満になった時、つまり`($i < 10)`が false になると自動的に実行が終了します。
これが while文です。

```php
$i = 0;

while ($i < 10) {
  echo $i . "\n";
  $i++;
}

```




## 関数

続いては関数です。これもよく使うので覚えましょう。
関数を作成するための基本的な構文は以下のようになります。

ここで `functionName`は関数の名前を、`$parameter1, $parameter2, ...`は関数に渡されるパラメータ（引数）を示します。関数の中には実行されるコード（処理）が記述され、`return`で関数の結果を返すことができます。


```php
function functionName($parameter1, $parameter2, ...) {
  // 関数の処理
  return $result;
}

```

以下に具体的な例を示します。この例では、2つの数値を受け取り、その積を返す関数`multiply`を作成します。

この例では、`multiply関数`は2つのパラメータ`（$num1と$num2）`を受け取り、その積を計算して返します。関数を呼び出すときは、その名前と一緒に必要な引数（`multiply(4, 5)`）を渡します。この例の場合、返される値`（$product）`は20となり、これがechoを使って出力されます。

```php
// 2つの数値の積を計算する関数
function multiply($num1, $num2) {
  $product = $num1 * $num2;
  return $product;
}

// 関数の使用例
$result = multiply(4, 5);
echo $result; // 結果：20

```

つまり、関数の役割としては**特定のタスクを実行するための一連の命令をカプセル化（まとめて管理）している**、という訳です。








## SQLでのDB操作

基本文法を覚えたところで、SQLを作成してDB操作の方法も学んでいきましょう。
サーバーサイドなのでDB操作は切っても切り離せない存在と言えるでしょう。


よく使うSQL文がいくつかあるので、一気に見ていきましょう。


```php
# // データベースを作成する
CREATE DATABASE データベース名

# // テーブルを作成する
CREATE TABLE テーブル名 (カラム１ 型, カラム2 型)

# // データベースの一覧を表示する
SHOW DATABASES;

# // データベースを選択する
USE データベース名;

# // テーブルの一覧を表示する
SHOW TABLES;

# // テーブルの構造を表示する
DESC テーブル名;

# // テータを登録する
INSERT INTO テーブル名 (カラム１, カラム２, ...) VALUES(値１, 値２, ...);

# // データを更新する
UPDATE テーブル名　SET カラム１ =  値１, カラム２ = 値２, ... WHERE カラム３ = 値３;

# // データを削除する
DELETE FROM テーブル名 WHERE カラム１ = 値１;

# // データベースを取得する
SELECT カラム１, カラム２, ... FROM テーブル名 WHERE カラム名　条件

```

いっぱいありますね。
でも安心してください。そこまで難しいクエリではないので、書いている内容は単純です。

よく使うのはやはり基本のCRUD処理の構文でしょうか。
CRUD、つまり **CREATE（作成)、READ（閲覧）、UPDATE（更新）、DELETE（削除）** ですね。

試しにUPDATEクエリの、実際の例文を見てみましょう。

この例では、employeesという名前のテーブルを作成します。このテーブルはid（整数型）、name（文字列型）、birthday（日付型）の3つの列を持ちます。

```sql
-- employeesテーブルの作成
CREATE TABLE employees (
    id INT,
    name VARCHAR(100),
    birthday DATE
);

```
上記のSQL文を実行すると、指定した構造のemployeesテーブルが作成されます。


ついでなので、残りのRUDの例文も見ていきましょう。

**READ（SELECT文）**

```sql
-- employeesテーブルから全てのデータを取得
SELECT * FROM employees;

```

上記のSQL文はemployeesテーブルから全てのデータを取得します。*は全ての列を意味します。

**UPDATE**

```sql
-- employeesテーブルの特定のデータを更新
UPDATE employees
SET name = '新しい名前'
WHERE id = 1;

```

上記のSQL文はemployeesテーブルのidが1のレコードのnameを'新しい名前'に更新します。WHERE句により更新するレコードを特定します。SET句により更新後の値を設定します。

**DELETE**

```sql
-- employeesテーブルの特定のデータを削除
DELETE FROM employees
WHERE id = 1;

```

上記のSQL文はemployeesテーブルのidが1のレコードを削除します。WHERE句により削除するレコードを特定します。


補足ですが、UPDATE文とDELETE文はWHERE句を省略すると全てのレコードが対象となるため、意図しないデータの変更や削除を防ぐためにもWHERE句を正確に指定することが重要です。

個人開発であればまだいいですが、実務で「やっちまった・・・」なんてことがないように気をつけましょうね…！



# 基本のCRUD処理


では、SQL文がわかったところで実際にPHPでCRUD処理を書くにはどうしたらいいかを学んでいきましょう。
何度も言いますが、CRUD処理は本当に基本中の基本になりますので、必ずできるようになっておきましょう。

ここでは、DB接続にPDO(PHP Data Objects)を使用しています。
これは、PHPで提供されるデータベースアクセス抽象化ライブラリの一つで、PHPのプログラムから様々な種類のデータベースに対して、統一された方法でアクセスすることを可能にします。

要は、**異なるデータベースシステムを一貫したコードで操作でき、セキュリティ面も保護してくれる！** っていう感じのイメージです。
まあそういうものがあるんだと言う認識で十分です。



### CREATE

まずは、CREATE処理です。

下記は、「山田太郎」と誕生日の「1990-01-01」を employeesテーブル に挿入する処理を`INSERT文`で行なっております。

「あれ？CREATEだから新規作成の`CREATE文`で行うんじゃないの？」

そう思った方もいるかもしれません。
そもそも`CREATE文`はデータベースやテーブルを新規に作成するために使用されます。

一方、新しいレコード（行）をテーブルに挿入（作成）する際には、"INSERT"文を使用します。
基本的にCREATE処理は新しいレコードを、テーブルに挿入する処理を行うので、「INSERT」で合っているという訳です。

それを踏まえて下記を見てみましょう。


```php
<?php
// PDOインスタンスを生成
$dbh = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');

// SQL文を準備
$sql = "INSERT INTO employees (name, birthday) VALUES (:name, :birthday)";

// SQL文を実行するための準備
$stmt = $dbh->prepare($sql);

// パラメータを設定
$stmt->bindParam(':name', $name);
$stmt->bindParam(':birthday', $birthday);

// パラメータの値を設定
$name = "山田太郎";
$birthday = "1990-01-01";

// SQL文を実行
$stmt->execute();
?>

```


まず1行目で、先ほど説明したPDOインスタンスを生成し、DBへの接続を確立しています。

次の行でINSERT文のSQL文を準備します。
これはemployeesというテーブルに新しいレコードを追加するためのもので、`:name`と`:birthday`はパラメータを示しています。

```php
// PDOインスタンスを生成
$dbh = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');

// SQL文を準備
$sql = "INSERT INTO employees (name, birthday) VALUES (:name, :birthday)";

```

次の行で、SQL文をデータベースに対して実行するための準備を行っています。
(`prepare` = QL文を準備し、その中のパラメータ（プレースホルダ）を使用するためのメソッド)

そして、先ほどのSQL文のパラメータ`:name`と`:birthday`に、それぞれ`$name`と`$birthday`の値をバインド（関連付け）しています。
(`bindParam` = 特定のパラメータに具体的な値を関連付け（バインド）するためのメソッド)


```php
$stmt = $dbh->prepare($sql);

// パラメータを設定
$stmt->bindParam(':name', $name);
$stmt->bindParam(':birthday', $birthday);
```

そして、`$name`と`$birthday`にパラメータの値を設定します。

最後に、`executeメソッド`で準備したSQL文を実際にデータベースに対して実行しています。
これにより、employeesテーブルに"nameが山田太郎、birthdayが1990-01-01"の新しいレコードが追加されます。


```php
// パラメータの値を設定
$name = "山田太郎";
$birthday = "1990-01-01";

// SQL文を実行
$stmt->execute();
```

以上が実際のコードを想定した`CREATE`処理の内容になります。
イメージ湧いてきましたでしょうか？
いよいよプログラミングっぽくなってきましたね！

基本的に新たにデータなどを作成するときは、こう言うふうな記述方法になるかと思います。

他の処理内容もどんどん見ていきましょう。





### READ

すでに説明した箇所については端折っていきます！


```php
<?php
// PDOインスタンスを生成
$dbh = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');

// SQL文を準備
$sql = "SELECT * FROM employees";

// SQL文を実行し結果を取得
$result = $dbh->query($sql);

// 結果をループして表示
foreach ($result as $row) {
  echo $row['name'] . ", " . $row['birthday'] . "\n";
}
?>

```


まず、SQL文を作成していますね。今回はREADなので`SELECT文`になります。
なので下記は、`employees`テーブルから全てのレコード（列）を取得するためのSQL文を準備しています。ここでの`*`はすべての列を指します。

そして、次の文で準備したSQL文をデータベースに対して実行しています。実行結果（選択されたレコードのリスト）は、`$result変数`に保存されます。


```php
// SQL文を準備
$sql = "SELECT * FROM employees";

// SQL文を実行し結果を取得
$result = $dbh->query($sql);
```


ここで、先ほどはクエリの実行に`execute`を使用していました。
しかし今回は`query`メソッドを使用しています。これは何故なんでしょうか？

答えとしては、2つとも役割は同じだが、用途が微妙に違います。
`query`メソッドは、SQL文をデータベースに直接実行します。このメソッドは主にパラメータを必要としないSQL文（例えば、静的なSELECT文など）を実行する場合に使用されます。

一方、`executeメソッド`は、`prepareメソッド`で準備したSQL文（主にパラメータを含むSQL文）を実行します。

つまり、「**直接実行する**」のか「**準備したものを実行するのか**」の違いで使い分けが必要、ということですね。



```php
// 結果をループして表示
foreach ($result as $row) {
  echo $row['name'] . ", " . $row['birthday'] . "\n";
}
```

では最後の行を見ていきましょう。
これは、基本文法でもやったforeach文ですね。配列の各要素に対してループ処理を行うための構文でしたね。

つまりこの文の意味としては、選択された各レコード（$row）を取り出し、その"name"列と"birthday"列の値を表示する処理を行なっております。

これで、先ほどSELECT文で実行したテーブルの中身が表示(READ)できたました！







### UPDATE

続いて`UPDATE`（更新）処理です。
ぶっちゃけSQL文以外はほとんど同じです。


```php
<?php
// PDOインスタンスを生成
$dbh = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');

// SQL文を準備
$sql = "UPDATE employees SET name = :name WHERE id = :id";

// SQL文を実行するための準備
$stmt = $dbh->prepare($sql);

// パラメータを設定
$stmt->bindParam(':name', $name);
$stmt->bindParam(':id', $id);

// パラメータの値を設定
$name = "山田花子";
$id = 1;

// SQL文を実行
$stmt->execute();
?>

```


なのでSQL文のみ説明します。

`employees`テーブルの中で`id`が特定の値（:idにバインドされる値）と一致するレコードの`name`を新しい値（:nameにバインドされる値）に更新する」という操作を意味します。

要はIDが一致する`name`カラムの中身を`$name`に更新するクエリを書いている、ということですね。

```php
$sql = "UPDATE employees SET name = :name WHERE id = :id";
```

その他については、CREATE処理と同様です。
違うのはUPDATE文なので、対応するカラムのValueが更新される、ということです。




### DELETE

最後に`DEREAT`(削除)処理を見ていきましょう。

```php
<?php
// PDOインスタンスを生成
$dbh = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');

// SQL文を準備
$sql = "DELETE FROM employees WHERE id = :id";

// SQL文を実行するための準備
$stmt = $dbh->prepare($sql);

// パラメータを設定
$stmt->bindParam(':id', $id);

// パラメータの値を設定
$id = 1;

// SQL文を実行
$stmt->execute();
?>

```

下記SQL文は、`employees`テーブルの中で`id`が特定の値（:idにバインドされる値）と一致するレコードを削除する文です。

```php
$sql = "DELETE FROM employees WHERE id = :id";
```

その他の部分についてはもう説明は不要ですね。










# オブジェクト指向

さて、ここから一気に難しくなってくるかもしれませんが頑張ってついてきてください。

ここで覚えてほしいのが「**オブジェクト指向**」です。
一度は聞いたことがあるかもしれません。

オブジェクト指向ではよく「概念」という言葉が使われるので、なんとなく分かりづらいイメージがありますよね。とはいえ、エンジニアにとってオブジェクト指向の概念を理解することは必須なので、少しずつでもその考え方に慣れていきましょう。


まず、オブジェクト指向をシンプルに説明すると、「**オブジェクト＝モノ**」の作成と「**操作**」に分けてプログラミングしていく考え方になります。

下記例えがすごく分かりやすかったので、引用させていただきます。

> RPGを例にして説明します。
RPGには、プレイヤーや敵、フィールド、武器、NPCなどが必要ですよね？
このプレイヤーや敵、フィールド、武器、NPCが「モノ」に当たります。
そして、それらを組み合わせた結果として完成するのがRPGです。
今まではRPGを一つの「モノ」として作っていたのを、オブジェクト指向では、細かい「モノ」に分けて、それぞれを組み合わせたものをRPGとして呼ぶことにしています。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2819187/0bf89fd8-6834-5680-a22f-fdf131f7f8de.png)

引用：[オブジェクト指向(プログラミング)とは?](https://www.moringa-moringu.com/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%A8%E3%81%AF/)


こうすることで、プログラミングの効率化にも繋がり、エラーやバグが起きた時の原因も見つけやすくなります。またプログラムの方向性が変わった時、変更を加えるのが容易になると言う訳です。

その他、オブジェクト指向には継承やカプセル化、ポリモフィズムという考え方もあります。
今回は概念の説明になりましたが、もっと深掘りしてちゃんと理解したい！と言う方は、下記記事が死ぬほど分かりやすかったので一度読んでみてください。



https://qiita.com/tip1t/items/b2f8e39d7cc23ad505f9











# MVCについて

オブジェクト指向が何となくわかったところで、次に覚えるべきMVCについて説明します。

## MVCとは

MVC（Model-View-Controller）はソフトウェア設計パターンの一つで、アプリケーションを3つの部分、つまり**モデル(Model)、ビュー(View)、コントローラ(Controller)** に分割します。これにより、**ユーザーインターフェースとビジネスロジックの分離**が可能になり、**コードの再利用性とメンテナンス性が向上**します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2819187/e35f16f5-2306-22ec-1ce2-b1cadae4e708.png)


画像引用：[MVCモデルとは何か？Laravelを用いたソースコードの具体例を用いて説明](https://ssaits.jp/promapedia/method/mvc.html)

MVCモデルは特にWebアプリケーション開発の現場においてよく用いられており、Laravelをはじめとする多くのフレームワークはこのMVCモデルを採用しています。


MVCに基づいてコードを書いていくことで、それぞれの責務の分離と、拡張性や保守性も高まり開発効率が上がる！という訳ですね。


## 実際のコード

これだけだといまいちピンとこないかもしれないので、実際のコードを見ながら理解していきましょう。


下記は、一つのユーザー情報を取得して表示するというシンプルな例です。


### モデル(Model)

まず、モデルを作ります。モデルはデータの操作を担当します。

```php
class UserModel
{
    private $name;
    private $email;

    public function __construct($name, $email)
    {
        $this->name = $name;
        $this->email = $email;
    }

    public function getName()
    {
        return $this->name;
    }

    public function getEmail()
    {
        return $this->email;
    }
}

```



### ビュー(View)

次に、ビューを作ります。ビューはユーザーに情報を表示します。



```php
class UserView
{
    public function output(UserModel $user)
    {
        return 'Name: ' . $user->getName() . ', Email: ' . $user->getEmail();
    }
}

```


### コントローラ(Controller)

最後に、コントローラを作ります。コントローラはモデルとビューをつなぎます。


```php
class UserController
{
    private $userModel;
    private $userView;

    public function __construct(UserModel $userModel, UserView $userView)
    {
        $this->userModel = $userModel;
        $this->userView = $userView;
    }

    public function showUser()
    {
        echo $this->userView->output($this->userModel);
    }
}

```



### 最後に組み合わせる

これらを組み合わせると、次のようになります。

```php
$user = new UserModel('Taro', 'taro@example.com');
$view = new UserView();
$controller = new UserController($user, $view);

$controller->showUser();

```

このコードを実行すると、`Name: Taro, Email: taro@example.com`という結果が得られます。
`UserController` の `showUser` メソッドを呼び出すと、コントローラは `UserModel` からデータを取得し、そのデータを `UserView` に渡して表示しているということです。


MVCパターンはアプリケーションの構造を整理し、各コンポーネントがそれぞれ独立して動作できるようにします。これによって、アプリケーションのテストやメンテナンスが容易になることがお分かりいただけたかなと思います。









# クラスとか継承とかについて

さて、ここまでいろいろな概念や基本文法などを学んできたかと思います。
かなり基礎的なことはお分かりいただけたかと思いますが、PHPにはもう少し理解しておかなければいけないことがあります。

それがクラスとか継承とかコンストラクタとかについてです。
これえらはオブジェクト指向の時にも少し出てきましたね。

これらを活用することで、しっかりPHPをフル活用できるようになります。

逆に、ここまで学んできたことと、後述するものが理解できたならば、大抵のものはもう作れるようになっているはずです！

最後の踏ん張りどころだと思って記載を入れて学んでいきましょう！！


## クラス

クラスはオブジェクト指向プログラミングにおける設計図のようなもので、同じ種類のオブジェクトが持つべきプロパティ（データ）とメソッド（機能）を定義します。


```php
class Car {
    public $color;

    public function setColor($color) {
        $this->color = $color;
    }
}

```

この例では、`Car`というクラスを定義し、そのクラスには`color`というプロパティと、`setColor`というメソッドがあります。


## コンストラクタ

コンストラクタはクラスがインスタンス化されるとき（オブジェクトが生成されるとき）に自動的に呼び出される特殊なメソッドです。初期化に必要なコードをここに書くことができます。


```php
class Car {
    public $color;

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

```
この例では、`Car`クラスの新しいインスタンスが生成されるときに、`color`プロパティの初期値を設定するコンストラクタを定義しています。




## 継承

継承を使うと、あるクラスのプロパティとメソッドを別のクラスが引き継ぐことができます。これによりコードの再利用性が向上します。


```php
class ElectricCar extends Car {
    public $batteryLevel;

    public function charge() {
        $this->batteryLevel = 100;
    }
}

```
この例では、`ElectricCar`クラスが`Car`クラスを継承しており、`Car`クラスのプロパティとメソッドに加えて、`batteryLevel`プロパティと`charge`メソッドを追加しています。




## カプセル化

カプセル化はデータとそのデータを操作するメソッドを一つのクラスにまとめることです。カプセル化により、クラスの内部データを外部から直接変更することを防ぐことができます。


```php
class Car {
    private $color;

    public function setColor($color) {
        $this->color = $color;
    }

    public function getColor() {
        return $this->color;
    }
}

```
この例では、`color`プロパティを`private`に設定し、その値を設定または取得するためには`setColor`メソッドや`getColor`メソッドを経由する必要があります。



## インスタンス化

インスタンス化は、定義されたクラスからオブジェクト（クラスのインスタンス）を生成するプロセスを指します。インスタンス化によって、クラスに定義されたプロパティとメソッドが具体的な値や動作として利用できるようになります。


```php
$myCar = new Car('red');
echo $myCar->getColor();  // red

```

この例では、先ほど定義したCarクラスのインスタンスを生成（インスタンス化）しています。また、そのインスタンスのgetColorメソッドを呼び出して、インスタンスのcolorプロパティの値（'red'）を出力しています。





# あとは実際にアプリを作ってみるのみ！

さて、ここまで長くお付き合いいただきありがとうございました。
ここまでPHPを書くのに必要な基本とか概念とか少し応用とかを学んできましたね。

これらを学んだあなたなら、もう一人でアプリを作ることが可能なはずです。

TODOアプリ、掲示板、ECサイトなど何でも構いません。見よう見真似でもいいんです。
とにかく手を動かして何かを作ってみましょう！

そうすることで、ここの部分の理解がまだまだだったとか、逆にこれはこう言うことだったんだ！と理解深まる瞬間が必ずあります。
わからないことがあればchatGPT先生に聞きましょう！

アプリが完成した時、「理解できた」という自信につながるはずです。







# フレームワークのお話

ここまで生PHPの勉強をしてきました。
なぜわざわざ生のPHPを勉強したのかと言うと、フレームワークに頼らずに、いつもはフレームワークがよしなにやってくれていることも「**きちんと理解する**」ことが大切だと思ったからです。

しかし、実際に現場でフレームワークを使わずに生の状態で書くことはほとんどないでしょう。

なので、生PHPでしっかり基礎が理解できてアプリも作れるようになったのなら、次はフレームワークを使用したアプリ開発を学ぶといいと思います。

フレームワークを学ぶことで、**作業効率の改善やコードの統一性を保持、バグの減少**などの大きなメリットが得られます。

では、どのフレームワークを学べばいいんでしょうか？

少し前までは「CakePHP」というフレームワークがPHPのフレームワークとして一世を風靡していました。
名前の由来は、ケーキを焼く様に簡単にPHPで開発ができるフレームワークを目指して開発されたようです。

しかし、今現在では「Laravel」というフレームワークがもっぱら主流のようです。

GitHubでは、PHPフレームワークの中で最高評価を受けています。Love beautiful code? We do tooという理念を掲げ、PHP初心者でも美しいコードを書けるという点が評価されているためです。

Laravelはわりやすいだけでなく、コードが書きやすく、直ぐに書き始められることなどが魅力です。

 

その他、日本語のドキュメントがあることやサポーターによるライブラリがたくさんあることが特長です。


ということで、今覚えるべきフレームワークを上げるならLaravel一択と言えるかもしれません。

とは言え、フレームワークには流行り廃りがあります。
大事なのはそのフレームワークが使えることではなく、その言語自体の理解を深めて、**どんなフレームワークが流行ったとしてもすぐに使いこなすことができるスキル**を身につけるべきだと私は思います。

その為に今回、PHPの勉強をしたと言うのもありますので、しっかり今後に活かしていきたいですね！




# 終わりに

結構丁寧に解説したこともあってかなり長くなってしまいましたが、ここまで読んでいただき本当にありがとうございました。
アウトプットも兼ねて書いてみたのですが如何だったでしょうか？

Laravelの記事なんかも時間があれば上げていきたいと思います。

初めてバックエンドの勉強をしましたが、いい意味でフロントエンドと概念とか思想とか結構違っていて面白かったですね。

これからもっとバックエンドを勉強していこうと思いました。
エンジニアは最高に楽しいですね！

では、この記事が初学者さんや私と同じ駆け出しエンジニアの方の参考になれれば嬉しいです！

良きエンジニアライフを！！