😺

今週の PHP 2022/07/09 〜 2022/07/15

2022/07/16に公開

PHP のメーリングリストから、気になった情報をピックアップします。今週は、体力の限界によりバグ情報少なめとなっております。ご容赦ください。

Internal

PHP: rfc:random_extension_improvement

https://wiki.php.net/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
https://stackoverflow.com/questions/72865138/native-php-functions-that-allow-double-dot-range-syntax

.. を使うことで、文字列の範囲を示すことができる関数がある。こいつらは配列展開の演算子ではない。
これについて、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 はどうかな?と
https://github.com/php/php-src/blob/php-8.1.8/ext/standard/string.c#L689
実装は、php_charmask

少なくともドキュメンテーションは、改善される必要が有りそう。

Removing Travis CI

Travis CI はそんなに使われてないみたいだから、やめませんか?という話

ビルドについて、インターナルから得られた情報をまとめると

  1. Github Actions
  2. Azure Pipelines + Appveyor + Circle CI
  3. Travis CI

の 3系統がある、これについて 1でカバーできているから、3はいらなくない?という提案がされた。

Nikita の回答によると

Tracivs CI -> aarch64 and s390x
Circle CI -> FreeBSD

それぞれ、このCIじゃないとテストできない環境が有るから残っているとのこと。これは様々な環境で使われる OSS のツラミですね......

というわけで、Travis CI はやめられない。

ちょうど zeriyoshi さんが s390x で引っかかっていました。

https://twitter.com/zeriyoshi/status/1546835004306898944

大事なんだなと思いました。

PHP: rfc:constants_in_traits

https://wiki.php.net/rfc/constants_in_traits

投票フェーズに入ってから、大いに盛り上がる議論。

今週に入って、肯定的な意見が相次ぐ、RFCをよく読めと。
極めて保守的な提案がされている、現状がより悪くなる要素はないぞと。

五十嵐さんからは、Trait の必要性について gist が投稿されていた。

https://gist.github.com/sj-i/7981487f879bd9aad8f57a931de1591e

引き続き、実に丁寧な議論で、ご本人による要約は以下の通り

  • 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 さんの書かれた以下のリンクを上げてくれている

https://www.garfieldtech.com/blog/beyond-abstract

長くなってしまうので、上記リンクの中身について、最後に余談で書きます。

現状の 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

https://github.com/php/php-src/issues/8978

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

https://github.com/php/php-src/issues/8923

レースコンディションにて、Windows で error_log 関数がファイルの書き込みロックを保持してしまうというもの。

すでに、他の関数では対応されているので、同じ対応を error_log にも入れてよと言われている。

Assertion failure with tracing JIT · Issue #9011 · php/php-src

https://github.com/php/php-src/issues/9011

zeriyoshi さんが見つけたやつ

https://twitter.com/zeriyoshi/status/1547544071417507841?s=20&t=uk4GNwVDwUQ7T_e5xoBnjw

余談

3点ドットの話

PHP の ... (3点ドット, Three Dots) の種類,全部言えるかな? - Qiita https://qiita.com/mpyw/items/835050cbb5ad8a4c0710

PHP 5.6 から可変個引数関数
https://www.php.net/manual/en/functions.arguments.php#functions.variable-arg-list

PHP 7.4 からスプレッド演算子
https://wiki.php.net/rfc/spread_operator_for_array

PHP 8.0 から任意の数の引数を ... で置き換えられるように
PHP: New Features - Manual https://www.php.net/manual/en/migration80.new-features.php

PHP 8.0 からは文字列をキーにもつ配列も Array Unpacking 可能に
https://www.php.net/manual/en/language.types.array.php#language.types.array.unpacking

Beyond Abstract classes | GarfieldTech

https://www.garfieldtech.com/blog/beyond-abstract

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つの問題があって、

  1. Abstract内に書かれたコードの再利用は継承先でしか使えない。
  2. 関係に問題がある。 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