🗂ファイル名を指定して検索したい時
→filename:file_name
ex.) filename:composer.json
🍙言語を指定して検索したい時
→language:LANGUAGE
ex.) language:php
🔎ざっくりいろんな検索をしたいとき
↑のサイトは、外部ライブラリを使っていて具体的な使い方を知りたくて他の人どうやって使ってるんだろ🤔って思った時によく使っています。
GitHubの検索より使いやすくて、目的のものを見つけれる気がします。
→filename:file_name
ex.) filename:composer.json
→language:LANGUAGE
ex.) language:php
↑のサイトは、外部ライブラリを使っていて具体的な使い方を知りたくて他の人どうやって使ってるんだろ🤔って思った時によく使っています。
GitHubの検索より使いやすくて、目的のものを見つけれる気がします。
GoogleAppScript(GAS)のconsole.logとLogger.logの違いを検証します!
→ 特に違いは分かりませんでした 🤔
→ Cloud のログを見るとログレベルに違いがありました
console.log→デバック(DEBUG)
、Logger.log→情報(INFO)
: https://developers.google.com/apps-script/reference/base/logger#log(Object)
Logger.getLog()
で今までのログを取得できる!!!(clearもできる)
(ログレベルはINFO)
: https://developers.google.com/apps-script/reference/base/console
ログレベルを使い分けれる!!!(日本語なのチョットキモイ)
– 🔴ERROR(エラー) : console.error()
– 🟠WARNING(警告) : console.warn()
– INFO(情報) : console.info()
– DEBUG(情報) : console.log()
console.info()とconsole.log()は違いがわからない🤔
GitHubのCIにCircleCIを使っていて、途中でjobが失敗した時CIの中身見たくてsshで接続したくなりますよね💡
例えば、「ディレクトリ配置うまくいってるかなー」「このパッケージちゃんとインストールされてるかな」とか… 🤔
その時、わたしがハマったポイントとしては、、、
\ ssh接続に使うid_rsaはGitHubのもの /
ということでした!
↑に表記されている通り$ ssh -p 64535 [IP]
とするとpermission deniedになってしまい、ssh接続できずハマっていました。
$ ssh -p 64536 [IP] The authenticity of host '[IP]:64536 ([IP]:64536)' can't be established. ED25519 key fingerprint is SHA256:xxxxx. This key is not known by any other names Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added '[IP]:64536' (ED25519) to the list of known hosts. user@[IP]: Permission denied (publickey).
私のローカルでは、GitHubのid_rsaを~/.ssh/id_rsa_github
に置いてます。
そのため-i ~/.ssh/id_rsa_github
で指定してあげるのが正解でした😇
ssh -i ~/.ssh/id_rsa_github -p [発行されたport] [発行されたip]
Use the same SSH public key that you use for your VCS-provider (e.g., GitHub).
と親切に説明してくれてるのを、素直に受け止めればこんなことにはならなかったでしょう…
お久しぶりです!年末年始にゆる〜くLaravelを触ってみました。
普段はSymfonyを書いているので、比較してみました。
間違っていることや補足コメントくれると嬉しいです!!
https://github.com/kin29/example-laravel-app
Laravel
: SQLではない。Symfony
: SQL。Laravel
: php artisan ~Symfony
: php bin/console ~Laravel
: routes/以下にルーティング定義をする。これによりControllerを作成しなくともルーティング設定ができる。ref: https://readouble.com/laravel/8.x/ja/routing.html
Symfony
: Controllerに直接ルーティング定義ができる。yamlによるルーティング定義もできる。ref: https://symfony.com/doc/current/routing.html
Laravel
: PHPStormではコード補完効かすためには、https://github.com/barryvdh/laravel-ide-helper#installationを入れるか、Laravel IDE(有料)を購入する必要があるっぽい…Symfony
: Symfony Supports(無料)で補完効くLaravel
: FormRequestを作る(Illuminate\Foundation\Http\FormRequestをextends)$ php artisan make:request StorePostRequest
実際のdiff: https://github.com/kin29/example-laravel-app/commit/b50df00ccd299284c9207be38c03ebe7ac38914e
Symfony
: FormTypeを作る(Symfony\Component\Form\AbstractTypeをextends)$ bin/console make:form
$ php artisan make:seeder UserSeeder
$ php artisan make:factory PostFactory
Symfony
: doctrine/doctrine-fixtures-bundleていうのがあるっぽい(使ったことない)Laravel
: Eloquentモデル(Eloquent ORM)$ php artisan make:model Flight //model作成
Symfony
: Entity(Doctrine ORM)$ bin/console make:entity //Entity作成
今年もぺチコンに参加させてもらいました!(オンライン)
オンラインなので👶がいる私には参加しやすかったです〜
YouTubeでアーカイブも残ってるのもありがたいです!何度も見直しますね(きっと)
今回初めてDiscordも活用させていただきました。リアルタイムでいろんな達人の方々が補足してくれるのでめちゃくちゃ勉強になりました!!!
また、会社のスポンサーツアーにもちょこっと出させてもらいました〜🙌
\ ぺチコン2021のタイムテーブルはこちら /
https://fortee.jp/phpcon-2021/timetable
コロナと落ち着いたら、またオフラインで参加したいです🥺
\ 過去のぺチコンレポートをどうぞ /
https://kin29.info/tag/phpcon/
コーディング規約の重要性を再確認させてもらいました。
php-cs-fixerとphp_codesnifferの違いについての理解は曖昧だったので、Discord上での解説もあり超納得でした!
php-cs-fixer → 書式しか見ないが全てを自動修正できる。
php_codesniffer → 構造も見るのでeraly exitとかも違反にできるが、全ては自動修正できない。より厳しくできる。
auto_prepend_fileっていう設定ができるの初知りでした!auto_prepend_fileについて別記事書いたので良かったらみてください。
SQL苦手系PHPerなのでめちゃくちゃ勉強になりました。EXPLAINの見方はよく知らなかったので、わかりやすい説明で大変理解できました!
会社の技術ブログで実際に手を動かしてEXPLAIN使って見たレポを書いたので良かったら見てください。
https://tech.quartetcom.co.jp/2021/10/07/phpcon-2021-report/
いい声なので動画貼っておきます。https://youtu.be/gdCE-UGqeSM?t=18952
変数名、関数名だけでも抽象化は表現できる!
複雑さ=条件分岐 → わかりやすくする=条件分岐を減らす
異なるものを同じように扱う事=ポリモーフィズム
JankenGameのコードはdisplayLangResolverを追加したい!って思ってしまいました。
Smalltalkっていう言語のOOP流派もある(←普段使わない方)
ポリモーフィズムは3つある。サブタイプポリモーフィズム
/パラメトリックポリモーフィズム
/アドホックポリモーフィズム
いつも通り、成瀬さんの説明はめちゃくちゃわかりやすいです。DDDの本読みました!
「OOPって何?なんでいいの?」って聞かれたらおすすめしたいトークです。
新原さんも声もいい☺️https://youtu.be/gdCE-UGqeSM?t=23609
例題のドメインがワクチン接種なのが現代的!でコードも見れてわかりやすかった!
モデリング→複数の視点(俯瞰でみるかその中の要素でみるか)、手法で徐々に形にしていく
– ユースケース図 …システム化の範囲、ユーザが見えてくる
– 用語集の作成(ちょっと面倒) …項目は用語/英語表記/内容。英語表記があることでコード上での表記ゆれを防ぐ。解釈のずれがなくなるのでおすすめとのこと。
– 概念モデル図 …クラス図。多重度がわかる。用語を適当にばーっと並べて線で結ぶことからはじめて、徐々にブラッシュアップしていく感じ。
UML図ちゃんとは書いたことない。。。💦
ドメインモデル実装
– 1ドメイン = 1クラス
– POPO(Plain Old PHP Odject)、プレーンなPHPで作成
– クラス名やメソッド名にドメインモデル用語を使う
– setterを作らない方が良い …ドメインロジックによってプロパティ値を変更する
日本語クラスは作ったことないのでやってみたい!PHPStormはバリバリ対応してるらしい。
モデリングしてコードを実装することで理解が深まる、コードを書いてて気づくことが多いのはめちゃわかる!
→モデリングの一環としてコードを書くことと、結構良い!テストで実行検証できるのも良い🙆♀️
ステータスの状態遷移図もあると便利。
Enumは型としても使える、日本語も使える!
まずは、用語集→ユースケース図が良さそう、用語集でドメイン知識の認識を合わせることが重要💡
図やドキュメントのメンテは? → Wikiレベルで良い、とりあえずあれば嬉しい。
何度も見返したいトークでした!!!🙇♂️
IMO=in my option 私の意見では
わたしもレビューされる方が好きです。
レビューしてもらうとその分学びが増える感じが好きです。
pullpanda使ったことないので、使って見たいと思いました!
https://pullpanda.com/
二日目レポートも書きます!(きっと)
ぺチコン2021を見ていて、初めて知ったビルドインのオプションを知りました!
\ auto-prepend-fileです! /
今回はそれを使って開発を便利にしていきたいと思いますー🙋♂️
教えてくださったスライドはこちらです、ありがとうございます!
https://speakerdeck.com/tzmfreedom/original-framework-php-kaizen?slide=22
簡単にできる事を説明すると、独自関数などを定義したファイルをスクリプト実行前に読み込ませることができます!
それにより、デバック関数を独自に作成して、それをスクリプト内に仕込んでデバックするみたいなことができて便利みたいです。
https://www.php.net/manual/ja/ini.core.php#ini.auto-prepend-file
auto_prepend_file string
メインファイルの前に自動的に付加されるファイルの名前を指定します。 このファイルは、require 関数のコール時と同様に読み込まれます。 このため、include_path が使用されます。
特別な値 none を指定すると、ファイルを前に追加する機能は無効となります。
逆に、auto_append_file
というのもあるみたいです。
auto-prepend-file
もauto_append_file
もexit();が使われるようなスクリプトでは、使用できないとのことです。私はここの中身みたいなーって時は、var_dump($hoge);exit();
としちゃってたので注意しないとでした。そういうときはdd($hoge);
を使うといいみたいですね。
Symfonyの公式にも掲載されていました!
https://symfony.com/doc/current/components/var_dumper.html#the-dump-function
In order to have the dump() function always available when running any PHP code, you can install it globally on your computer:
- Run composer global require symfony/var-dumper;
- Add auto_prepend_file = ${HOME}/.composer/vendor/autoload.php to your php.ini file;
- From time to time, run composer global update symfony/var-dumper to have the latest bug fixes.
composer global require symfony/var-dumper;
PHP8.0.3でやっていきます。
$ php --version PHP 8.0.3 (cli) (built: May 27 2021 13:40:53) ( NTS ) Copyright (c) The PHP Group Zend Engine v4.0.3, Copyright (c) Zend Technologies with Zend OPcache v8.0.3, Copyright (c), by Zend Technologies with Xdebug v3.0.3, Copyright (c) 2002-2021, by Derick Rethans $ composer global require symfony/var-dumper; Changed current directory to /Users/shigaayano/.composer Using version ^5.3 for symfony/var-dumper ./composer.json has been created Running composer update symfony/var-dumper Loading composer repositories with package information Updating dependencies Lock file operations: 3 installs, 0 updates, 0 removals - Locking symfony/polyfill-mbstring (v1.23.1) - Locking symfony/polyfill-php80 (v1.23.1) - Locking symfony/var-dumper (v5.3.8) Writing lock file Installing dependencies from lock file (including require-dev) Package operations: 0 installs, 3 updates, 31 removals - Removing symfony/stopwatch (v5.1.2) - Removing symfony/service-contracts (v1.1.5) - Removing symfony/process (v5.1.2) - Removing symfony/polyfill-php73 (v1.11.0) ...
auto_prepend_file = ${HOME}/.composer/vendor/autoload.php
を追加php -r "echo phpinfo();" | grep "php.ini"
でphp.iniの場所を確認して、最終行とかに追記します。
ちゃんと適用されてるか心配だったので、確認して見ます。
設定されてるみたいです。
php -r "echo phpinfo();" | grep "auto_prepend_file" auto_prepend_file => /Users/xxx/.composer/vendor/autoload.php => /Users/xxx/.composer/vendor/autoload.php
まず、dd($hoge);
を使って見ます。
今回、コントローラ内でdd($form)
でFormの中身を見たかったのですが、dump後にexitされるためdumpが出力された後はレスポンスも表示されません。
次に、dump($hoge);
を使って見ます。
exitされないため、レスポンスがいつも通り表示されてSymfony Profiler > Debugからdumpを確認できます。
プロジェクト内のコードを変更せず使えますし、便利なので今後も開発で是非使っていこうと思います🙌!
お久しぶりです…そろそろ更新頻度上げていきたいと思っております🙇♂️
今回はPHP8から使えるようになった、Constructor property promotion
を使って見たので、差分と使って見た感想をまとめてみます。
Constructor property promotion
とは?https://www.php.net/releases/8.0/en.php#constructor-property-promotion
👆のPHP7→PHP8の差分を見ての通り、簡潔に言うとコンストラクタの引数にすべてを詰め込めます。コンストラクタの引数にプロパティ定義、初期値もかけちゃいます。
詳細: https://github.com/kin29/dj-kin29/pull/34/files
before
class DefaultController extends AbstractController { private AuthHandler $authHandler; private GetTopTrackService $getTopTrackService; private CreatePlaylistService $createPlaylistService; public function __construct( AuthHandler $authHandler, GetTopTrackService $getTopTrackService, CreatePlaylistService $createPlaylistService ) { $this->authHandler = $authHandler; $this->getTopTrackService = $getTopTrackService; $this->createPlaylistService = $createPlaylistService; }
after
class DefaultController extends AbstractController { public function __construct( private AuthHandler $authHandler, private GetTopTrackService $getTopTrackService, private CreatePlaylistService $createPlaylistService ) { }
このコード見てて気づきましたが、AbstractControllerをextendsするのやめたいなーと思いました。
👆のコードを見ての通り、6行もコードが減りました!!!スッキリさせたい私的には大変いい感じです。
慣れるまでは違和感がありましたが、実際に使ってみるとなんだかんだすぐ慣れそうな気がしました。
TypeScriptのコンストラクタの書き方と似てます 💡
ある日、突然MacでPHP7.4.9が使えなくなりました😭😭😭
結構ハマりましたが、お戻りになってきてくれました🙌
icu4cが69.1にあがってしまっていた。
→ brewで67.1を入れ直して、シンボリックリンクを貼ればok
$ php --version dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicudata.67.dylib Referenced from: /Users/user_xxx/.phpenv/versions/7.4.9/bin/php Reason: image not found Abort trap: 6
とりあえず/usr/local/opt/icu4c/lib/libicudata.67.dylib
が本当にないのか、
/usr/local/opt/icu4c/lib/
以下を確認。
→現在のシンボリックが69.1しかないので、67のシンボリックリンクを作りたい。。。🤤
$ ll /usr/local/opt/icu4c/lib/ total 137024 drwxr-xr-x 28 user_xxx staff 896 4 8 09:10 . drwxr-xr-x 12 user_xxx staff 384 5 27 17:27 .. drwxr-xr-x 6 user_xxx staff 192 4 8 09:10 icu -r--r--r-- 1 user_xxx staff 28672096 5 27 16:15 libicudata.69.1.dylib lrwxr-xr-x 1 user_xxx staff 21 4 8 09:10 libicudata.69.dylib -> libicudata.69.1.dylib -r--r--r-- 1 user_xxx staff 28665232 4 8 09:10 libicudata.a lrwxr-xr-x 1 user_xxx staff 21 4 8 09:10 libicudata.dylib -> libicudata.69.1.dylib -rw-r--r-- 1 user_xxx staff 2726984 5 27 16:15 libicui18n.69.1.dylib lrwxr-xr-x 1 user_xxx staff 21 4 8 09:10 libicui18n.69.dylib -> libicui18n.69.1.dylib ...
brew tap-new
とかbrew extract
を使うやり方をしらなくてハマりました。
$ brew tap-new kin29/taps #「kin29」の部分はなんでもokです Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/kin29/homebrew-taps/.git/ [main (root-commit) 58a4f09] Create kin29/taps tap 3 files changed, 88 insertions(+) create mode 100644 .github/workflows/publish.yml create mode 100644 .github/workflows/tests.yml create mode 100644 README.md ==> Created kin29/taps /usr/local/Homebrew/Library/Taps/kin29/homebrew-taps When a pull request making changes to a formula (or formulae) becomes green (all checks passed), then you can publish the built bottles. To do so, label your PR as `pr-pull` and the workflow will be triggered.
$ brew extract icu4c kin29/taps --version 67 ==> Searching repository history ==> Writing formula for icu4c from revision e2c833d to: /usr/local/Homebrew/Library/Taps/kin29/homebrew-taps/Formula/icu4c@67.rb
$ brew install kin29/taps/icu4c@67 ==> Installing icu4c@67 from kin29/taps ==> Downloading https://github.com/unicode-org/icu/commit/715d254a02b0b22681cb6f861b0921ae668fa7d6.patch?full_index=1 Already downloaded: /Users/user_xxx/Library/Caches/Homebrew/downloads/0dd175e315a7eee5f9fb42af4e03d2130e3a3aa130db4d2b32a58b1c88d87251--715d254a02b0b22681cb6f861b0921ae668fa7d6.patch ==> Downloading https://github.com/unicode-org/icu/releases/download/release-67-1/icu4c-67_1-src.tgz Already downloaded: /Users/user_xxx/Library/Caches/Homebrew/downloads/5652b331b5400231692d0879d41522870a20598d8771342b622d543c2ed99ca0--icu4c-67_1-src.tgz ==> Patching ==> Applying 715d254a02b0b22681cb6f861b0921ae668fa7d6.patch patching file source/common/uassert.h ==> ./configure --prefix=/usr/local/Cellar/icu4c@67/67.1 --disable-samples --disable-tests --enable-static --with-library-bits=64 ==> make ==> make install ==> Caveats icu4c@67 is keg-only, which means it was not symlinked into /usr/local, because macOS provides libicucore.dylib (but nothing else). If you need to have icu4c@67 first in your PATH, run: echo 'export PATH="/usr/local/opt/icu4c@67/bin:$PATH"' >> /Users/user_xxx/.bash_profile echo 'export PATH="/usr/local/opt/icu4c@67/sbin:$PATH"' >> /Users/user_xxx/.bash_profile For compilers to find icu4c@67 you may need to set: export LDFLAGS="-L/usr/local/opt/icu4c@67/lib" export CPPFLAGS="-I/usr/local/opt/icu4c@67/include" For pkg-config to find icu4c@67 you may need to set: export PKG_CONFIG_PATH="/usr/local/opt/icu4c@67/lib/pkgconfig" ==> Summary 🍺 /usr/local/Cellar/icu4c@67/67.1: 258 files, 71.8MB, built in 4 minutes 47 seconds
icu4c@67がインストールされたことを確認!
$ ll /usr/local/Cellar/ | grep icu drwxr-xr-x 4 user_xxx staff 128 5 27 16:15 icu4c drwxr-xr-x 3 user_xxx admin 96 5 29 18:04 icu4c@67
$ ll /usr/local/opt/ | grep icu4c lrwxr-xr-x 1 user_xxx admin 20 5 27 16:15 icu4c -> ../Cellar/icu4c/69.1 lrwxr-xr-x 1 user_xxx admin 23 5 29 18:09 icu4c@67 -> ../Cellar/icu4c@67/67.1 #今回追加分
ln -s [パス] [リンク名]
です。私はパスとリンク名の指定が逆と勘違いしていて、ハマりました💦
(間違えたらunlink [リンク名]
で削除できます。)
$ cd /usr/local/opt/icu4c/lib/ $ ln -s ../../../icu4c@67.1/67.1/lib/libicuio.67.1.dylib libicuio.67.dylib $ ln -s ../../../icu4c@67.1/67.1/lib/libicui18n.67.1.dylib libicui18n.67.dylib $ ln -s ../../../icu4c@67.1/67.1/lib/libicuuc.67.1.dylib libicuuc.67.dylib $ ln -s ../../../icu4c@67.1/67.1/lib/libicudata.67.1.dylib libicudata.67.dylib $ ln -s ../../../icu4c@67.1/67.1/lib/libicutest.67.1.dylib libicutest.67.dylib $ ln -s ../../../icu4c@67/67.1/lib/libicutu.67.1.dylib libicutu.67.dylib
シンボリックリンクが貼れていることを確認します。
$ ll /usr/local/opt/icu4c/lib/ | grep 67.dy lrwxr-xr-x 1 user_xxx staff 50 5 29 22:11 libicudata.67.dylib -> ../../../icu4c@67.1/67.1/lib/libicudata.67.1.dylib lrwxr-xr-x 1 user_xxx staff 50 5 29 22:09 libicui18n.67.dylib -> ../../../icu4c@67.1/67.1/lib/libicui18n.67.1.dylib lrwxr-xr-x 1 user_xxx staff 48 5 29 22:08 libicuio.67.dylib -> ../../../icu4c@67.1/67.1/lib/libicuio.67.1.dylib lrwxr-xr-x 1 user_xxx staff 50 5 29 22:09 libicutest.67.dylib -> ../../../icu4c@67.1/67.1/lib/libicutest.67.1.dylib lrwxr-xr-x 1 user_xxx staff 46 5 29 22:09 libicutu.67.dylib -> ../../../icu4c@67/67.1/lib/libicutu.67.1.dylib lrwxr-xr-x 1 user_xxx staff 48 5 29 22:09 libicuuc.67.dylib -> ../../../icu4c@67.1/67.1/lib/libicuuc.67.1.dylib
PHP7.4お戻りになってくれたー😭😭😭ありがとう🎊
php --version PHP 7.4.9 (cli) (built: Dec 26 2020 23:21:06) ( NTS ) Copyright (c) The PHP Group Zend Engine v3.4.0, Copyright (c) Zend Technologies with Zend OPcache v7.4.9, Copyright (c), by Zend Technologies with Xdebug v3.0.1, Copyright (c) 2002-2020, by Derick Rethans
助けてくれてありがとうございました🙇♂️
ref: https://www.tohuandkonsome.site/entry/2021/05/21/173612
メモな感じですが投稿します!(iwillblogって書いちゃったので…)
はじめてのニコニコ動画使用でした(会員登録はいつのまにかしてた)
景品が豪華すぎて当たった方うらやましいです😭
\スタッフ、スピーカーのみなさま、ありがとうございました🙇♂️/
他にも見たかったものやもう一回見たいセッションがいっぱいあるので、アーカイブ待ってます!
ノベルティめっちゃ良かったです、ホットアイマスク最高でした😏
エコバック今日の買い出しにも使いました。
カレーは緊急用にとっておっきます〜
きた!!ニコ生早く登録しよ pic.twitter.com/a9TzAbp5SV
— しがががが (@kin29ma_n) March 16, 2021
「fn」というワードはPHP7.4から予約語になったというのを知るに至った経緯として、$ symfony serve
でローカルサーバを立てて
$ symfony serve [OK] Web server listening The Web server is using PHP FPM 7.3.11 https://127.0.0.1:8000 [Web Server ] Jan 18 18:48:55 |INFO | PHP listening path="/usr/sbin/php-fpm" php="7.3.11" port=61746
ブラウザで表示確認をすると、以下の500エラーがでました😱
(phpenvでいろんなPHPバージョンを使ってます。)
HTTP 500 Internal Server Error syntax error, unexpected 'fn' (T_STRING), expecting :: (T_PAAMAYIM_NEKUDOTAYIM)
ParseError in /Users/xxx/my-project/vendor/laminas/laminas-code/src/Generator/ClassGenerator.php (line 480) 470 /** 471 * @param string $implementedInterface 472 * @return bool 473 */ 474 public function hasImplementedInterface($implementedInterface) 475 { 476 $interfaceType = TypeGenerator::fromTypeString($implementedInterface); 477 478 return (bool) array_filter( 479 array_map([TypeGenerator::class, 'fromTypeString'], $this->implementedInterfaces), 480 static fn (TypeGenerator $interface): bool => $interfaceType->equals($interface) 481 ); 482 }
よーく確認してみると、
「symfony php --version
と php --version
のバージョンが違う」
ことに気づきました💦
$ symfony php --version PHP 7.3.11 (cli) (built: Jun 5 2020 23:50:40) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.3.11, Copyright (c) 1998-2018 Zend Technologies $ php --version PHP 7.4.9 (cli) (built: Dec 26 2020 23:21:06) ( NTS ) Copyright (c) The PHP Group Zend Engine v3.4.0, Copyright (c) Zend Technologies with Zend OPcache v7.4.9, Copyright (c), by Zend Technologies with Xdebug v3.0.1, Copyright (c) 2002-2020, by Derick Rethans
そこで、$ symfony serve
でもPHP 7.4.9で動くように設定します。
参照:https://symfony.com/doc/current/setup/symfony_server.html#different-php-settings-per-project
$ cd my-project/ $ echo 7.4.9 > .php-version $ symfony php --version # PHP 7.3.11 -> 7.4.9に変更完了 PHP 7.4.9 (cli) (built: Dec 26 2020 23:21:06) ( NTS ) Copyright (c) The PHP Group Zend Engine v3.4.0, Copyright (c) Zend Technologies with Zend OPcache v7.4.9, Copyright (c), by Zend Technologies with Xdebug v3.0.1, Copyright (c) 2002-2020, by Derick Rethans $ symfony serve # PHP 7.4.9でサーバ立てることに成功 [OK] Web server listening The Web server is using PHP FPM 7.4.9 https://127.0.0.1:8000 [Web Server ] Jan 18 18:50:59 |INFO | PHP listening path="/Users/xxx/.phpenv/versions/7.4.9/sbin/php-fpm" php="7.4.9" port=62271
お! PHP7.4.9でサーバ立てるようになったみたいです!
と同時にsyntax error, unexpected 'fn' (T_STRING), expecting :: (T_PAAMAYIM_NEKUDOTAYIM)
のエラーもなくなりました🎉
めでたし、めでたし👏
参照:https://www.php.net/manual/ja/tokens.php
Google翻訳先生に訳してもらうと、
構文エラー、予期しない '楽しい'(t_string)、予期する::( t_pamaim_nikoodatim)
おそらく fn = 楽しい
って訳してくれてます💦
ググっていくと、「fn」はPHP7.4から予約語になったらしいです!
というかアロー関数(無名関数)が使えるようになり、その予約語としてfnを使います。
(風の噂でアロー関数が使えるようになったというのは知っていたのですが書き方まで知らなかったです😅)
アロー関数は
fn (argument_list) => expr
という形で記述します。
よって、PHP 7.4まではアロー関数がなかったために以下の該当箇所を、「::」を使うスコープ定義演算子 (::)のことではないですか?と教えてくれたのかもしれません。
static fn (TypeGenerator $interface): bool => $interfaceType->equals($interface)