5月ShowNote
--------------------------
# PHPと型
* 言語仕様での型指定はどのようなものがあるか? → 廣部
* どのバージョンで各型指定ができるようになったか?
* バージョンごとの追加機能まとめ
* [型宣言](https://www.php.net/manual/ja/language.types.declarations.php)
* > 関数のパラメータや戻り値、 クラスのプロパティ (PHP 7.4.0 以降) に対して型を宣言することができます。 これによって、その値が特定の型であることを保証できます。 その型でない場合は、TypeError がスローされます。
* 変更履歴の項目から追加された型が見れる
* [PHP7.0の新機能](https://www.php.net/manual/ja/migration70.new-features.php)
* スカラー型宣言
* 戻り値の型宣言
* その他メモ
* [型システム](https://www.php.net/manual/ja/language.types.type-system.php)
* [型演算子](https://www.php.net/manual/ja/language.operators.type.php)
* ChatGPT
```
PHPの型定義はいつから可能になりましたか
PHPの型定義は、PHPのバージョンによって異なります。
PHP 7以前のバージョンでは、型定義はサポートされていませんでした。関数やメソッドの引数や戻り値に型を指定することはできませんでした。
しかし、PHP 7からは型の宣言が導入され、引数や戻り値の型を指定することができるようになりました。具体的には、以下の型定義が可能です:
int: 整数
float: 浮動小数点数
string: 文字列
bool: 真偽値
array: 配列
callable: コールバック関数
self: クラス自身
ClassName: 特定のクラス
iterable: イテレータ
また、nullableな型指定も可能で、?を使用して指定します。例えば、?intは整数またはnullを表します。
なお、型の厳密さに関しては、PHPは動的型付け言語の一環であり、型の制約が緩やかです。型宣言はあくまでドキュメントや予防的なエラーチェックのためのツールとして利用されることが多いです。
なお、私の知識は2021年9月までのものですので、PHPの最新のバージョンでの変更に関しては確認が必要です。
```
* PHPDoc→浅野
* PHPDocでの型の表現
* PhpStormで検知してくれるかは触れておく
* PhpStorm(2022.3.1)で検知してくれるっぽいもの(下記のPHPDocを書いてみた結果)
* `@deprecated`
* `@internal`
* `@return`
* `@throws`
* `@version`
* `@uses`
* `@since`
* `@links`
* `@see`
* PhpStorm 2021.2で連想配列のキーのコード補完してくれるようになった
* https://www.jetbrains.com/ja-jp/phpstorm/whatsnew/2022-3/#version-2022-3-more-features-for-php:~:text=%E3%83%AA%E3%82%B9%E3%83%88%E3%81%A7%E3%81%AE%20array%20shape%20%E3%81%AE%E7%B9%B0%E3%82%8A%E8%BF%94%E3%81%97%E3%82%92%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88
* 言語仕様で縛るのとの違い(メリット/デメリット)
* メリット
* 静的解析に使える
* コメントだからバグにならない
* リファクタリングでとっつきやすい
* https://speakerdeck.com/rakus_dev/20210707-readablelt-nishihara
* デメリット
* コメントだから間違った内容が書かれている可能性もある
* きちんとメンテしないと逆効果になる
```
/**
* 検知されたもの
* @param string hoge
* @deprecated hoge
* @internal hoge
* @return hoge
* @throws hoge
* @version hoge
* @uses hoge
* @see hoge
*
* 検知されないもの
* @api
* @author hoge
* @category hoge
* @copyright hoge
* @example hoge
* @filesource hoge
* @xglobal hoge
* @license hoge
* @link hoge
* @method hoge
* @package hoge
* @property hoge
* @since hoge
* @source hoge
* @todo hoge
* @example hoge
* @internal hoge
* @inheritdoc hoge
* @link hoge
*/
```
* 既存システムへの型導入→森谷
* 関連する資料さがし
* 柳瀬さん資料
https://speakerdeck.com/penguin045/phpergakorekara-xing-toofu-kihe-isiteikutameni?slide=33
- 既存システムに型宣言を書くのは難しいので、まずはPHPDocから始める
- 動作を制限しないがIDEの支援を受けられる
* https://toku1.jp/programming-php-typedeclarations/
- 作った関数が異なった意図で使われることによるバグを防げる
間違えたままとりあえず動くという状況が減らせる
- 受け取った値のチェックを型宣言に任せられる
is_array()で配列かどうかをチェックしていたが、型を指定することでこの処理を省略できるようになった
* https://news.mynavi.jp/techplus/kikaku/python_learn-11/
pythonがテーマになっていますが、参考になりそうだったので。
- 型があれば中規模以上のシステムや何度も書き直しがされるようなシステムを開発する場合に、実装の負荷を下げられる
- 読みやすくなるので関数の見直しやコードレビューも早く進み、生産性が上がった
- 開発支援ツールを使う場合に支援を得られやすくなった
- まずは戻り値だけ書くなど最小限のところから始めていくのがおすすめ
柳瀬さん資料
https://speakerdeck.com/penguin045/phpergakorekara-xing-toofu-kihe-isiteikutameni
柳瀬さん動画
https://fortee.jp/phperkaigi-2020/proposal/5221a53b-137b-4498-a22e-d7cf537cd0e3
## イベント構成
* 型とは?(PHP関係なく)
* なぜ型が必要なのか?
* コラム:なぜPHPには型宣言が必須でないの?
* PHPで型を縛るための方法
* 言語仕様の型
* mixedも触れる
* PHPDoc
* 静的解析
* PhpStorm
* 既存システムへの型導入(OPT できたら触れる)
* どういうところに型があると嬉しいのか?
* リファクタリングしたらバグった とかならないように
* テストが必要
## 久山メモ
### 基本
* 関数の引数の型
* 関数の戻り値の型
* プロパティの型
* クラス定数の型
* PHP8.3 で導入
* キャスト
### 参考資料
* [php.net: 型](https://www.php.net/manual/ja/language.types.php)
* [php.net: 型宣言](https://www.php.net/manual/ja/language.types.declarations.php)
* [PHPで型宣言してますか?](https://tech-blog.rakus.co.jp/entry/20220323/php)
* [型を使いこなすためのPHPDocの書き方](https://tech-blog.rakus.co.jp/entry/20210326/php)
* [PHPerのための「PHPDoc相談会」PHPTechCafe](https://hackmd.io/oPjJcVmoRGSBtq0wlD4h9w)
* [PHPerのための「PHPDoc相談会」【PHP TechCafe イベントレポート】](https://tech-blog.rakus.co.jp/entry/20230517/PHPDoc)
## 加納メモ
### 静的型付け言語
変数や関数の引数、戻り値などに対して、あらかじめ指定された型以外を使用できなくする言語のこと
「型推論」によって明示的に型を指定しなくても文脈などからコンパイラが予測してくれるものもあるからなんとも言い難い。
### 動的型付け
変数や関数の引数、戻り値の型を実行時の値によって決定することができる言語のこと
ただし、PHPのように型が指定できる動的型付け言語もあるのでなんともアレ。