今週の PHP 2022/07/09 〜 2022/07/15
PHP のメーリングリストから、気になった情報をピックアップします。今週は、体力の限界によりバグ情報少なめとなっております。ご容赦ください。
Internal
PHP: rfc:random_extension_improvement
細かな実装面の話の調整が行われている。RFC 提出後に会話から決まってきた細かな仕様を正確に実装に落とすのは気を使う仕事だなと。ただただ感心&応援。
Windows PECL build machine died
Github Actions じゃまずいのか?という話について、バージョン間でコンパイル時に使われるコンパイル環境が異なってしまうのは避けたいという cmb さんのご意見
そして、2025 年までは少なくとも使えるサーバーをお持ちの方がスポンサーに名乗り出た。うまく行けば、しばらくは解決。
Character range syntax ".." for character masks
string - Native PHP functions that allow double-dot range syntax - Stack Overflow
..
を使うことで、文字列の範囲を示すことができる関数がある。こいつらは配列展開の演算子ではない。
これについて、PHPはこの ..
を引き続き継続して対応していくのか、うえの StackOverFlow で上げた以外に、これに対応している関数はあるのか?
単純な文字列範囲以外に実は隠れた書き方とかあるのか? ..
に適切な名前はあるのか?などなど
Rowanさんの返信は納得感あり
in a technical sense, this is not an operator in the language, which takes two values or expressions and produces a new value. Rather, it's a convention used inside certain functions, to interpret a string argument in a special way.
要するに、これは演算子ではない。2つの値を受け取って新しい値を作り出すものではない。
というより、これは特定の関数で、特定の文字列が特別に解釈されるという習わしだ!と
組み込み文法のようなもので、正規表現みたいなものだよ。と。
会話の流れとしては、まあこれ以上、こういう微妙な立ち位置のものを増やしたいという意思はない。
ただ、これが使える場所を全部教えてくれというのは無理がある。(拡張で入ってきている可能性も有るので、意図しない場所で使える可能性がある)
名称については、character ranges
はどうかな?と
実装は、php_charmask
少なくともドキュメンテーションは、改善される必要が有りそう。
Removing Travis CI
Travis CI はそんなに使われてないみたいだから、やめませんか?という話
ビルドについて、インターナルから得られた情報をまとめると
- Github Actions
- Azure Pipelines + Appveyor + Circle CI
- Travis CI
の 3系統がある、これについて 1でカバーできているから、3はいらなくない?という提案がされた。
Nikita の回答によると
Tracivs CI -> aarch64 and s390x
Circle CI -> FreeBSD
それぞれ、このCIじゃないとテストできない環境が有るから残っているとのこと。これは様々な環境で使われる OSS のツラミですね......
というわけで、Travis CI はやめられない。
ちょうど zeriyoshi さんが s390x で引っかかっていました。
大事なんだなと思いました。
PHP: rfc:constants_in_traits
投票フェーズに入ってから、大いに盛り上がる議論。
今週に入って、肯定的な意見が相次ぐ、RFCをよく読めと。
極めて保守的な提案がされている、現状がより悪くなる要素はないぞと。
五十嵐さんからは、Trait の必要性について gist が投稿されていた。
引き続き、実に丁寧な議論で、ご本人による要約は以下の通り
- Provide a default implementation of an interface
- Achieve multiple inheritance
- Split class implementations between machine-generated and handwritten, etc.
- Port code from other languages that have similar mechanisms to trait
- Share implementations of classes coincidentally having the same functionality
これらを達成するための、代替手段が将来的に提案されるかもしれないが?現状の改善手段として、今出来る Trait の機能拡張を支持して欲しいという内容。
Nikita さんからは、現状の Trait は極めて気に入っていないが、今回の RFC の内容と同等のことを実現するために、より悪い手段を取っているケースを鑑みて、賛成であるということ。
また、今回の RFC は Trait に対する恣意的な制限の排除や、一貫性の維持であるので、問題なしとも。
2年前に Trait constants について internal に問いかけていた Stephen さんも参戦
「びっくりした。みんな、めちゃくちゃ Trait 嫌いじゃん...。」と
Trait constants - Externals https://externals.io/message/110741
参考として Larry Garfield さんの書かれた以下のリンクを上げてくれている
長くなってしまうので、上記リンクの中身について、最後に余談で書きます。
現状の Vote 状況は、追い風を受けて 23:12 (65.7%) というわけで、1%足りない!!!
投票権をお持ちの方がいらっしゃいましたら、是非 RFC を読んでいただいて Vote 頂けたらと思います!
2022-07-16 8:45 (JST) 現在
Bugs
MySQLi: SSL certificate verification fails (port doubled) · Issue #8978 · php/php-src
SSL 接続時に host 名に port を入れると port 番号が ダブルで指定されて認証失敗するというもの。
SSL 接続時でなければ成功するので、これはバグと認定された。
SSL 接続に関してはメモリーリークに関するイシューも上がってきている。これからの時代にホットになりそうなトピック
Possible Memory Leak with SSL-enabled MySQL connections · Issue #8979 · php/php-src https://github.com/php/php-src/issues/8979
error_log on Windows can hold the file write lock · Issue #8923 · php/php-src
レースコンディションにて、Windows で error_log 関数がファイルの書き込みロックを保持してしまうというもの。
すでに、他の関数では対応されているので、同じ対応を error_log にも入れてよと言われている。
Assertion failure with tracing JIT · Issue #9011 · php/php-src
zeriyoshi さんが見つけたやつ
余談
3点ドットの話
PHP の ... (3点ドット, Three Dots) の種類,全部言えるかな? - Qiita https://qiita.com/mpyw/items/835050cbb5ad8a4c0710
PHP 5.6 から可変個引数関数
PHP 7.4 からスプレッド演算子
PHP 8.0 から任意の数の引数を ...
で置き換えられるように
PHP: New Features - Manual https://www.php.net/manual/en/migration80.new-features.php
PHP 8.0 からは文字列をキーにもつ配列も Array Unpacking 可能に
Beyond Abstract classes | GarfieldTech
Trait は要するに。
compile-time copy-paste
two kinds of code reuse: interface reuse and code reuse
Interfaces
"can behave as a" (CBAA)
"this object can be treated as a... and I won't promise anything else."
インタフェースは、CBAA のみ
Classic inheritance
"is a" relationship
single-inheritance
But is the "is a" relationship interface reuse or code reuse? That's the problem: It's a little of each.
class inheritance implies CBAA and code reuse.
単一継承は CBAA とコード再利用の両方をちょっとずつ達成している。
Abstract classes
it's both a class and an interface at the same time
it's both "can behave as" and "is a special case of"
これは CBAA と is a special case の両方を達成している
でもって、Abstract class ってやつは、2つの問題があって、
- Abstract内に書かれたコードの再利用は継承先でしか使えない。
- 関係に問題がある。 MyLogger クラスは AbstractLogger クラスではなし。特別なケースとは言えそうだが...それでもちょっと表現がおかしい。
でもって、本題は、「Abstract class は Trait と Interface を使うことで書き直せるよね?」と、こうすることで一個しか使えない大切な継承を使わないで、CBAA と コード再利用の両方を達成できる。
Any abstract class may be represented as a trivial intersection of an interface and a trait that happens to fulfill that interface.
as of PHP 5.4, abstract classes are vestigial and should not be used
そうか、Abstract クラスを使うときに感じる違和感というか、嫌な感じはこれだったのかと納得する内容でした。Trait が Compile-Time コピペである以上、嫌に感じる人はたくさんいるだろうし、過剰に複雑な状態を作り出すことも考えられるけど、適切に使えれば(それが難しいんだが)、非常に強いコード再利用ツールになりますね。
Discussion