1. HOME
  2. ブログ
  3. IT技術
  4. 型に詳しくなりたいのでPHPの勉強会に参加してみた

型に詳しくなりたいのでPHPの勉強会に参加してみた

はじめに

こんにちは、たけだです。
今回は、5/30に開催された「PHP TechCafeに参加してきました。
ここでの気づき・学びを書いていきたいと思います。
「PHP TechCafe」は、株式会社ラクス様所属のエンジニアY-KanohさんとMasaKuさんが主催の、PHPに関する様々なトピックを取り上げ語り合うセッション会(月次開催)です。
今回はPHPにおける「型定義」がテーマになっていました。

参加のきっかけ

PHPを扱う案件で型に関して困った経験があり、型への関心と知見を深めたいと思ったのがきっかけです。

PHP TechCafeの流れ

はじめに、PHPに関するいくつかの記事についてみていく時間がありました。
PHPの新バージョン8.3の動向からxdebug(PHPのデバッグツール)の開発者が寄付を募っているという話まで、広くピックアップされていました。

そして本題の「型」へ...。

PHPと型

PHPは動的型付け言語。
動的型付けとは、変数や関数の引数、戻り値の型を実行時の値によって決定することができる言語です。
コードを書く時点で型を指定しなくても、裏側でよしなにやってくれます。
が、PHPも型宣言できるようになっており、バージョンが上がるにつれて関連機能が追加されています。

型システム

PHPにおける型の歴史は以下の通りです。(引用:PHPリファレンス
PHP5から型宣言(当時はタイプヒンティングという呼び名)自体は存在していたが、PHP7から本格的に機能拡張されました。

8.2.0DNF 型のサポートが追加されました。
8.2.0リテラル型 true のサポートが追加されました。
8.2.0null と false 型が、独立した型として使えるようになりました。
8.1.0交差型のサポートが追加されました。
8.1.0戻り値を void とした関数からリファレンスを返すことは、 推奨されなくなりました。
8.1.0戻り値にのみ指定できる型として、 never 型のサポートが追加されました。
8.0.0https://www.php.net/manual/ja/language.types.declarations.php#language.types.declarations.mixed 型のサポートが追加されました。
8.0.0戻り値にのみ指定できる型として、 static 型のサポートが追加されました。
8.0.0union 型のサポートが追加されました。
7.2.0object 型のサポートが追加されました。
7.1.0https://www.php.net/manual/ja/language.types.iterable.php 型のサポートが追加されました。
7.1.0void 型のサポートが追加されました。
7.1.0nullable な型のサポートが追加されました。

また、具体的なPHPの型は以下になります。(引用:PHP:型システム)


基本型 

複合型 

単一の型を組み合わせて、複合型を作ることができます。 PHP では、次のやり方で型を組み合わせることができます:

  • (インターフェイスやクラスの)交差型
  • union 型

交差型 

交差型 は、宣言した複数のクラス型を(単一ではなく) すべて満たす値を受け入れることができます。 交差型を構成する個別の型は、& 記号で結合します。 よって、型 TUV の交差型は T&U&V と書きます。

union 型 

union 型は、ひとつではなく、 複数の異なる型を値として受け入れることができます。 union 型を構成する個別の型は、| 記号で結合します。 よって、型 TUV の union 型は T|U|V と書きます。 型のひとつが交差型の場合、DNF で記すために 括弧で囲む必要があります。 つまり、T|(X&Y) と書く必要があります。

型のエイリアス

  • mixed : object|resource|array|string|float|int|bool|null
  • iterable : Traversable|array
    • Traversableインターフェース

普段の業務では出てこない型もあって勉強になりました。
個人的に以下の型について気になったのでピックアップします。

never型

関数が戻ってこないことを示す戻り値の型。
「終了(exit()など)」、「例外スロー」、「無限ループ」することを示します。
処理が「戻ってこない」ことが重要。

resource型

外部リソースへのリファレンスを保持する型。
fopenやDB接続関連の関数などで使われる型で、普段あまり意識しない型。
resource型は宣言することができません。

これを実行するとエラーになります。

どうもresource型を宣言すると、PHPが用意した組み込みの型ではなく、クラス名として解釈されるようです。

リテラル型

false型とtrue型があり、それぞれ、”false”と”true”のみを格納できる型。
PHPの標準関数はエラー時にfalseを返す慣習があったそう。

mixed型

厳密、object|resource|array|string|float|int|bool|null型のエイリアス。つまり「ほぼなんでも型」であり、逆に言えば「何でもない」やつ。
セッション参加者のコメントで個人的に面白かったのが

phpstan level:9(maxレベル)を経験するとmixedという文字がトラウマになる

というコメントです。
PHPStanは型のチェックをしてるツールです。
この設定レベルを最大にすると、「mixedの中身もちゃんと表現してね」と怒られるので、後から型運用を厳密にした場合などに結構怒られます。
僕もこのパターンで、渡ってきた配列の中身の型が定義してないと怒られました。

全体的に、mixedの話になると盛り上がっていたのでPHPerあるあるな型なのかなと思いました。
また、配列と上手いこと付き合っていくことがPHPと仲良くなる近道の1つなのかなとしみじみ感じました。

PHPDoc

PHPのソースコードに記載するコメントで、様々な情報を記せるが、今回は「型」にフォーカスします。
PHPDocで型を書くメリットは以下が挙げられていました。

  1. 静的解析に使える(PHPStanがここを読み取る)
  2. PHPの動作に影響がない(コメントのため)

言語が持っている型表現とPHPDocの使い分け

この場で出て来たのが、「既存PJに後から導入するなら、PHPDocから始めてみる」という意見でした。
上でも書いたように動作に影響がないが、型について把握できるようになるためです。
必ずしもこうである必要はなく、「同じ型表現をする機能で意識的に区別するなら」という文脈です。
両方使えるなら使った方が良いのかなと思いました。(配列の中身を注釈するためなど)

感想

セッションに参加している方のPHP知識が深く、勉強になるトピックがいくつもありました。
その一方で、話についていける部分や、あるあるネタがわかる部分もあって、自身の成長もすこし実感できたのが嬉しかったです。
また、1人で学習していると盲点になって気づかないことも、他の人のやり取りを通じて気になるワードや知識を得られるので、こういった会はとても有意義だなと感じました。
今後もこういった場に参加して知見を深めていきたいです。

参考

最後に、PHPの型に関する個人的に参考(勉強)になった記事を貼って終わりにします。
ありがとうございました。

  1. PHPの最高機能、配列を捨てよう!! / Throw away all PHP array now!!!
  2. リーダブルなPHPDocを目指して / 20210707-readablelt-nishihara
  3. PHPerがこれから「型」とお付き合いしていくために

書いた人はこんな人

たけちゃん(エンジニア)
たけちゃん(エンジニア)
2022年7月に入社しました。開発未経験で未知の領域だらけですが、楽しく学びつつ、早く戦力になれるようにがんばります!

関連記事

採用情報

\ あの有名サービスに参画!? /

バックエンドエンジニア

\ クリエイティブの最前線 /

フロントエンドエンジニア

\ 世界を変える…! /

Androidエンジニア

\ みんなが使うアプリを創る /

iOSエンジニア