今週の PHP 2022/06/25 〜 2022/07/01
PHP のメーリングリストから、気になった情報をピックアップします。
Internal
PHP: rfc:fetch_property_in_const_expressions
まず、前提知識として Enum には通常の Enum と、 Backed Enum の2種類が存在する。Backed Enum は Enum の各属性値に対してスカラーの値を設定することができる。
たとえば
enum StatusCode : int {
case HTTP_OK = 200;
case HTTP_NOT_FOUND = 404;
}
今回の RFC は PHP において const で Backed Enum の値を参照できるようにするというもの。
class Hoge {
const FOO = StatusCode::HTTP_OK->value;
}
議論が続いている
別の RFC で string の Enum に __toString
を自動で追加するやつがあったけど、あっちはみんな否定的なのに、なんでこっちはいいの?という意見があった。
Readonly な特殊な型である Enum を string に強制変換するのは、そもそも Enum の目的に外れている。
もともとの動機は、下記の ISSUE
つまり、attribute などで Backed Enumの値を参照したいけど出来ないというところ。それを許容するために、自動で文字列化することと、Enum の const で定義できるようにすることでは、わけが違うよという説明がなされていた。
完全に同意。
Enum の自動文字列化の RFC はこっち https://wiki.php.net/rfc/auto-implement_stringable_for_string_backed_enums
型の自動変換については、もうちょっと慎重に議論したいという流れが出来つつ有る
Vote開始 絶妙な Vote 具合
PHP: rfc:constants_in_traits
実装の PR が作られた
-> https://bugs.php.net/bug.php?id=75060 こちらの Request が閉じれるよ!と
PHP: rfc:random_extension_improvement
細かい実装方針の話合いが続いている。すでに先行する RFC は可決されているので、こちらは可決前提(多分)
PHP: rfc:auto-capture-closure
fn (parameter_list) {
statement_list;
}
アローファンクションでは、単一の式しかかけなかったので、複数の文を書けるようにしようという RFC
それじゃ、 function
が fn
になっただけか?と思ってしまいますが、アローファンクションと同様に、Auto capture by value されるので use を書く必要がなくなります。
by value です。
なので、作為的に &
をつけることで際どい性能向上を行ったり、Reference を前提としたコードには使えない
This approach would result in a waste of memory or CPU usag
というわけで、議論も尽きたし vote を始めようかなと言うコメントをした途端に議論が大盛り上がりしています。かなしいw
no arrow function changes, no explicit use support
PR https://github.com/php/php-src/pull/8330/files
Future Scope という目次が増えて、将来は use
を明示して Referrence を渡せるように拡張するかもみたいな話がのりました。
個人的には、アローファンクションは Referrence を取らないという一貫した挙動を維持してほしいなと思います。
ともあれ、vote が開始されています。採択されるかは、結構際どい情勢です。
Exception type hint · Issue #8843 · php/php-src
先週、RFC 出してねというコメントされていたやつですが、イシュー主がインターナルにメールしたので、話し合われています。
元メッセージは SPAM 判定されてるという...
そもそも例外は戻り値ではないのだから、union 表記で戻り値に混ぜるのは駄目だろうという話
Javaのチェック例外の表現に似ているという話
public static void call() throws Exception{
throw new Exception("メソッド内からのエラーです!");
}
この場合は、関数定義に throws という形で例外スローを明示しています。
C++ も昔は、このような機構を持っていたがやめたらしい(未確認)
動的言語で、チェック例外を関数定義で明示しているものは無いのではないか?と
Midori 言語のリードエンジニアによる例外に関するブログ記事が、参考になるのでみんな読めというコメントがあります。
今北産業すると
- Rare
- Strictly checked
- Have really good syntactic shorthand support.
これらの条件が揃わないと、チェック例外は地獄になるというお話でした。PHPはこれの対局にあるので、やめたほうがいいぜと。
チェック例外はつらいよ話のリンクがどんどん増える
Bugs
PDOStatement::execute
fails and returns false
without neither throwing an exception nor setting PDOStatement::errorCode
if many (~1000) query parameters are bound · Issue #8773 · php/php-src
MySQL PDO:
たくさんプレースフォルダーがあると、例外も吐かずに false が返ってくるというイシュー
なんと、MariaDB 側の不具合でした。パッチが出ているようなので、同様の不具合に遭遇した方は試してみると良さそう。
RW operation on readonly property doesn't throw with JIT · Issue #8863 · php/php-src
JIT 有効化されていると、readonly property に対する上書き操作でエラーが出ないというイシュー
修正 PR https://github.com/php/php-src/pull/8188
これは速やかに修正されて欲しいやつ。
Readonly properties mutable when assigning reference to them · Issue #7942 · php/php-src
Readonly Poperty なのに Reference を入れるといじれちゃうというイシュー
8.1.7 で修正されリリース
master にマージされました。
Referenceを使って、Readonly Property を編集しようとするとエラーになります。
Current bundled libgd has 15 CVEs, can it be upgraded at least in non-EOL PHPs? · Issue #8903 · php/php-src
libgd は 15 CVE(脆弱性)があるが、アップグレードせんのか?というイシュー
メモリー周りの問題があって、アップグレード出来ないとのこと
cmb69 さんって、libgd のコントリビューターでもあるのですね...
8.2-rc-alpine
· Issue #8899 · php/php-src
ext-sockets won't compile in official Docker image
socket 拡張のコンパイルがエラーになるというイシュー。8.2 の話なので大半の人には関係無さそう。
実際にはPHPというよりは、alpine というよりは、docker-php-ext-install の問題だった。
というわけで
で、これで Fix
こうやって、先々で細かい問題が解決されているおかげで、我々は簡単にPHPを使えるのだなと実感したイシュー
Magic with memory usage of array · Issue #8896 · php/php-src
var_export
が大きいメモリ領域を確保しているので、stringキャストを強制すると、メモリ使用量がすごく小さくなるというイシュー
イシュー...なのか?
memory 使用量は小さいほうがいいでしょということで、PR も出ている。
この修正は、 var_export
だけでなく json_encode
serialize
にも適用されるもよう。
もし現状、これらの関数でメモリ使用量に問題を抱えている場合は、このイシューに注目すると良さそう
Performance: only sort if more than 1 element · Issue #8887 · php/php-src
配列の要素数が1の場合は sort しないというアルゴリズムにすると 100〜200% 高速になるという報告
<?php
# faster
if ( count( $array ) > 1 ) {
sort( $array );
}
# slower:
sort( $array );
いやいや、PHPのソースコード内で、すでに行われているよと。 https://github.com/php/php-src/blob/master/ext/standard/array.c#L823
count 自体が独自 OPCode だから処理のオーバーヘッドが減るのかもしれないねとの指摘
Discussion