💬

今週の PHP 2023-04-08 〜 2023-04-14

2023/06/01に公開

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

Internal

Moving PHP internals to GitHub - Externals

PHP internals を GitHub に移動するのはどうでしょうか?というお便り。
コミュニティにとって、大規模な変更になるのでRFCプロセスも行いますよという話。

確かにメーリングリストというのは、最近の若者からしたら、よく分からない風習という気もします。

メーリングリスト派と、Githubディスカッション派で様々な議論がある中で、ウェブフォーラムソフトウェアを使うのはどうかしら?みたいな意見もでています。

現状のやり方はじゃっかん古臭いことを認めつつ、良い方向に進んでいくと良いですね。

PHP internals において、近年メーリングリストでの議論が少し暴力的な表現になってしまったり、思いやりが欠けていたりということが多かったので、お役立ちリンクだよ!っていうお便りです。

Stack Overflow の room 11

たまに眺めてはいたのですが、実は room 11 のルールが合ったんですね。

https://room-11.github.io/

その他、英語の能力について、みんな過信してはいけないよ。丁寧にコミュニケーション取ろうねということが書かれていました。

Brainstorming idea: inline syntax for lexical (captured) variables - Externals

匿名クラス内から、外部の変数をキャプチャできるようにするアイデアについてのスレッドです。
いわゆるクロージャー的な変数バインディングについてのアイデアです。

Javascriptの場合は、プロトタイプチェーンとかで、自動で参照先を決められるような仕組みだったと思いますが、PHPには同様の考えがないと思うので、レキシカルスコープをどうやって決めるのかなどの問題がありそうです。

※レキシカルスコープは、関数を定義した段階で決まるスコープです。

PHPでもアロー関数においては、親のスコープの変数を自由に使うことができています。

PHP: アロー関数 - Manual

PHPの変数スコープは、明示的でわかりやすいのが特徴だと思いますが、匿名クラスなどを考慮にいれて拡張していくと、どんどん複雑になりそうですね。(つまり、この手の考えは忌避されそう)

リリース

First class callable syntax for instance methods - Externals

ファーストクラスコーラブルを、インスタンスメソッドに対しても生成できるように使用というお便り。質問者さんがサンプルとして上げてくれたコードは以下です。

<?php

class Verification {
    public function __construct(private string $id) {}

    public function getId(): string
    {
        return $this->id;
    }
}

$items = [new Verification('1-2-3-4')];

array_map(Verification::getId(...), $items);

現状では、実行時にエラーになります。

PHPのファーストクラスコーラブルは、インスタンスメソッドについても作成可能ですが、その場合は特定のインスタンスであることを明示する必要があります。

PHP: 第一級callableを生成する記法 - Manual


<?php  
  
class Foo {  
public function method() {}  
}  
  
$obj = new Foo();  
$f = $obj->method(...);

一番最初のサンプルも下記の記法なら問題ありません

array_map(static fn (Verification $v) => $v->getId(), $items);

今回の提案がPHPの文法として記述できるようにするには、インスタンス化しないでも利用できるインスタンス化語のメソッドを利用するという文法がないと難しそうですね。this とかが上手に使えるようになるといいのかもしれませんが。

できたとしても、それほど記述量は変わらないので、個人的にはそんなに興味ないです。

Possible RFC: $_SERVER['REQUEST_TIME_FLOAT'] - Externals

スーパーグローバル変数 $_SERVERREQUEST_TIME_HR を追加したいというお便り。

hrtime と microtime は、そもそも利用用途が違うのでは?と思いましたが、投稿主も同様の気付きがあったらしく、そこで質問は止まりました。

[RFC] Last chance to discuss "Use exceptions by default in SQLite3 extension" before vote - Externals

SQLite3 拡張において、例外をデフォルトで利用するというRFCの投票のお知らせ。

https://wiki.php.net/rfc/sqlite3_exceptions#vote

この記事を書いているのが、だいぶ遅い関係で、すでに投票結果は出ていて、受理されています。

[RFC] PHP Technical Committee - Externals

PHPテクニカルコミッティー(技術委員会)の導入提案です。

開発者間での技術的衝突が起こった際の適切な意思決定を行うためのようです。
ちゃんと人の意見に耳を傾けるタイプの人を技術委員会として選定して、理性的な議論を保とうということらしい。

国連みたいなことだろうか...

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

技術委員会のメンバーは選挙で選ぶと書かれています。すでに投票は行われていて、ガッツリ否決されています。

というわけで、メーリングリスト体制はまだまだ続く。

PHP Modules - Externals

PHPモジュールという考え方の導入についてのスレッドです。

Javascriptのモジュール同様に import することで有効になり、外界の影響を受けない。かつテンプレートとして評価されないなどの特徴を備えるようです。

個人的には、既存のPHPの composer モジュールとの棲み分けがよく分からなかったです。より強固にカプセル化された部品というイメージなのでしょうか。

Array spread append - Externals

配列のスプレッド演算子を、配列の追加でも使えるようにしたいというお便り。

色々紆余曲折ありましたが、元となった PoC もクローズされまして、無かったことになりました。
スプレッド演算子の意味的な話と、パフォーマンスの話などが懸念点としてあげられていました。
基本的には、明示的(explicit)であることが好まれるので、少し見た目が奇妙に見えたり、スプレッド演算子本来の意味とイメージが異なる形になると、拒否反応が強くなるのかもしれません。

RFC [Discussion]: Make unserialize() emit a warning for trailing bytes - Externals

unserialize 関数が、不要な末尾のバイトを検知をした際にワーニングを出すというRFCのスレッドです。

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

こちらも、記事執筆のタイミングの問題で、すでに受理されています。当然その方が良いという挙動なので、順当かと思います。

将来的には例外を出すという挙動に向かうようです。

Bugs

stream_copy_to_stream's $offset argument is unclear · Issue #2414 · php/doc-en

stream_copy_to_stream$offset 引数が不明確だというイシュー
質問者の方は、自分でファイルポインタの位置を計算して指定する必要があると思っていたので、ftell でポインタの場所を取得して設定していました。

正しくは、現在位置からの相対ポジションなので、すでにftellされているので同義です。

というわけで、ドキュメントをわかりやすく修正することに。

http value changed to https inside variable on SSL website · Issue #11069 · php/php-src

こういう出力を行うと、http -> https に変更されるというイシュー

<?php
$a = "http only site http://abc.com";
print_r($a);

そんな馬鹿な!と思ったら、質問者さんの proxy サーバーが変更していたようです。暗号化された接続しか許さないようにしているんですね。その環境だと、apt の一部 repository とか、使えないかもなと思ったり。

intl TZData version not displayed anymore · Issue #11071 · php/php-src

$ php --ri intl

intl 拡張のバージョン情報を出力するコマンドでワーニングがでているというイシュー。--ri オプションの存在をしりませんでした。修正自体は簡単なやつでした。

Add benchmarking to CI by iluuu1994 · Pull Request #11068 · php/php-src

ベンチマーキングを追加するというイシュー。このPRによって、下記のリポジトリにベンチマークデータが貯まるようになっています。

https://github.com/php/benchmarking-data/commits/main

phpの修正に伴って、どの修正でどんな性能劣化が起きたのか分かるという。うちの会社のソースコードもこういうのやろうって思いました。

Discussion