クラスって結局何なのよ＠PHP　～ふわっとイメージ共有～　

## 背景
phpでCRUD処理を書いていると、`->`や`=>`や`::`といった記号が出てくる。調べれば意味は分かるもののを実際に意味を理解して使わないと気持ちが悪い！
のちにフレームワークを使用するとPHPの処理は大概の煩雑な処理は<b>`よしなに`</b>こなしてくれるらしいのですが、使いこなすためにはクラスについて知っておく必要がありそうです。

また、クラスって勉強してみても始めはよくわからない人が多いと思います。
まずはイメージするところから。。

## 簡単なクラスの例(使われ方を中心に考える)
### やってみて理解した->の意味
※厳密な言葉の定義は自信がないです。ちゃんとした説明が見たい方は調べてみましょう。
 ><font color ="blue">**Don't think, feel...**</font> 
 
 でお願いします...まずは自分に都合の良いイメージで理解することから。違ったら正せばよいのです。

それでは、適当な例を出してみます。
#### 1. クラスを呼び出す！【インスタンス生成】
ここにとあるクラス`$Aclass`があるとします。
>```架空のクラスをつくる.php
>//<"schoolCls"というタイプのデータを定義>
>$Aclass = new schoolCls();
>```
これがインスタンスの生成と呼ばれるものです。原則お約束です。
もしクラス内に`public function __construct($val1,$val2,...)`が定義されていた場合はこれに対応して`new schoolCls($value1,$value2,...)`と引数を与えることができます。(下記)
与えた情報をもとにその関数内に書かれた事前の処理が自動的に実行されます。
>```架空のクラスをつくる_データを渡す.php
>$Aclass = new schoolCls(teacher:"fukushima", students:["sato","kato","ito"]);
>```
詳細は割愛しますが、`クラス内の$teacher`という変数に渡った人を「先生」とし、`クラス内の$students`に渡ったリストを「生徒のリスト」として処理する関数が書かれているとします。講義の準備をしたり、メモを書いておいたり、これからAclassをイイ感じ動かすための事前準備を行うわけです。

:::note warn
注意
イメージのため、詳細な処理は記載せずふわっと書いてます。ごめんね！

:::

#### 2. クラス内の情報を取得する！【プロパティ】
またクラス内の`$students`という変数が<font color ="blue">**public**</font>なものとして定義されているとき、クラスの外ではつぎのような書き方で参照することができる。

>```生徒の名簿を取得_1.php
>//<クラス->プロパティ名で取得>
>$student_list= $Aclass -> students;
>//$student_list = ["sato","kato","ito"]が取得できる。
>```
はい、出ました **`->`** です。**"～の"** みたいなイメージで行きましょう。情報のアクセスの順番のイメージでもいいかもです。イメージなので、腹落ちしやすいものでいいかと思います。
>My name is "sato"が　I -> name = "sato"　になる
>**ね？簡単でしょう？**

js, pythonなどをやっている人たちは **`.`** と一緒だと思えばよいです。(だよね？)
`「なんで"."じゃねぇんだよ…」`とは言わない。誰か背景知っていたら教えてください…

:::note warn
注意
使い慣れないうちは **`=>`** と間違えることがよくあります。
こっちは連想配列のキーと値を関連付ける記号です。
{"key1" => value1, "key2" => value2, ...}
:::

#### 3. クラスでいろいろする！【メソッド】
実はこのクラスには`newcomer($name)`という好きな生徒を転入させる処理(関数=メソッド)が含まれているんです。
>```突然の転校生.php
>//<クラス->メソッド(引数)で実行>
>$Aclass -> newcomer("aoi_miyazaki");
>```
>  **↓**
>```.機械語
>Aclassのnewcomer関数を実行します！喜べ男子！転入生は宮崎あおいだぁぁあ！！
>```

冷静に先ほどクラス内の名簿を再度取得してみましょう。
>```生徒の名簿を取得_2.php
>//<クラス->プロパティ名で取得>
>$student_list= $Aclass -> students;
>//$student_list = ["sato","kato","ito","aoi_miyazaki"]が取得できる。
>```
おわかりいただけただろうか？<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562770/f1007e2a-f474-818d-61b1-8a4cd7ff3d3b.png)


冗談はさておき、内部的には
`引数として与えられた文字列を$studentsリストに追加する。`
という処理が行われたことになります。

次のようなことも考えられるでしょう。さぁクラスでありそうなこと想像して…

>```クラス吸収合併.php
>//2つのクラスがある
>$Aclass = new class(teacher:"fukushima", students:["sato","kato","ito","aoi_miyazaki"]);
>$Bclass = new class(teacher:"yaga", students:["geto","gojo"]);
>//人数が少ないのでclassAに統合
>$Bclass -> mergeTo($Aclass);
>
>$Aclass -> students;
>// = ["sato","kato","ito","aoi_miyazaki","riho_yoshioka","satoru_gojo"]
>$Bclass -> students;
>// = []
>//クラスの名簿がA側に統合された。
> ```
こんな形でクラスを合体させることだってできるでしょう。(なさそう)


どうでしょうか？もはやどっちのクラスの話をしているのかわからなくなってきていませんか？

私もです。

## 考え方

私が現時点で理解しているClassとは…。
- データのタイプのようなもの
- 特有のプロパティ・メソッドを持ち、クラスの情報を使っていい感じのことができる。
- どういう単位をクラスとするかはやりたい処理による。そういう都合の良い塊

 本稿では学校内のクラスという集団をクラスとて扱いましたが、これはあくまで学校のクラスを中心に、生徒が出入りしたり、転校、進級、テスト、卒業といったイベントを起こして、クラスに与えた情報を使いながらデータの状態を変えながらいろいろな処理したいという目的があるからです。
このように、どういった単位でデータを扱った方が便利かによってクラスの定義は異なってくるでしょう。それをうまく考えるのがエンジニアの仕事です。
> **え…むずくね…？**

大丈夫です。たいていの場合は「使う側」がメインになるはず。
世に出回る優秀なフレームワークなどでクラスを見たときには、
「これを軸にいろんな処理ができるイケてる塊なんだな」と考えることができます。
そのため、プロパティ、メソッドはおのずとクラスに関連したものになるはずだと想像できます。
クラスの名前から連想できるものは多いかと思います。

例えば。`Auth`というクラスがあったとします。認証っぽい名前だ…
- プロパティ：対象ユーザー/認証のタイプ/DBのテーブル名　etc
- メソッド：ユーザー情報受け取る/パスワードをハッシュ化する/DBに照会をかける etc

そういうものがあるんだろうなぁ。と考えます。
**`-> `** はそのクラスの持っているプロパティやメソッドの呼び出しを行っているだけだと思うと少し気楽に読み取れるようになりますよ。
ちなみにずっとスルーしている **`::`** は`new~`でインスタンス生成を行わなくて使用できる静的(static)なプロパティやメソッドが定義されているときにそれらを呼び出すための記号です。意味自体は **`-> `** と同じと考えます。

実際にどんなプロパティや、メソッドがあるのかはドキュメントを読みましょう。今なら多少読めるはず！！！


## 以上
ということで私が現状勉強した結果理解しているクラスに関するとらえ方のふわっと紹介しました。
まずはふわっとでいいんだよ…と自分に言い聞かせながら手を動かしましょう。

---
# Appendix
実際にCRUD処理をクラスでまとめ実装した例を紹介します。
- インスタンス生成時にDBに接続
- プロパティでSQL文を送るテーブルの指定や、ORDER BY 等のオプションを追加できる
- CRUD処理をメソッド実行(変数のbindはメソッド内で行う)
- シンプルにSQL文の実行ができるため見やすい(機能は絞っている)

```使用例.php
//DBにアクセス
$sql = new sqlDB_cls("test_DB");
//参照するテーブルの切り替え
$sql->set_prop('table','user');  
//$sql -> table = 'user'と同じことをやってます。
//メソッドの練習で作成したので、特に意図はないです。

<SELECT相当> id ==1のユーザー情報を取得
user_info = $sql ->get("*",{"id"=>1});

<UPDATE相当>
//更新内容の連想配列を作成
$change_obj = {"nickname"=>"name_2","pass"=>"pwd_2"};
//id=1となるユーザー情報を、$change_objに従い更新
$sql->upd("id",1,$change_obj);

<DELETE相当>
//上記ユーザー情報を削除
$sql->del("id",1);

<INSERT相当>
//パスワードのハッシュ化
$hashed_pw = password_hash($_SESSION[pass], PASSWORD_DEFAULT);
//登録内容の連想配列を作成
$userform_obj = {"nickname"=>$_SESSION["nickname"],"pass"=>$hashed_pw};
//$userform_objに"user"テーブルに新規追加
$sql->del($userform_obj);

```
:::note info
[肝心のクラスの中身はこちら(Github)](https://github.com/udonDaisuke/kadai07_php_2_1222/blob/main/dsSqlSimple.php)

:::

余裕があったらそのうち解説書きます。