🗂

今週の PHP 2022/06/25 〜 2022/07/01

2022/07/02に公開

PHP のメーリングリストから、気になった情報をピックアップします。

Internal

PHP: rfc:fetch_property_in_const_expressions

https://wiki.php.net/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

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

つまり、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

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

実装の PR が作られた

https://github.com/php/php-src/pull/8888

-> https://bugs.php.net/bug.php?id=75060 こちらの Request が閉じれるよ!と

PHP: rfc:random_extension_improvement

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

細かい実装方針の話合いが続いている。すでに先行する RFC は可決されているので、こちらは可決前提(多分)

PHP: rfc:auto-capture-closure

https://wiki.php.net/rfc/auto-capture-closure

fn (parameter_list) {
    statement_list;
}

アローファンクションでは、単一の式しかかけなかったので、複数の文を書けるようにしようという RFC

それじゃ、 functionfn になっただけか?と思ってしまいますが、アローファンクションと同様に、Auto capture by value されるので use を書く必要がなくなります。

by value です。

https://3v4l.org/cTjsX#v8.1.7

なので、作為的に & をつけることで際どい性能向上を行ったり、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

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

先週、RFC 出してねというコメントされていたやつですが、イシュー主がインターナルにメールしたので、話し合われています。

元メッセージは SPAM 判定されてるという...

そもそも例外は戻り値ではないのだから、union 表記で戻り値に混ぜるのは駄目だろうという話

Javaのチェック例外の表現に似ているという話

public static void call() throws Exception{
    throw new Exception("メソッド内からのエラーです!");
}

この場合は、関数定義に throws という形で例外スローを明示しています。

C++ も昔は、このような機構を持っていたがやめたらしい(未確認)
動的言語で、チェック例外を関数定義で明示しているものは無いのではないか?と

Midori 言語のリードエンジニアによる例外に関するブログ記事が、参考になるのでみんな読めというコメントがあります。

http://joeduffyblog.com/2016/02/07/the-error-model/

今北産業すると

  1. Rare
  2. Strictly checked
  3. Have really good syntactic shorthand support.

これらの条件が揃わないと、チェック例外は地獄になるというお話でした。PHPはこれの対局にあるので、やめたほうがいいぜと。

https://www.artima.com/articles/the-trouble-with-checked-exceptions

チェック例外はつらいよ話のリンクがどんどん増える

Bugs

MySQL PDO: 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

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

たくさんプレースフォルダーがあると、例外も吐かずに false が返ってくるというイシュー

なんと、MariaDB 側の不具合でした。パッチが出ているようなので、同様の不具合に遭遇した方は試してみると良さそう。

https://jira.mariadb.org/browse/MDEV-27937

RW operation on readonly property doesn't throw with JIT · Issue #8863 · php/php-src

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

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

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

Readonly Poperty なのに Reference を入れるといじれちゃうというイシュー

https://3v4l.org/qiDTk#v8.1.6

8.1.7 で修正されリリース

master にマージされました。

https://3v4l.org/qiDTk/rfc#vgit.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

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

libgd は 15 CVE(脆弱性)があるが、アップグレードせんのか?というイシュー

メモリー周りの問題があって、アップグレード出来ないとのこと

https://github.com/libgd/libgd/pull/692

cmb69 さんって、libgd のコントリビューターでもあるのですね...

ext-sockets won't compile in official Docker image 8.2-rc-alpine · Issue #8899 · php/php-src

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

socket 拡張のコンパイルがエラーになるというイシュー。8.2 の話なので大半の人には関係無さそう。
実際にはPHPというよりは、alpine というよりは、docker-php-ext-install の問題だった。

https://github.com/docker-library/php/blob/f275451/Dockerfile-linux.template#L257

というわけで

https://github.com/mlocati/docker-php-extension-installer/issues/582

で、これで Fix

https://github.com/mlocati/docker-php-extension-installer/pull/590/files

こうやって、先々で細かい問題が解決されているおかげで、我々は簡単にPHPを使えるのだなと実感したイシュー

Magic with memory usage of array · Issue #8896 · php/php-src

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

var_export が大きいメモリ領域を確保しているので、stringキャストを強制すると、メモリ使用量がすごく小さくなるというイシュー
イシュー...なのか?

https://github.com/php/php-src/pull/8902

memory 使用量は小さいほうがいいでしょということで、PR も出ている。

この修正は、 var_export だけでなく json_encode serialize にも適用されるもよう。

もし現状、これらの関数でメモリ使用量に問題を抱えている場合は、このイシューに注目すると良さそう

Performance: only sort if more than 1 element · Issue #8887 · php/php-src

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

配列の要素数が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