Upgrade to Pro — share decks privately, control downloads, hide ads and more …

phpconJapan2023 わたし、Composerが気になります!

kero kero
October 08, 2023
450

phpconJapan2023 わたし、Composerが気になります!

kero kero

October 08, 2023
Tweet

Transcript

  1. わたし、     


    2023/10/8


    (株)インフィニットループ 

    サーバーサイドエンジニア 
    kerokero

    が気になります

    View full-size slide

  2. 今回の発表の対象者

    ・ Composerが気になる人


    View full-size slide

  3. 今回の発表の対象者

    ・ Composerが気になる人

    ・ pharアーカイブってなんだよという人


    View full-size slide

  4. 今回の発表の対象者

    ・ Composerが気になる人

    ・ pharアーカイブってなんだよという人

    ・ autoloadってなんだよという人


    View full-size slide

  5. 今回の発表の対象者

    ・ Composerが気になる人

    ・ pharアーカイブってなんだよという人

    ・ autoloadってなんだよという人

    ・ PHP初心者の人 ← HOT‼

    < 4つです


    View full-size slide

  6. Agenda

    1. 軽い自己紹介


    2. Composerってなによ


    3. パッケージ管理ツールとしてのComposer


    4. pharについて


    5. オートロードについて


    6. 反省点・良かった点・感想


    View full-size slide

  7. Agenda

    1. 軽い自己紹介          


    2. Composerってなによ


    3. パッケージ管理ツールとしてのComposer


    4. pharについて


    5. オートロードについて


    6. 反省点・良かった点・感想


    View full-size slide

  8. どうも、kerokero です。


    View full-size slide

  9. 22卒 自称青魔道士系エンジニア 

    (株)インフィニットループ 

    kerokero
    ・北海道の 札幌 生まれ、札幌 育ち

    ・水産→数学(非情報系)→2022年4月にIL入社  
    ・最近の趣味は 絵を描く ことと ストリートファイター6 です

    ・担当領域は サーバーサイドのアプリ・インフラ実装(PHP, AWSなど) です 


    View full-size slide

  10. とは?


    View full-size slide

  11. ソースコードでなんでも生み出す。

    最先端の最後尾を独走する


    View full-size slide

  12. Agenda

    1. 軽い自己紹介          


    2. Composerってなによ       


    3. パッケージ管理ツールとしてのComposer


    4. pharについて


    5. オートロードについて


    6. 反省点・良かった点・感想


    View full-size slide

  13. ある日のこと……


    View full-size slide

  14. ある日のこと……

    Composer って何なのですか?


    View full-size slide

  15. ある日のこと……

    Composer って何なのですか?

    お願いです、kerokeroさん。

    教えてください、気になるんです!

    <

    あいえるたそ


    View full-size slide

  16. < (少し調べたのち……) 


    View full-size slide

  17. < PHPのパッケージ依存管理ツールだよ!


    View full-size slide

  18. >

    パッケージってなんですか?

    依存ってなんですか? 

    管理ツールってなんですか?

    < PHPのパッケージ依存管理ツールだよ!

    あいえるたそ


    View full-size slide

  19. < PHPのパッケージ依存管理ツールだよ!

    パッケージってなんですか?

    依存ってなんですか? 

    管理ツールってなんですか?

    >

    kerokeroさん。誤魔化さないでください。

    気になります、気になります、気になるんです!
    あいえるたそ


    View full-size slide

  20. 一度こうなるともう駄目だ。


    View full-size slide

  21. 一度こうなるともう駄目だ。


    疑問が解消し納得するまでしつこく繰り返し、絶対に諦めない。この一
    言をきっかけに物語が動くんだ。


    View full-size slide

  22. 一度こうなるともう駄目だ。


    疑問が解消し納得するまでしつこく繰り返し、絶対に諦めない。この一
    言をきっかけに物語が動くんだ。


    その度に俺ことkerokeroは巻き込まれ、俺があいつを納得させるまで付
    き合わされる事になる。


    View full-size slide

  23. 一度こうなるともう駄目だ。


    疑問が解消し納得するまでしつこく繰り返し、絶対に諦めない。この一
    言をきっかけに物語が動くんだ。


    その度に俺ことkerokeroは巻き込まれ、俺があいつを納得させるまで付
    き合わされる事になる。


    つまり、俺の省エネ主義を粉砕する原因であり、俺にとっては聞きたくな
    い言葉な訳だ。
    ニコニコ大百科(仮) 「わたし、気になります」 より 一部改変


    View full-size slide

  24. 一度こうなるともう駄目だ。


    疑問が解消し納得するまでしつこく繰り返し、絶対に諦めない。この一
    言をきっかけに物語が動くんだ。


    その度に俺ことkerokeroは巻き込まれ、俺があいつを納得させるまで付
    き合わされる事になる。


    つまり、俺の省エネ主義を粉砕する原因であり、俺にとっては聞きたくな
    い言葉な訳だ。
    (やばい、うまく説明できない......) ← Now‼

    ニコニコ大百科(仮) 「わたし、気になります」 より 一部改変


    View full-size slide

  25. というわけで、


    View full-size slide

  26. というわけで、

    Composerについて整理してみました


    View full-size slide

  27. というわけで、

    Composerについて整理してみました

    (いよいよcomposerの説明に入ります)

    View full-size slide

  28. Agenda

    1. 軽い自己紹介          


    2. Composerってなによ       


    3. パッケージ管理ツールとしてのComposer 


    4. pharについて


    5. オートロードについて


    6. 反省点・良かった点・感想


    View full-size slide


  29. 気になります!
 >

    あいえるたそ


    View full-size slide


  30. パッケージってなんですか?

    依存ってなんですか? 

    管理ツールってなんですか?

    >

    あいえるたそ


    View full-size slide

  31. ・パッケージって何ですか?

    ・そもそも、PHPとは何なのか?


    View full-size slide

  32. ・パッケージって何ですか?

    ・そもそも、PHPとは何なのか?


      ・オープンソースの汎用プログラミング言語 PHP


      ・公式の処理系である php-src


    View full-size slide

  33. ・パッケージって何ですか?

    ・そもそも、PHPとは何なのか?


      ・オープンソースの汎用プログラミング言語 PHP


      ・公式の処理系である php-src


    ・これらは特に区別されることなく PHP と呼ばれる


    View full-size slide

  34. ・パッケージって何ですか?

    ・公式の処理系である php-src に機能が詰まってると考えてよさ
    そう


      ・変数や定数、関数、for文やif文など


    View full-size slide

  35. ・パッケージって何ですか?

    ・公式の処理系である php-src に機能が詰まってると考えてよさ
    そう


      ・変数や定数、関数、for文やif文など



    ・php-src にない機能も使いたい


      ・ユニットテストや静的解析、便利なフレームワークなど


    View full-size slide

  36. ・パッケージって何ですか?

    ・公式の処理系である php-src に機能が詰まってると考えてよさ
    そう


      ・変数や定数、関数、for文やif文など



    ・php-src にない機能も使いたい


      ・ユニットテストや静的解析、便利なフレームワークなど

    ↑ これがパッケージということ

    View full-size slide

  37. ・パッケージって何ですか?

    ≡

    ・モジュール は関数、変数などのコードの基本単位


    ・パッケージ はモジュールの集合体


    ・ライブラリ はモジュール、パッケージの集合体


    View full-size slide

  38. ・パッケージって何ですか?

    ≡

    ・モジュール は関数、変数などのコードの基本単位


    ・パッケージ はモジュールの集合体


    ・ライブラリ はモジュール、パッケージの集合体

    ライブラリ 

    パッケージ A
 パッケージ B
 モジュール

    ← 大まかなイメージ
    ※言語や人によって流儀が違う可能性がある

    View full-size slide

  39. ・パッケージって何ですか?

    ・なので、composer が管理している パッケージ というのは、広義の意味ではモジュール・
    パッケージ・ライブラリのどれかであると考えてよさそう



    View full-size slide

  40. ・パッケージって何ですか?

    ・なので、composer が管理している パッケージ というのは、広義の意味ではモジュール・
    パッケージ・ライブラリのどれかであると考えてよさそう


    ・composer が管理している パッケージ は php-src の外部から仕入れてくるものと考え
    てよさそう


      ・phpunit や guzzle , Laravel など


    View full-size slide

  41. ・パッケージって何ですか?

    ・なので、composer が管理している パッケージ というのは、広義の意味ではモジュール・
    パッケージ・ライブラリのどれかであると考えてよさそう


    ・composer が管理している パッケージ は php-src の外部から仕入れてくるものと考え
    てよさそう


      ・phpunit や guzzle , Laravel など


    ・ざっくりと パッケージは 外部からインストール するものと考えてよさそう



    View full-size slide

  42. ・パッケージって何ですか?

    ・なので、composer が管理している パッケージ というのは、広義の意味ではモジュール・
    パッケージ・ライブラリのどれかであると考えてよさそう


    ・composer が管理している パッケージ は php-src の外部から仕入れてくるものと考え
    てよさそう


      ・phpunit や guzzle , Laravel など


    ・ざっくりと パッケージは 外部からインストール するものと考えてよさそう


           ↑ よっしゃー、とりあえず phpunit をインストールしてみるぜ  >

    猫


    View full-size slide

  43. ・パッケージって何ですか?

    ・PHPUnit


    View full-size slide

  44. ・パッケージって何ですか?

    ・PHPUnit

    PHPUnit に必要なすべての 依存ファイル をひとつのファイル
    にまとめた PHP アーカイブ (PHAR) を配布します



    あるいは、Composer を使って PHPUnit やその 依存ファイ
    ル をダウンロードしてインストールすることもできます。


    View full-size slide

  45. ・パッケージって何ですか?

    ・PHPUnit

    PHPUnit に必要なすべての 依存ファイル をひとつのファイル
    にまとめた PHP アーカイブ (PHAR) を配布します



    あるいは、Composer を使って PHPUnit やその 依存ファイ
    ル をダウンロードしてインストールすることもできます。

    依存ファイル

    View full-size slide


  46. パッケージってなんですか?

    依存ってなんですか? 

    管理ツールってなんですか?

    >

    あいえるたそ


    View full-size slide

  47. ・依存って何ですか?

    ・一旦、依存については置いておこう

    これマジ? >

    View full-size slide

  48. ・依存って何ですか?

    ・一旦、依存については置いておこう


    ・composer 自体の振る舞いをある程度知ってからの方が、ファイルの依
    存関係について理解しやすい




    なるほど  >

    View full-size slide

  49. ・依存って何ですか?

    ・一旦、依存については置いておこう


    ・composer 自体の振る舞いをある程度知ってからの方が、ファイルの依
    存関係について理解しやすい




    わからん  >
    ↑ composer 自体の振る舞いって何?


    View full-size slide

  50. ・依存って何ですか?

    ・PHPUnit

    PHPUnit に必要なすべての 依存ファイル をひとつのファイル
    にまとめた PHP アーカイブ (PHAR) を配布します



    あるいは、Composer を使って PHPUnit やその 依存ファイ
    ル をダウンロードしてインストールすることもできます。

    ちょっとスライドを戻って…… 

    ↑↑ こっちの話


    View full-size slide

  51. ・依存って何ですか?

    ・ひとまず前提知識として


      ・composer 自身も1つの パッケージ であることは分かる


        ・php-src に含まれている機能ではないということ


    View full-size slide

  52. ・依存って何ですか?

    ・ひとまず前提知識として


      ・composer 自身も1つの パッケージ であることは分かる


        ・php-src に含まれている機能ではないということ


      ・composer をインストールしてくる必要がある

        

        ・とりあえずdockerコンテナでcomposer環境を試す


    View full-size slide

  53. ・依存って何ですか?

    ・ひとまず前提知識として


      ・composer 自身も1つの パッケージ であることは分かる


        ・php-src に含まれている機能ではないということ


      ・composer をインストールしてくる必要がある

        

        ・とりあえずdockerコンテナでcomposer環境を試す

    頭の中に思い浮かべてみよう >

    View full-size slide

  54. ・依存って何ですか?

    .
    ├ Dockerfile
    ├ docker-compose.yml
    └ composer.json # New!
    ・composer を実行できる環境を用意

    tree


    View full-size slide

  55. ・依存って何ですか?

    ・composer を実行できる環境を用意

    .
    ├ Dockerfile
    ├ docker-compose.yml
    └ composer.json # New!
    {
    "require-dev": {
    "phpunit/phpunit": "*"
    }
    }
    ・phpunit について書かれている......?

    tree

    composer.json


    View full-size slide

  56. ・依存って何ですか?

    ・composer を実行できる環境を用意

    .
    ├ Dockerfile
    ├ docker-compose.yml
    └ composer.json # New!
    {
    "require-dev": {
    "phpunit/phpunit": "*"
    }
    }
    ・phpunit について書かれている......?

    tree

    composer.json

    ・この composer.json というものは、Composer がインストールしてくる対象を決定している「何
    らかの定義」が書かれているファイルとして存在しています


    View full-size slide

  57. ・依存って何ですか?

    ・composer を実行できる環境を用意

    .
    ├ Dockerfile
    ├ docker-compose.yml
    └ composer.json # New!
    {
    "require-dev": {
    "phpunit/phpunit": "*"
    }
    }
    ・phpunit について書かれている......?

    tree

    composer.json

    ・この composer.json というものは、Composer がインストールしてくる対象を決定している「何
    らかの定義」が書かれているファイルとして存在しています



    ・ここに欲しいパッケージとそのバージョンを指定してあげるとよさそう


    View full-size slide

  58. ・依存って何ですか?

    ・composer を実行できる環境を用意

    .
    ├ Dockerfile
    ├ docker-compose.yml
    └ composer.json # New!
    {
    "require-dev": {
    "phpunit/phpunit": "*"
    }
    }
    ・phpunit について書かれている......?

    tree

    composer.json

    ・この composer.json というものは、Composer がインストールしてくる対象を決定している「何
    らかの定義」が書かれているファイルとして存在しています



    ・ここに欲しいパッケージとそのバージョンを指定してあげるとよさそう



    ・jsonの中身は、インストールするパッケージ : バージョン という書式

    "phpunit/phpunit": "*"

    View full-size slide

  59. ・依存って何ですか?

    .
    ├ Dockerfile
    ├ docker-compose.yml
    └ composer.json # New!
    ・composer を実行できる環境を用意

    tree

    ・インストール対象を指定できたので、この状態でインストールを実行するとパッケー
    ジを取得できそうな気がしますよね?


    View full-size slide

  60. ・依存って何ですか?

    .
    ├ Dockerfile
    ├ docker-compose.yml
    └ composer.json # New!
    ・composer を実行できる環境を用意

    tree

    ・インストール対象を指定できたので、この状態でインストールを実行するとパッケー
    ジを取得できそうな気がしますよね?



    ・というわけで、この状態でdockerコンテナの中で composer install を実行


    View full-size slide

  61. ・依存って何ですか?

    .
    ├ Dockerfile
    ├ docker-compose.yml
    ├ composer.json
    ├ composer.lock # New!
    └ vendor # New!
    ├ bin
    ├ composer
    ├ myclabs
    ├ nikic
    ├ phar-io
    ├ phpunit
    ├ sebastian
    └ theseer
    ・すると、左記のような構成に変化します 


    View full-size slide

  62. ・依存って何ですか?

    .
    ├ Dockerfile
    ├ docker-compose.yml
    ├ composer.json
    ├ composer.lock # New!
    └ vendor # New!
    ├ bin
    ├ composer
    ├ myclabs
    ├ nikic
    ├ phar-io
    ├ phpunit
    ├ sebastian
    └ theseer
    ・すると、左記のような構成に変化します 


    ・composer install によって次の2つが増えた 


      ・composer.lock


      ・vendor ディレクトリ 


    View full-size slide

  63. ・依存って何ですか?

    .
    ├ Dockerfile
    ├ docker-compose.yml
    ├ composer.json
    ├ composer.lock # New!
    └ vendor # New!
    ├ bin
    ├ composer
    ├ myclabs
    ├ nikic
    ├ phar-io
    ├ phpunit
    ├ sebastian
    └ theseer
    ・すると、左記のような構成に変化します。 


    ・composer install によって次の2つが増えた 


      ・composer.lock


      ・vendor ディレクトリ 


    ・vendor の中に phpunit がある‼

    これ


    View full-size slide

  64. ・依存って何ですか?

    .
    ├ Dockerfile
    ├ docker-compose.yml
    ├ composer.json
    ├ composer.lock # New!
    └ vendor # New!
    ├ bin
    ├ composer 
    ├ myclabs <- ?
    ├ nikic <- ?
    ├ phar-io <- ?
    ├ phpunit
    ├ sebastian <- ?
    └ theseer <- ?
    ・すると、左記のような構成に変化します。 


    ・composer install によって次の2つが増えた 


      ・composer.lock


      ・vendor ディレクトリ 


    ・vendor の中に phpunit がある‼


    ・とはいえ、他にもなんか色々ある

    これ


    View full-size slide

  65. ・依存って何ですか?

    └ vendor
    └ phpunit
    ├ php-code-coverage
    ├ php-file-iterator
    ├ php-invoker
    ├ php-text-template
    ├ php-timer
    └ phpunit  
    ・vendor/phpunit を見てみると…… 


    View full-size slide

  66. ・依存って何ですか?

    └ vendor
    └ phpunit
    ├ php-code-coverage
    ├ php-file-iterator
    ├ php-invoker
    ├ php-text-template
    ├ php-timer
    └ phpunit  
    ・vendor/phpunit を見てみると…… 


    ・さらに phpunit があった

    これ


    View full-size slide

  67. ・依存って何ですか?

    └ vendor
    └ phpunit
    └ phpunit
    ├ schema
    ├ src
    ├ .phpstorm.meta.php
    ├ ChangeLog-10.1.md
    ├ composer.json
    ├ LICENCE
    ├ phpunit
    ├ phpunit.xsd
    ├ README.md
    └ SECURITY.md
    ・vendor/phpunit を見てみると…… 


    ・さらに phpunit があった


    ・というわけで中を見てみると……


    View full-size slide

  68. ・依存って何ですか?

    └ vendor
    └ phpunit
    └ phpunit
    ├ schema
    ├ src
    ├ .phpstorm.meta.php
    ├ ChangeLog-10.1.md
    ├ composer.json
    ├ LICENCE
    ├ phpunit
    ├ phpunit.xsd
    ├ README.md
    └ SECURITY.md
    ・vendor/phpunit を見てみると…… 


    ・さらに phpunit があった


    ・というわけで中を見てみると……


    ・ここにも composer.json があった

    これ


    View full-size slide

  69. ・依存って何ですか?

    "require": {
    "php": ">=8.1",
    "ext-dom": "*",
    "ext-json": "*",
    "ext-libxml": "*",
    "ext-mbstring": "*",
    "ext-xml": "*",
    "ext-xmlwriter": "*",
    "myclabs/deep-copy": "^1.10.1",
    "phar-io/manifest": "^2.0.3",
    "phar-io/version": "^3.0.2",
    "phpunit/php-code-coverage": "^10.1.1",
    "phpunit/php-file-iterator": "^4.0",
    "phpunit/php-invoker": "^4.0",
    "phpunit/php-text-template": "^3.0",
    "phpunit/php-timer": "^6.0",
    "sebastian/cli-parser": "^2.0",
    "sebastian/code-unit": "^2.0",
    "sebastian/comparator": "^5.0",
    "sebastian/diff": "^5.0",
    "sebastian/environment": "^6.0",
    "sebastian/exporter": "^5.0",
    "sebastian/global-state": "^6.0",
    "sebastian/object-enumerator": "^5.0",
    "sebastian/recursion-context": "^5.0",
    "sebastian/type": "^4.0",
    "sebastian/version": "^4.0"
    },
    ・vendor/phpunit/phpunit/composer.json


    View full-size slide

  70. ・依存って何ですか?

    "require": {
    "php": ">=8.1",
    "ext-dom": "*",
    "ext-json": "*",
    "ext-libxml": "*",
    "ext-mbstring": "*",
    "ext-xml": "*",
    "ext-xmlwriter": "*",
    "myclabs/deep-copy": "^1.10.1",
    "phar-io/manifest": "^2.0.3",
    "phar-io/version": "^3.0.2",
    "phpunit/php-code-coverage": "^10.1.1",
    "phpunit/php-file-iterator": "^4.0",
    "phpunit/php-invoker": "^4.0",
    "phpunit/php-text-template": "^3.0",
    "phpunit/php-timer": "^6.0",
    "sebastian/cli-parser": "^2.0",
    "sebastian/code-unit": "^2.0",
    "sebastian/comparator": "^5.0",
    "sebastian/diff": "^5.0",
    "sebastian/environment": "^6.0",
    "sebastian/exporter": "^5.0",
    "sebastian/global-state": "^6.0",
    "sebastian/object-enumerator": "^5.0",
    "sebastian/recursion-context": "^5.0",
    "sebastian/type": "^4.0",
    "sebastian/version": "^4.0"
    },
    ・vendor/phpunit/phpunit/composer.json


    ・myclubs, phar-io, sebastian がある


      ・これらは vendor に入ってた


    View full-size slide

  71. ・依存って何ですか?

    "require": {
    "php": ">=8.1",
    "ext-dom": "*",
    "ext-json": "*",
    "ext-libxml": "*",
    "ext-mbstring": "*",
    "ext-xml": "*",
    "ext-xmlwriter": "*",
    "myclabs/deep-copy": "^1.10.1",
    "phar-io/manifest": "^2.0.3",
    "phar-io/version": "^3.0.2",
    "phpunit/php-code-coverage": "^10.1.1",
    "phpunit/php-file-iterator": "^4.0",
    "phpunit/php-invoker": "^4.0",
    "phpunit/php-text-template": "^3.0",
    "phpunit/php-timer": "^6.0",
    "sebastian/cli-parser": "^2.0",
    "sebastian/code-unit": "^2.0",
    "sebastian/comparator": "^5.0",
    "sebastian/diff": "^5.0",
    "sebastian/environment": "^6.0",
    "sebastian/exporter": "^5.0",
    "sebastian/global-state": "^6.0",
    "sebastian/object-enumerator": "^5.0",
    "sebastian/recursion-context": "^5.0",
    "sebastian/type": "^4.0",
    "sebastian/version": "^4.0"
    },
    ・vendor/phpunit/phpunit/composer.json


    ・myclubs, phar-io, sebastian がある


      ・これらは vendor に入ってた


    ・確かに入ってる……


    View full-size slide

  72. ・依存って何ですか?

    ここまでの流れを整理すると


    View full-size slide

  73. ・依存って何ですか?

    ここまでの流れを整理すると


    ・composer を実行できる環境を用意した



    View full-size slide

  74. ・依存って何ですか?

    ここまでの流れを整理すると


    ・composer を実行できる環境を用意した


    ・composer.json にインストールするものを定義 (phpunit)

    View full-size slide

  75. ・依存って何ですか?

    ここまでの流れを整理すると


    ・composer を実行できる環境を用意した


    ・composer.json にインストールするものを定義 (phpunit)


    ・composer install すると、composer.lock と vendor ディレクトリができた



    View full-size slide

  76. ・依存って何ですか?

    ここまでの流れを整理すると


    ・composer を実行できる環境を用意した


    ・composer.json にインストールするものを定義 (phpunit)


    ・composer install すると、composer.lock と vendor ディレクトリができた


    ・vendor の中には phpunit を含むいくつかのパッケージが入ってた



    View full-size slide

  77. ・依存って何ですか?

    ここまでの流れを整理すると


    ・composer を実行できる環境を用意した


    ・composer.json にインストールするものを定義 (phpunit)


    ・composer install すると、composer.lock と vendor ディレクトリができた


    ・vendor の中には phpunit を含むいくつかのパッケージが入ってた


    ・phpunit の中には更に別の composer.json が入ってた



    View full-size slide

  78. ・依存って何ですか?

    ここまでの流れを整理すると


    ・composer を実行できる環境を用意した


    ・composer.json にインストールするものを定義 (phpunit)


    ・composer install すると、composer.lock と vendor ディレクトリができた


    ・vendor の中には phpunit を含むいくつかのパッケージが入ってた


    ・phpunit の中には更に別の composer.json が入ってた


    ・その中には vendor に入ってた phpunit 以外のパッケージが指定されていた


      ・myclubs, phar-io, sebastian があった


    View full-size slide

  79. ・依存って何ですか?

    ここまでの流れを整理すると


    ・composer を実行できる環境を用意した


    ・composer.json にインストールするものを定義 (phpunit)


    ・composer install すると、composer.lock と vendor ディレクトリができた


    ・vendor の中には phpunit を含むいくつかのパッケージが入ってた


    ・phpunit の中には更に別の composer.json が入ってた


    ・その中には vendor に入ってた phpunit 以外のパッケージが指定されていた


      ・myclubs, phar-io, sebastian があった


    ここに注目 >

    View full-size slide

  80. ・依存って何ですか?

    つまり、


     composer.json で指定したパッケージの中で、


     別の composer.json が更に他のパッケージを指定していた


    ということ


    View full-size slide

  81. ・依存って何ですか?

    つまり、


     composer.json で指定したパッケージの中で、


     別の composer.json が更に他のパッケージを指定していた


    ということ

    phpunit を使うためには、 myclubs, phar-io, sebastian が必要で、これらを使うためには……  >
    → composer install を実行すると、composer.json で定義されたパッケー
    ジが再帰的にインストールされていくということ

    View full-size slide

  82. ・依存って何ですか?

    すごく雑に説明すると……


    View full-size slide

  83. ・依存って何ですか?

    すごく雑に説明すると……


    ・composer.json に A を追加



    View full-size slide

  84. ・依存って何ですか?

    すごく雑に説明すると……


    ・composer.json に A を追加


            ↓


    ・A の中の composer.json には B がある

    View full-size slide

  85. ・依存って何ですか?

    すごく雑に説明すると……


    ・composer.json に A を追加


            ↓


    ・A の中の composer.json には B がある


            ↓


    ・B の中の composer.json には C がある

    View full-size slide

  86. ・依存って何ですか?

    すごく雑に説明すると……


    ・composer.json に A を追加


            ↓


    ・A の中の composer.json には B がある


            ↓


    ・B の中の composer.json には C がある  →  vendor に C を追加 

    View full-size slide

  87. ・依存って何ですか?

    すごく雑に説明すると……


    ・composer.json に A を追加 


            ↓ 


    ・A の中の composer.json には B がある     vendor に B を追加


            ↓                   ↑


    ・B の中の composer.json には C がある  →  vendor に C を追加 

    View full-size slide

  88. ・依存って何ですか?

    すごく雑に説明すると……


    ・composer.json に A を追加 vendor に A を追加


            ↓ ↑


    ・A の中の composer.json には B がある     vendor に B を追加


            ↓                   ↑


    ・B の中の composer.json には C がある  →  vendor に C を追加 

    View full-size slide

  89. ・依存って何ですか?

    すごく雑に説明すると…… vendor の中に A, B, C が用意される!


    ・composer.json に A を追加 vendor に A を追加


            ↓ ↑


    ・A の中の composer.json には B がある     vendor に B を追加


            ↓                   ↑


    ・B の中の composer.json には C がある  →  vendor に C を追加 

    だいたいこんなイメージ >

    View full-size slide

  90. ・依存って何ですか?

    ここで、冒頭の依存とは何かという話に戻ると……


    View full-size slide

  91. ・依存って何ですか?

    ここで、冒頭の依存とは何かという話に戻ると……


    ・Aを使うにはBが必要で、Bを使うにはCが必要な時


      ・A ← B ← C という依存関係が存在する


    View full-size slide

  92. ・依存って何ですか?

    ここで、冒頭の依存とは何かという話に戻ると……


    ・Aを使うにはBが必要で、Bを使うにはCが必要な時


      ・A ← B ← C という依存関係が存在する


    ・Aを composer.json で指定するだけで、↑の依存関係を自動で解決しつつインストールし
    てくれるのが composer ということ


    View full-size slide

  93. ・依存って何ですか?

    ここで、冒頭の依存とは何かという話に戻ると……


    ・Aを使うにはBが必要で、Bを使うにはCが必要な時


      ・A ← B ← C という依存関係が存在する


    ・Aを composer.json で指定するだけで、↑の依存関係を自動で解決しつつインストールし
    てくれるのが composer ということ

    でもさぁ、

    composer 使えるように設定する方が面倒くさくない?


    View full-size slide

  94. ・依存って何ですか?

    ここで、冒頭の依存とは何かという話に戻ると……


    ・Aを使うにはBが必要で、Bを使うにはCが必要な時


      ・A ← B ← C という依存関係が存在する


    ・Aを composer.json で指定するだけで、↑の依存関係を自動で解決しつつインストールし
    てくれるのが composer ということ

    でもさぁ、

    composer 使えるように設定する方が面倒くさくない?

    ↑  別の例を考えてみよう

    View full-size slide

  95. ・依存って何ですか?

    ・AがBとEに依存する


    ・BはCとFに依存する


    ・CはDとEとGに依存する


    ・DはFとHに依存する


    ・Eは特に他のパッケージに依存しない


    ・FはIに依存する


    ・JはEに依存する

    指差確認しつつ、順番に入れていけばヨシッ!  >

    View full-size slide

  96. ・依存って何ですか?

    ・AがBとEに依存する


    ・BはCとFに依存する


    ・CはDとEとGに依存する


    ・DはFとHに依存する


    ・Eは特に他のパッケージに依存しない


    ・FはIに依存する


    ・JはEに依存する

    ・それぞれのパッケージは 指定されたバージョン の範囲で定
    義されている
    ・依存するパッケージが 該当のバージョンで動く かどうかは要
    別途確認
    ・なるべく新しいかつ安定しているバージョンのものを使いた

    ・あっ、D のバージョンはちょっと古いやつでよろしく
    ......  >


    View full-size slide

  97. ・依存って何ですか?

    ・AがBとEに依存する


    ・BはCとFに依存する


    ・CはDとEとGに依存する


    ・DはFとHに依存する


    ・Eは特に他のパッケージに依存しない


    ・FはIに依存する


    ・JはEに依存する

    ・それぞれのパッケージは 指定されたバージョン の範囲で定
    義されている
    ・依存するパッケージが 該当のバージョンで動く かどうかは要
    別途確認
    ・なるべく新しいかつ安定しているバージョンのものを使いた

    ・D のバージョンはちょっと古いやつで
    ・それぞれのパッケージは 指定されたバージョン の範囲で定
    義されている
    ・依存するパッケージが 該当のバージョンで動く かどうかは要
    別途確認
    ・なるべく新しいかつ安定しているバージョンのものを使いた

    ・あっ、D のバージョンはちょっと古いやつでよろしく

    View full-size slide


  98. パッケージってなんですか?

    依存ってなんですか? 

    管理ツールってなんですか?

    >

    あいえるたそ


    View full-size slide

  99. ・管理ツールって何ですか?

    これまでのあらすじ


    View full-size slide

  100. ・管理ツールって何ですか?

    ・ユニットテストや静的解析、フレームワークなどのphp-src外のツールを広義の意味で
    パッケージと呼んでいた

    これまでのあらすじ


    View full-size slide

  101. ・管理ツールって何ですか?

    ・ユニットテストや静的解析、フレームワークなどのphp-src外のツールを広義の意味で
    パッケージと呼んでいた


    ・パッケージとパッケージの間には、
    依存関係があった

    これまでのあらすじ


    View full-size slide

  102. ・管理ツールって何ですか?

    ・ユニットテストや静的解析、フレームワークなどのphp-src外のツールを広義の意味で
    パッケージと呼んでいた


    ・パッケージとパッケージの間には、
    依存関係があった


    ・依存関係を解決しつつ、必要なパッケージを
    自動でインストールしてくれるツールがある
    らしい

    これまでのあらすじ


    View full-size slide

  103. ・管理ツールって何ですか?

    ・ユニットテストや静的解析、フレームワークなどのphp-src外のツールを広義の意味で
    パッケージと呼んでいた


    ・パッケージとパッケージの間には、
    依存関係があった


    ・依存関係を解決しつつ、必要なパッケージを
    自動でインストールしてくれるツールがある
    らしい


    ・もちろん、バージョンの依存関係も解決できますよ

    これまでのあらすじ


    View full-size slide

  104. ・管理ツールって何ですか?

    ・ユニットテストや静的解析、フレームワークなどのphp-src外のツールを広義の意味で
    パッケージと呼んでいた


    ・パッケージとパッケージの間には、
    依存関係があった


    ・依存関係を解決しつつ、必要なパッケージを
    自動でインストールしてくれるツールがある
    らしい


    ・もちろん、バージョンの依存関係も解決できますよ

    これまでのあらすじ

    おいおい、マジかよ...... そんな夢のようなツールがあるのかよ >

    View full-size slide

  105. ・管理ツールって何ですか?

    とはいえ......


    それってパッケージインストールに必要な処理を自動化してるだけでは?


    View full-size slide

  106. ・管理ツールって何ですか?

    とはいえ......


    それってパッケージインストールに必要な処理を自動化してるだけでは?

    管理ツールって言うには大袈裟かもしれない......ような......?

    たしかに便利だけどさ >

    View full-size slide

  107. ・管理ツールって何ですか?

    とはいえ......


    それってパッケージインストールに必要な処理を自動化してるだけでは?

    管理ツールって言うには大袈裟かもしれない......ような......?

    おっ? >
    composer を 管理ツール たらしめている 理由 が他にもあるはず……


    View full-size slide

  108. ・管理ツールって何ですか?

    ここまでの流れを整理すると


    ・composer を実行できる環境を用意した


    ・composer.json にインストールするものを定義 (phpunit)


    ・composer install すると、composer.lock と vendor ディレクトリができた


    ・vendor の中には phpunit を含むいくつかのパッケージが入ってた


    ・phpunit の中には更に別の composer.json が入ってた


    ・その中には vendor に入ってた phpunit 以外のパッケージが指定されていた


      ・myclubs, phar-io, sebastian があった


    少し前のスライドに戻ってみると……


    View full-size slide

  109. ・管理ツールって何ですか?

    ここまでの流れを整理すると


    ・composer を実行できる環境を用意した


    ・composer.json にインストールするものを定義 (phpunit)


    ・composer install すると、composer.lock と vendor ディレクトリができた


    ・vendor の中には phpunit を含むいくつかのパッケージが入ってた


    ・phpunit の中には更に別の composer.json が入ってた


    ・その中には vendor に入ってた phpunit 以外のパッケージが指定されていた


      ・myclubs, phar-io, sebastian があった


    少し前のスライドに戻ってみると……

    ↑ これについて特に言及されていなかった…… 


    View full-size slide

  110. ・管理ツールって何ですか?

    ・composer installした際に誕生したもう一つのファイルである composer.lockとは何者?


    View full-size slide

  111. ・管理ツールって何ですか?

    ・composer installした際に誕生したもう一つのファイルである composer.lockとは何者?


    ・よくわからんけど、composer.json に起因するもの っぽいことは分かる


      ・composer.json を使った composer install で誕生したので 


    View full-size slide

  112. ・管理ツールって何ですか?

    ・composer installした際に誕生したもう一つのファイルである composer.lockとは何者?


    ・よくわからんけど、composer.json に起因するもの っぽいことは分かる


      ・composer.json を使った composer install で誕生したので 


    ・とりあえず、composer.lock の中身を見てみればいいんじゃない? 


    View full-size slide

  113. ・管理ツールって何ですか?

    ・composer installした際に誕生したもう一つのファイルである composer.lockとは何者?


    ・よくわからんけど、composer.json に起因するもの っぽいことは分かる


      ・composer.json を使った composer install で誕生したので 


    ・とりあえず、composer.lock の中身を見てみればいいんじゃない? 


    Better Than Nothing ...... >

    View full-size slide

  114. ・管理ツールって何ですか?

    composer.lock の中を見てみると以下のようなことが書いてある 


    View full-size slide

  115. ・管理ツールって何ですか?

    composer.lock の中を見てみると以下のようなことが書いてある 


    "_readme": [
    "This file locks the dependencies of your project to a known state",
    "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
    "This file is @generated automatically"
    ],

    View full-size slide

  116. ・管理ツールって何ですか?

    composer.lock の中を見てみると以下のようなことが書いてある 


    "_readme": [
    "This file locks the dependencies of your project to a known state",
    "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
    "This file is @generated automatically"
    ],
    「このファイルは、プロジェクトの
    依存関係を既知の状態にロック します、このファイルは自動生成されます」

    View full-size slide

  117. ・管理ツールって何ですか?

    依存関係を既知の状態にロック しますとは......


    View full-size slide

  118. ・管理ツールって何ですか?

    依存関係を既知の状態にロック しますとは......


    「このファイルが存在する状態で composer install を実行すると composer.json ではなくcomposer.lock
    の方を参照してパッケージをインストールしてくる」ということ


    View full-size slide

  119. ・管理ツールって何ですか?

    依存関係を既知の状態にロック しますとは......


    「このファイルが存在する状態で composer install を実行すると composer.json ではなくcomposer.lock
    の方を参照してパッケージをインストールしてくる」ということ

    というわけで、実験してみる

    Better Than Nothing ...... >

    View full-size slide

  120. ・管理ツールって何ですか?

    実際に、composer.json を以下の様に変更して再度 composer install を実行してみましょう

    {
    "require-dev": {
    "phpunit/phpunit": "*",
    "guzzlehttp/guzzle": "^6.3"
    }
    }


    View full-size slide

  121. ・管理ツールって何ですか?

    実際に、composer.json を以下の様に変更して再度 composer install を実行してみましょう

    {
    "require-dev": {
    "phpunit/phpunit": "*",
    "guzzlehttp/guzzle": "^6.3"
    }
    }


    すると、これまでの流れだとおそらく guzzleとguzzleの依存パッケージ に関するディレクトリが
    vendor直下に追加されることが予想できます 


    View full-size slide

  122. ・管理ツールって何ですか?

    実際に、composer.json を以下の様に変更して再度 composer install を実行してみましょう

    {
    "require-dev": {
    "phpunit/phpunit": "*",
    "guzzlehttp/guzzle": "^6.3"
    }
    }


    すると、これまでの流れだとおそらく guzzleとguzzleの依存パッケージ に関するディレクトリが
    vendor直下に追加されることが予想できます 

    phpunit の時と同じはず >

    View full-size slide

  123. ・管理ツールって何ですか?

    しかし、実際に続行してみると以下のようなエラー文が出て失敗します。


    Installing dependencies from lock file (including require-dev)
    Verifying lock file contents can be installed on current platform.
    Warning: The lock file is not up to date with the latest changes in composer.json. You may be
    getting outdated dependencies. It is recommended that you run `composer update` or `composer update
    `.
    - Required (in require-dev) package "guzzlehttp/guzzle" is not present in the lock file.

    View full-size slide

  124. ・管理ツールって何ですか?

    しかし、実際に続行してみると以下のようなエラー文が出て失敗します。


    Installing dependencies from lock file (including require-dev)
    Verifying lock file contents can be installed on current platform.
    Warning: The lock file is not up to date with the latest changes in composer.json. You may be
    getting outdated dependencies. It is recommended that you run `composer update` or `composer update
    `.
    - Required (in require-dev) package "guzzlehttp/guzzle" is not present in the lock file.
    「composer.json と composer.lock で定義されている内容が違うぞ」 


    View full-size slide

  125. ・管理ツールって何ですか?

    しかし、実際に続行してみると以下のようなエラー文が出て失敗します。


    Installing dependencies from lock file (including require-dev)
    Verifying lock file contents can be installed on current platform.
    Warning: The lock file is not up to date with the latest changes in composer.json. You may be
    getting outdated dependencies. It is recommended that you run `composer update` or `composer update
    `.
    - Required (in require-dev) package "guzzlehttp/guzzle" is not present in the lock file.
    「composer.json と composer.lock で定義されている内容が違うぞ」 

    これが、プロジェクトの依存関係を既知の状態にロックしている状態というわけです。


    View full-size slide

  126. ・管理ツールって何ですか?

    しかし、実際に続行してみると以下のようなエラー文が出て失敗します。


    Installing dependencies from lock file (including require-dev)
    Verifying lock file contents can be installed on current platform.
    Warning: The lock file is not up to date with the latest changes in composer.json. You may be
    getting outdated dependencies. It is recommended that you run `composer update` or `composer update
    `.
    - Required (in require-dev) package "guzzlehttp/guzzle" is not present in the lock file.
    「composer.json と composer.lock で定義されている内容が違うぞ」 

    これが、プロジェクトの依存関係を既知の状態にロックしている状態というわけです。

    つまり、composer.lockファイルというのは

    「現在のvendorの中身を正確に定義して固定しているもの」という理解ができます。


    View full-size slide

  127. ・管理ツールって何ですか?

    しかし、実際に続行してみると以下のようなエラー文が出て失敗します。


    Installing dependencies from lock file (including require-dev)
    Verifying lock file contents can be installed on current platform.
    Warning: The lock file is not up to date with the latest changes in composer.json. You may be
    getting outdated dependencies. It is recommended that you run `composer update` or `composer update
    `.
    - Required (in require-dev) package "guzzlehttp/guzzle" is not present in the lock file.
    「composer.json と composer.lock で定義されている内容が違うぞ」 

    これが、プロジェクトの依存関係を既知の状態にロックしている状態というわけです。

    つまり、composer.lockファイルというのは

    「現在のvendorの中身を正確に定義して固定しているもの」という理解ができます。

    composer installを実行した後で、lockファイルやvendorの中身を弄ったりしない限りはvendorの
    中身はlockファイルに描かれているもので保証されているというわけです。


    View full-size slide

  128. ・管理ツールって何ですか?

    Installing dependencies from lock file (including require-dev)
    Verifying lock file contents can be installed on current platform.
    Warning: The lock file is not up to date with the latest changes in composer.json. You may be
    getting outdated dependencies. It is recommended that you run `composer update` or `composer update
    `.
    - Required (in require-dev) package "guzzlehttp/guzzle" is not present in the lock file.
    というわけでここに書かれている通り、

    composer updateを実行してcomposer.lockの内容を上書きしてみましょう。


    View full-size slide

  129. ・管理ツールって何ですか?

    .
    └ vendor
    ├ bin
    ├ composer
    ├ guzzlehttp
    ├ myclabs
    ├ nikic
    ├ phar-io
    ├ phpunit
    ├ psr
    ├ ralouphie
    ├ sebastian
    ├ sumfony
    └ theseer
    ・すると、左記のような構成に変化します 


    View full-size slide

  130. ・管理ツールって何ですか?

    .
    └ vendor
    ├ bin
    ├ composer
    ├ guzzlehttp <- New!
    ├ myclabs
    ├ nikic
    ├ phar-io
    ├ phpunit
    ├ psr <- New!
    ├ ralouphie <- New!
    ├ sebastian
    ├ sumfony <- New!
    └ theseer
    ・すると、左記のような構成に変化します 


    ・たしかに、guzzlehttpと依存パッケージがいくつか追
    加されている


    View full-size slide

  131. ・管理ツールって何ですか?

    .
    └ vendor
    ├ bin
    ├ composer
    ├ guzzlehttp <- New!
    ├ myclabs
    ├ nikic
    ├ phar-io
    ├ phpunit
    ├ psr <- New!
    ├ ralouphie <- New!
    ├ sebastian
    ├ sumfony <- New!
    └ theseer
    ・すると、左記のような構成に変化します 


    ・たしかに、guzzlehttpと依存パッケージがいくつか追
    加されている


    ・この状態でvendorディレクトリを削除し、 

    composer install を行ってみると 同じ状況が再現され
    ることも確認


    View full-size slide

  132. ・管理ツールって何ですか?

    なので、composer.json, composer.lock の役割についてまとめると以下の様になります 


    View full-size slide

  133. ・管理ツールって何ですか?

    なので、composer.json, composer.lock の役割についてまとめると以下の様になります 


    ・初回の composer install では .json を参照


    ・二回目以降は .lock を参照


    View full-size slide

  134. ・管理ツールって何ですか?

    なので、composer.json, composer.lock の役割についてまとめると以下の様になります 


    ・初回の composer install では .json を参照


    ・二回目以降は .lock を参照


    上記に関しては嬉しいこととしては次のような点があります


    View full-size slide

  135. ・管理ツールって何ですか?

    なので、composer.json, composer.lock の役割についてまとめると以下の様になります 


    ・初回の composer install では .json を参照


    ・二回目以降は .lock を参照


    上記に関しては嬉しいこととしては次のような点があります


    ・チーム開発などでパッケージの依存関係に関する情報を共有したい場合


    ・誰かが用意した composer.lock を git等で管理し、各自の環境で composer install
    することにより共通の開発環境を手軽に用意可能


    View full-size slide

  136. ・管理ツールって何ですか?

    というわけで、

    composer は PHPのパッケージ依存管理 ツールであることが分かった


    View full-size slide

  137. ・管理ツールって何ですか?

    というわけで、

    composer は PHPのパッケージ依存管理 ツールであることが分かった


    View full-size slide


  138. パッケージってなんですか?

    依存ってなんですか? 

    管理ツールってなんですか?

    まだ何かあるような気がします!

    >

    あいえるたそ


    View full-size slide

  139. ・まだ何かあるような気がします! ~ require ~

    とはいえ、追加でパッケージが欲しい時に、composer.jsonに必要なパッケージを書き込んで
    composer updateするという 手順を取りたくないとき もあると思います



    View full-size slide

  140. ・まだ何かあるような気がします! ~ require ~

    とはいえ、追加でパッケージが欲しい時に、composer.jsonに必要なパッケージを書き込んで
    composer updateするという 手順を取りたくないとき もあると思います


    それはどんなときかというと、


    「追加パッケージに関係のないパッケージのバージョンを動かしたくない」


    等の場合が一例としてあります


    View full-size slide

  141. ・まだ何かあるような気がします! ~ require ~

    とはいえ、追加でパッケージが欲しい時に、composer.jsonに必要なパッケージを書き込んで
    composer updateするという 手順を取りたくないとき もあると思います


    それはどんなときかというと、


    「追加パッケージに関係のないパッケージのバージョンを動かしたくない」


    等の場合が一例としてあります



    そこで使うコマンドが、 composer require <パッケージ名> 


    View full-size slide

  142. ・まだ何かあるような気がします! ~ require ~

    試しに、

    composer require monolog/monolog 

    を実行すると、composer.json に monolog に関する定義が追加されていることが確認できます 



    {
    "require-dev": {
    "phpunit/phpunit": "*",
    "guzzlehttp/guzzle": "^6.3"
    },
    "require": {
    "monolog/monolog": "^3.3"
    }
    }

    View full-size slide

  143. ・まだ何かあるような気がします! ~ require ~

    {
    "require-dev": {
    "phpunit/phpunit": "*",
    "guzzlehttp/guzzle": "^6.3"
    },
    "require": {
    "monolog/monolog": "^3.3"
    }
    }
    ・ここで “require” となっているのは、本番環境で必
    要とされるパッケージ群を定義している 



    ・” require-dev “ と書いてある方は開発環境で必要
    となるパッケージの定義 


    View full-size slide

  144. ・まだ何かあるような気がします! ~ require ~

    {
    "require-dev": {
    "phpunit/phpunit": "*",
    "guzzlehttp/guzzle": "^6.3"
    },
    "require": {
    "monolog/monolog": "^3.3"
    }
    }
    ・ここで “require” となっているのは、 本番環境で必
    要とされるパッケージ群を定義している 



    ・” require-dev “ と書いてある方は 開発環境で必要
    となるパッケージの定義 

    ・devの方には composer require --dev <パッケージ名> としてあげることで追加できる 


    ・この状態で何も指定せずにcomposer installを実行すると、requireもrequire-devも どちらもインストールされる 


    ・composer install --no-dev とすると、require-devの記載分を除く 本番環境用だけをインストールする 


    View full-size slide


  145. パッケージってなんですか?

    依存ってなんですか? 

    管理ツールってなんですか?

    まだ何かあるような気がします!!

    >

    あいえるたそ


    View full-size slide

  146. ・まだ何かあるような気がします! ~ プロジェクトとパッケージ ~

    ・そもそも、composer.jsonをディレクトリに配置した時点で、 そのディレクトリは1つのパッケージになる
    と考えてよさそう




    View full-size slide

  147. ・まだ何かあるような気がします! ~ プロジェクトとパッケージ ~

    ・そもそも、composer.jsonをディレクトリに配置した時点で、 そのディレクトリは1つのパッケージになる
    と考えてよさそう



    ・つまり、requireをプロジェクトに追加するとき、その行為自体が「他のパッケージに依存するパッケー
    ジ」を新たに作っているとも考えられる 


    View full-size slide

  148. ・まだ何かあるような気がします! ~ プロジェクトとパッケージ ~

    ・そもそも、composer.jsonをディレクトリに配置した時点で、 そのディレクトリは1つのパッケージになる
    と考えてよさそう



    ・つまり、requireをプロジェクトに追加するとき、その行為自体が「他のパッケージに依存するパッケー
    ジ」を新たに作っているとも考えられる 



    ・上記を踏まえてプロジェクトとパッケージの違いは何なのか考えてみると、「プロジェクトは名前のな
    いパッケージ」だと解釈できそう 


    View full-size slide

  149. ・まだ何かあるような気がします! ~ プロジェクトとパッケージ ~

    具体例として下に書いてあるcomposer.jsonを例に考えてみよう 


    すると、これはphpunit, guzzle, monologが入ったパッケージを定義しているのと同じであることが分かる 


    とはいえ、この例ではプロジェクトと呼ぶにはなんかちょっと足りてない感じがする 




    {
    "require-dev": {
    "phpunit/phpunit": "*",
    "guzzlehttp/guzzle": "^6.3"
    },
    "require": {
    "monolog/monolog": "^3.3"
    }
    }

    View full-size slide

  150. ・まだ何かあるような気がします! ~ プロジェクトとパッケージ ~

    インストール可能なパッケージを作成するためには、このパッケージ定義に名前を付けてあげる必要がある


    たとえば、phpunitであればphpunit/phpunitとなっている部分を指定してあげる感じ






    {
    "name": "kerokero/hello-composer", 
    "require-dev": {
    "phpunit/phpunit": "*",
    "guzzlehttp/guzzle": "^6.3"
    },
    "require": {
    "monolog/monolog": "^3.3"
    }
    }

    View full-size slide

  151. ・まだ何かあるような気がします! ~ プロジェクトとパッケージ ~

    ・この例では、プロジェクト名が kerokero/hello-composer であり、ベンダー名が kerokero、

    パッケージ名が hello-composer ということになります。





    "name": "kerokero/hello-composer", 

    View full-size slide

  152. ・まだ何かあるような気がします! ~ プロジェクトとパッケージ ~

    ・この例では、プロジェクト名が kerokero/hello-composer であり、ベンダー名が kerokero、

    パッケージ名が hello-composer ということになります。


    ・作ったライブラリはPackagistなどのレポジトリに登録することができ、誰でも簡単に使うことができるようになる


    ・なので、これまでcomposer installでインストールしていたパッケージは、このような形で誰かが作ったものであるとい
    うことを知っておくと良いかも



    
 "name": "kerokero/hello-composer", 

    View full-size slide

  153. ・まだ何かあるような気がします! ~ プロジェクトとパッケージ ~

    ・また、composerには プラットフォームパッケージ という概念もある


    ・これはシステムにインストールされる仮想的なパッケージのことであり、

    具体的にはphpやcurlなどがあり "php" : "^5.5 || ^7.0", などという形で指定することができる


    ・これらは別途誰かが作ったパッケージというよりは、
    仮想的にcomposerでインストールできるようにパッケージ
    化しているものと考えてよさそう





    {
    "require": {
    "php": ">=5.3"
    }
    }

    View full-size slide

  154. Agenda

    1. 軽い自己紹介          


    2. Composerってなによ       


    3. パッケージ管理ツールとしてのComposer 


    4. pharについて         


    5. オートロードについて


    6. 反省点・良かった点・感想


    View full-size slide

  155. ・pharについて

    少しスライドを戻ってみましょう


    View full-size slide

  156. ・pharについて

    少しスライドを戻ってみましょう

    PHPUnit に必要なすべての 依存ファイル をひとつのファイル
    にまとめた PHP アーカイブ (PHAR) を配布します



    あるいは、Composer を使って PHPUnit やその 依存ファイ
    ル をダウンロードしてインストールすることもできます。


    View full-size slide

  157. ・pharについて

    ・この説明を見る限り......



    PHPUnit に必要なすべての 依存ファイル をひとつのファイルにまとめた
    PHP アーカイブ (PHAR) を配布します

    View full-size slide

  158. ・pharについて

    ・この説明を見る限り......



    ・pharは依存パッケージをまとめて配布するためのものであると考えてよさそう



    PHPUnit に必要なすべての 依存ファイル をひとつのファイルにまとめた
    PHP アーカイブ (PHAR) を配布します

    View full-size slide

  159. ・pharについて

    ・この説明を見る限り......



    ・pharは依存パッケージをまとめて配布するためのものであると考えてよさそう



    ・つまり、zipやtarの様に複数のPHPファイルを1つにまとめられると考えてよさそ
    う



    PHPUnit に必要なすべての 依存ファイル をひとつのファイルにまとめた
    PHP アーカイブ (PHAR) を配布します

    View full-size slide

  160. ・pharについて

    ・この説明を見る限り......



    ・pharは依存パッケージをまとめて配布するためのものであると考えてよさそう



    ・つまり、zipやtarの様に複数のPHPファイルを1つにまとめられると考えてよさそ
    う



    ・.pharファイルというのは上記の通り、PHPUnitなどのパッケージを

    まとめてアーカイブ化した現物を提供するための定義であると考えられる



    View full-size slide

  161. ・pharについて

    ・しかし、composer.jsonやlockを使ってinstallできる状態で、いったいphar
    を使う意味とは何なのでしょうか?





    View full-size slide

  162. ・pharについて

    ・しかし、composer.jsonやlockを使ってinstallできる状態で、いったいphar
    を使う意味とは何なのでしょうか?



    ・例えば、pharでまとめなかったとしても 

    composer require --dev <パッケージ名> 

    で開発時にのみ使う依存パッケージをインストールできます






    View full-size slide

  163. ・pharについて

    ・しかし、composer.jsonやlockを使ってinstallできる状態で、いったいphar
    を使う意味とは何なのでしょうか?



    ・例えば、pharでまとめなかったとしても 

    composer require --dev <パッケージ名> 

    で開発時にのみ使う依存パッケージをインストールできます



    ・これは便利だし、直感的にも何をしているかわかりやすい

    のでこれでよさそうな気がしますよね。

    
 よね >

    View full-size slide

  164. ・pharについて

    ・多くのプロジェクトはツール単体で開発されているわけではなく、

    ツール自体も他のパッケージに依存しているということはこれまでの話からも理解で
    きていると思います






    View full-size slide

  165. ・pharについて

    ・多くのプロジェクトはツール単体で開発されているわけではなく、

    ツール自体も他のパッケージに依存しているということはこれまでの話からも理解で
    きていると思います



    ・例えば……

    コードフォーマッタである PHP-CS-Fixer は多くの Symfony コンポーネントに依存し
    ているので、何かの事情で古いバージョンに依存しているパッケージがインストール
    できない場合などがあります





    View full-size slide

  166. ・pharについて

    ・多くのプロジェクトはツール単体で開発されているわけではなく、

    ツール自体も他のパッケージに依存しているということはこれまでの話からも理解で
    きていると思います



    ・例えば……

    コードフォーマッタである PHP-CS-Fixer は多くの Symfony コンポーネントに依存し
    ているので、何かの事情で古いバージョンに依存しているパッケージがインストール
    できない場合などがあります


    ・ツールを含めた依存パッケージを全て同時にバージョン管理する必要があるため、ライブラリの
    依存関係がrequire-devのみで解決することができずにプロダクトで使われているパッケージ全体に
    問題が波及してしまう

    
 つらい >

    View full-size slide

  167. ・pharについて

    ・Composer自体も composer.phar というファイルで配布されていたり、

    PHPUnit などもPharファイルとして配布されています。


    ・これらは Composer の依存関係(vendor/ディレクトリ)を丸ごと同梱しているので、個々人
    が composer install などで各依存をかき集めることなく完成品のパッケージをインストール
    できるわけです。






    View full-size slide

  168. ・pharについて

    ・Composer自体も composer.phar というファイルで配布されていたり、

    PHPUnit などもPharファイルとして配布されています。


    ・これらは Composer の依存関係(vendor/ディレクトリ)を丸ごと同梱しているので、個々人
    が composer install などで各依存をかき集めることなく完成品のパッケージをインストール
    できるわけです。






    View full-size slide

  169. Agenda

    1. 軽い自己紹介          


    2. Composerってなによ       


    3. パッケージ管理ツールとしてのComposer 


    4. pharについて         


    5. オートロードについて     


    6. 反省点・良かった点・感想


    View full-size slide

  170. ・オートロードについて

    ・ここまでが パッケージ管理ツール としての Composer の役割でした








    View full-size slide

  171. ・オートロードについて

    ・ここまでが パッケージ管理ツール としての Composer の役割でした


    ・そして実は、もうひとつの Composer の役割として autoloader という役割がありま
    す。








    View full-size slide

  172. ・オートロードについて

    ・ここまでが パッケージ管理ツール としての Composer の役割でした


    ・そして実は、もうひとつの Composer の役割として autoloader という役割がありま
    す。


    なので、ここからはオートロードとPSRについて話します。






    View full-size slide

  173. ・オートロードについて

    ・Composerを使う際にも登場するワードとしてオートロードというものがあります












    View full-size slide

  174. ・オートロードについて

    ・Composerを使う際にも登場するワードとしてオートロードというものがあります



    ・オートロードが何なのかはさておき、序盤の方でcomposer installをした際にvendorディ
    レクトリの中に実はautoload.phpも自動生成されていました








    View full-size slide

  175. ・オートロードについて

    ・Composerを使う際にも登場するワードとしてオートロードというものがあります



    ・オートロードが何なのかはさておき、序盤の方でcomposer installをした際にvendorディ
    レクトリの中に実はautoload.phpも自動生成されていました








    .
    └ vendor
    ├ bin
    ├ composer
    :
    └ autoload.php # New!

    View full-size slide

  176. ・オートロードについて

    ・このautoload.phpの中身を見てみると……












    View full-size slide

  177. ・オートロードについて

    ・このautoload.phpの中身を見てみると……












    View full-size slide

  178. ・オートロードについて

    ・このautoload.phpの中身を見てみると……












    何やらcomposerの中のファイルを呼び出している

    View full-size slide

  179. ・オートロードについて

    ・というわけで、どうやらオートロードという概念がcomposerを使う上で必要になりそうなことがな
    んとなく分かってきました












    View full-size slide

  180. ・オートロードについて

    ・というわけで、どうやらオートロードという概念がcomposerを使う上で必要になりそうなことがな
    んとなく分かってきました



    ・とはいえ、このオートロードという仕組みはComposerに固有のものではなく、実は
    PHP自体に備
    わっている仕組みみたいです









    View full-size slide

  181. ・オートロードについて

    ・というわけで、どうやらオートロードという概念がcomposerを使う上で必要になりそうなことがな
    んとなく分かってきました



    ・とはいえ、このオートロードという仕組みはComposerに固有のものではなく、実は
    PHP自体に備
    わっている仕組みみたいです



    ・なので、まずはPHPのオートロードの仕組みから見ていこうと思います





    View full-size slide

  182. ・オートロードについて

    ・PHPはオブジェクト指向言語でもあるため、アプリケーションで使われる
    クラスの定義ごとに一つ
    のPHPソースファイルを作成していくことになります












    View full-size slide

  183. ・オートロードについて

    ・PHPはオブジェクト指向言語でもあるため、アプリケーションで使われる
    クラスの定義ごとに一つ
    のPHPソースファイルを作成していくことになります



    ・その際に問題になる点としては、各スクリプトの先頭に必要な読み込みを行うための
    長いリストを記述する必要があることが挙げられます。








    View full-size slide

  184. ・オートロードについて

    ・PHPはオブジェクト指向言語でもあるため、アプリケーションで使われる
    クラスの定義ごとに一つ
    のPHPソースファイルを作成していくことになります



    ・その際に問題になる点としては、各スクリプトの先頭に必要な読み込みを行うための
    長いリストを記述する必要があることが挙げられます。








    View full-size slide

  185. ・オートロードについて

    ・PHPはオブジェクト指向言語でもあるため、アプリケーションで使われる
    クラスの定義ごとに一つ
    のPHPソースファイルを作成していくことになります



    ・その際に問題になる点としては、各スクリプトの先頭に必要な読み込みを行うための
    長いリストを記述する必要があることが挙げられます。


    ・オートロードを使用しない具体的な例としては、
    依存するクラスを require_once __DIR__.'../classes/A.php'; などとして
    冒頭で呼んであげるなどがあります。




    View full-size slide

  186. ・オートロードについて

    ・オートロードしない場合の流れは、
    実際には次のようになります












    class A{
    public $name = "";
    public function __construct()
    {
    $this->name = "kerokero";
    }
    public function Hello()
    {
    echo $this->name."\n";
    }
    }
    require_once __DIR__.'/../classes/A.php';
    class B extends A{
    public $email = "";
    public function Send()
    {
    echo "Send mail to ".$this->email."\n";
    }
    }
    require_once __DIR__.'/classes/B.php';
    $b = new B();
    $b->Hello();
    $b->Send();
    A.php B.php
    main.php

    View full-size slide

  187. ・オートロードについて

    では、オートロードを使うとどんなかんじになるのでしょうか?







    View full-size slide

  188. ・オートロードについて

    では、オートロードを使うとどんなかんじになるのでしょうか?
    オートロードを使う時の挙動を確認する前にいくつか知っておかなければならないこ
    とがあるので、そちらを先に紹介します




    View full-size slide

  189. ・オートロードについて ~ PSR ~ 

    ・PHPにも推奨されるコード規約というものがある 













    View full-size slide

  190. ・オートロードについて ~ PSR ~ 

    ・PHPにも推奨されるコード規約というものがある 


    ・しかし、PHPの公式が出しているものというわけではなく、PHPのフレームワーク等の開発者有
    志のグループであるPHP-FIGによって策定されているコーディング規約 があります


      ・それがPSR(PHP Standarrd Recommendations) 


      ・多くのPHPライブラリはこの考え方に則って作られている 





    View full-size slide

  191. ・オートロードについて ~ PSR ~ 

    ・PHPにも推奨されるコード規約というものがある 


    ・しかし、PHPの公式が出しているものというわけではなく、PHPのフレームワーク等の開発者有
    志のグループであるPHP-FIGによって策定されているコーディング規約 があります


      ・それがPSR(PHP Standarrd Recommendations) 


      ・多くのPHPライブラリはこの考え方に則って作られている 


    ・そして、Composerも類を洩れずこれに従っている。 

    実際、Composerは名前空間に関する規約であるPSR-4 に従っています。


    name space >

    View full-size slide


  192. 名前空間ってなんですか?
 >

    あいえるたそ


    View full-size slide

  193. ・オートロードについて ~ 名前空間 ~ 

    ・ここでは名前空間については深く触れずに、簡単に説明しようと思います 












    View full-size slide

  194. ・オートロードについて ~ 名前空間 ~ 

    ・ここでは名前空間については深く触れずに、簡単に説明しようと思います 


    ・例えば、main.php で itemShop.php から getItem関数 を呼ぶとします











    View full-size slide

  195. ・オートロードについて ~ 名前空間 ~ 

    ・ここでは名前空間については深く触れずに、簡単に説明しようと思います 


    ・例えば、main.php で itemShop.php から getItem関数 を呼ぶとします



    ・おそらく、

    require_once("itemShop.php); 

     として main.php 内で getItem関数 を呼ぶことで解決できます 






     まあね >

    View full-size slide

  196. ・オートロードについて ~ 名前空間 ~ 

    ・では、main.php で treasureBox.php から getItem 関数も呼びたくなったとしましょう










    View full-size slide

  197. ・オートロードについて ~ 名前空間 ~ 

    ・では、main.php で treasureBox.php から getItem 関数も呼びたくなったとしましょう
    ・この時、関数名が同じなので衝突してしまい実行できません。
      ・二重定義のエラーが出てしまいます







    View full-size slide

  198. ・オートロードについて ~ 名前空間 ~ 

    ・では、main.php で treasureBox.php から getItem 関数も呼びたくなったとしましょう
    ・この時、関数名が同じなので衝突してしまい実行できません。
      ・二重定義のエラーが出てしまいます
    ・そこで、この現象を回避するために
    名前空間というものを用意します





    View full-size slide

  199. ・オートロードについて ~ 名前空間 ~ 

    ・では、main.php で treasureBox.php から getItem 関数も呼びたくなったとしましょう
    ・この時、関数名が同じなので衝突してしまい実行できません。
      ・二重定義のエラーが出てしまいます
    ・そこで、この現象を回避するために
    名前空間というものを用意します

    ・それぞれに ItemShop と TreasureBox という名前空間を与えると、それぞれの関数は

    ItemShop/getItem、TreasureBox/getItem と異なる塊にすることができます。



    View full-size slide

  200. ・オートロードについて ~ 名前空間 ~ 

    ・そして、この名前空間による制御も開発規模が大きくなってくると、
    名前空間自体の管理を上手くやる必要
    があります。












    View full-size slide

  201. ・オートロードについて ~ 名前空間 ~ 

    ・そして、この名前空間による制御も開発規模が大きくなってくると、
    名前空間自体の管理を上手くやる必要
    があります。



    ・手動で管理するとめんどいので、これを
    自動でやってくれる機能があれば便利です。









    View full-size slide

  202. ・オートロードについて ~ 名前空間 ~ 

    ・そして、この名前空間による制御も開発規模が大きくなってくると、
    名前空間自体の管理を上手くやる必要
    があります。



    ・手動で管理するとめんどいので、これを
    自動でやってくれる機能があれば便利です。



    ・それを解決するのがオートローディングの考え方になっています。





    
 へぇ~ >

    View full-size slide


  203. PSR-4でオートローディングに関して重要な部分 

                     が気になります!


    >

    あいえるたそ


    View full-size slide

  204. ・オートロードについて ~ PSR-4 ~ 

    ・というわけで、名前空間の利用価値が分かったので、名前空間を定義した状態で
    クラスをオートロードでき
    るようにしてあげたいですね












    View full-size slide

  205. ・オートロードについて ~ PSR-4 ~ 

    ・というわけで、名前空間の利用価値が分かったので、名前空間を定義した状態で
    クラスをオートロードでき
    るようにしてあげたいですね




    ・Composerの場合はPSR-4に準拠しているので、PSR-4の中の一文を見てみます









    View full-size slide

  206. ・オートロードについて ~ PSR-4 ~ 

    ・というわけで、名前空間の利用価値が分かったので、名前空間を定義した状態で
    クラスをオートロードでき
    るようにしてあげたいですね




    ・Composerの場合はPSR-4に準拠しているので、PSR-4の中の一文を見てみます









    The terminating class name corresponds to a file name ending in .php. The
    file name MUST match the case of the terminating class name.

    View full-size slide

  207. ・オートロードについて ~ PSR-4 ~ 

    ・というわけで、名前空間の利用価値が分かったので、名前空間を定義した状態で
    クラスをオートロードでき
    るようにしてあげたいですね




    ・Composerの場合はPSR-4に準拠しているので、PSR-4の中の一文を見てみます









    The terminating class name corresponds to a file name ending in .php. The
    file name MUST match the case of the terminating class name.
    「クラス名は .php で終わるファイル名に対応します。ファイル名は、クラス名の大文字小文字と一
    致しなければなりません (MUST)」


    View full-size slide

  208. ・オートロードについて ~ PSR-4 ~ 

    ・PSR-4に従う以上何かメリットがあるはずですが、とりあえずここでわかるのは、 

    ファイルをクラスの様に扱っている ということです。












    View full-size slide

  209. ・オートロードについて ~ PSR-4 ~ 

    ・PSR-4に従う以上何かメリットがあるはず ですが、とりあえずここでわかるのは、 

    ファイルをクラスの様に扱っている ということです。




       

       というわけで実際にcomposerのオートロードを見ていきましょう







    View full-size slide

  210. ・オートロードについて ~ composerのオートロード ~ 

    ・少しスライドを戻してみましょう 













    何やらcomposerの中のファイルを呼び出している

    View full-size slide

  211. こっちがautoload.phpから呼ばれてる 

    おっ >

    View full-size slide

  212. ・PHPのオートロードは
    spl_autoload_register を使って登録される
    らしい


    ・引数としてautoload関数を与えてあげる
    とキューの中に追加されていき、定義さ
    れた順に紐づけられていくみたいです 


    ・とはいえ、php-srcの中に踏み込むこと
    になるのでここでは詳細は触れません 

    正直、よく分からん >

    View full-size slide

  213. ・PHPのオートロードは
    spl_autoload_register を使って登録される
    らしい


    ・引数としてautoload関数を与えてあげる
    とキューの中に追加されていき、定義さ
    れた順に紐づけられていくみたいです 


    ・とはいえ、php-srcの中に踏み込むこと
    になるのでここでは詳細は触れません 

    正直、よく分からん >

    View full-size slide

  214.     おっおっ >
    なんか include してファイルを読み込んでる

    ・ClassLoaderのコンストラクタで呼
    ばれているinitializeIncludeClosure
    の中を見てみる 


    ・特定のファイルをincludeしている
    ことも理解できる

    View full-size slide

  215. ・$file の中身は
    vendor/composer/autoload_real.php
    の中で指定されていて、
    ComposerStaticInit<値> となっているこ
    とが分かります

    正直、よく分からん >

    View full-size slide

  216. vendor/composer/autoload_static.php
    ・vendor/composer/autoload_static.php の中を見てみると、確かにcomposer.lockに書かれているものたちが
    public static $classMap として設定されている




    View full-size slide

  217. vendor/composer/autoload_static.php
    ・vendor/composer/autoload_static.php の中を見てみると、確かにcomposer.lockに書かれているものたちが
    public static $classMap として設定されている



    ・たしかに 名前空間 => ファイルパス というようにマッピングされていることが分かります


    View full-size slide

  218. ・オートロードについて ~ composerのオートロード ~ 

    ・なので、このことからも composerのオートロード がやっていることは


    「クラスが入ってるファイルのパスを名前空間に紐づけているだけ」


    ということがなんとなく分かったと思います










    View full-size slide

  219. ・オートロードについて ~ composerのオートロード ~ 

    ・なので、このことからも composerのオートロード がやっていることは


    「クラスが入ってるファイルのパスを名前空間に紐づけているだけ」


    ということがなんとなく分かったと思います



    ・この autoload_static.php の $classmap の中を見ると、確かにこれだけの量のクラスをいちいち
    require する必要があると考えれば、オートロードが便利だということもなんとなく分かると思います







    View full-size slide


  220. 理屈は分かったけどいまいちピンとこない!

                    


    >

       猫


    View full-size slide

  221. Agenda

    1. 軽い自己紹介          


    2. Composerってなによ       


    3. パッケージ管理ツールとしてのComposer 


    4. pharについて         


    5. オートロードについて     


    5.5 Slim Framework の場合 


    6. 反省点・良かった点・感想


    View full-size slide

  222. ・Slim Framework の場合

    ・これまでの説明で、composer とそれに採用されている autoload が便利なことはなんとなく分か
    ります













    View full-size slide

  223. ・Slim Framework の場合

    ・これまでの説明で、composer とそれに採用されている autoload が便利なことはなんとなく分か
    ります



    ・とはいえ、いまいちまだピンときていない部分もあるので、実際に
    Slim Frameworkのコードを見て
    みることで実感してみます



    ・最初の方で使っていた composer.json に Slim Framework を追加します。

    composer require slim/slim で require に追加し、composer update を行い composer.lock にSlim Framework
    を入れます





    View full-size slide

  224. ・Slim Framework の場合

    ・これまでの説明で、composer とそれに採用されている autoload が便利なことはなんとなく分か
    ります



    ・とはいえ、いまいちまだピンときていない部分もあるので、実際に
    Slim Frameworkのコードを見て
    みることで実感してみます



    ・最初の方で使っていた composer.json に Slim Framework を追加します。

    composer require slim/slim で require に追加し、composer update を行い composer.lock にSlim Framework
    を入れます



    ・同様にして composer require slim/psr7 も入れます。

    そして、composer install を実行すると確かに vendor ディレクトリの中に slim が誕生していることが確
    認できます (画像割愛)


    View full-size slide

  225. ・Slim Framework の場合

    ・この状態で以下の様に html/index.php を用意してみます














    View full-size slide

  226. ・Slim Framework の場合

    ・この状態で以下の様に html/index.php を用意してみます














    ・アクセスしてみると、たしかにslimを使って書かれ
    た情報が返却されます


    ・コードを見ると /../vendor/autoload.php をrequireしてい
    ることが分かります


    ・composer でオートロードされたクラスを、use
    Slim\Factory\AppFactory; のようにして呼び出している
    ということになります


    View full-size slide

  227. ・Slim Framework の場合

    ・この状態で以下の様に html/index.php を用意してみます














    ・アクセスしてみると、たしかにslimを使って書かれ
    た情報が返却されます


    ・コードを見ると /../vendor/autoload.php をrequireしてい
    ることが分かります


    ・composer でオートロードされたクラスを、use
    Slim\Factory\AppFactory; のようにして呼び出している
    ということになります

    おお! >

    View full-size slide

  228. Agenda

    1. 軽い自己紹介          


    2. Composerってなによ       


    3. パッケージ管理ツールとしてのComposer 


    4. pharについて         


    5. オートロードについて     


    5.5 Slim Framework の場合 


    6. 反省点・良かった点・感想   


    View full-size slide

  229. ・反省点・良かった点・感想

    ・Composerってチーム業務で当たり前のように使ってたり、PHPを使う様々な文脈で当然の用にでてく
    るけどなんかよく分かってないなーと思ったので調べたけど、理解が深まってよかった。













    View full-size slide

  230. ・反省点・良かった点・感想

    ・Composerってチーム業務で当たり前のように使ってたり、PHPを使う様々な文脈で当然の用にでてく
    るけどなんかよく分かってないなーと思ったので調べたけど、理解が深まってよかった。



    ・実際にコードの中身を覗いてみると挙動の一部を理解することができた気がした。










    View full-size slide

  231. ・反省点・良かった点・感想

    ・Composerってチーム業務で当たり前のように使ってたり、PHPを使う様々な文脈で当然の用にでてく
    るけどなんかよく分かってないなーと思ったので調べたけど、理解が深まってよかった。



    ・実際にコードの中身を覗いてみると挙動の一部を理解することができた気がした。



    ・php-src が絡む部分はよく分からなくて、あまり理解できなかった
    のが残念








    View full-size slide

  232. ・反省点・良かった点・感想

    ・2024年1月開催の phpcon北海道のLTで
    少しお話しさせていただきます!
    気になります! >

    View full-size slide

  233. 今回の反省点・分かった点・感想
    https://zenn.dev/22kerokero22/articles/3878a14202da4f
    ・今回の発表と似たような内容が、 zenn の記事でもまと
    められているのでそちらも参照してみよう

    View full-size slide

  234. ご清聴ありがとうございました!!

    わたし、     


    を完全理解しました!

    View full-size slide