🐕

今週の PHP 2023-02-04 〜 2023-02-10

2023/02/11に公開

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

Internal

[RFC] [Discussion] Typed class constants - Externals

以前にもトライされていた型付のクラス定数について、実装の問題点が解決したので、再チャレンジというお便り。

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

現在、追加で細かい調整の議論がされています。基本的には、好意的に受け止められているという印象です。

Official Preprocessor - Externals

先週から引き続き、公式プリプロセッサーについての議論。

今週も議論が続いています。

なんだか、TypeScript を PHP にトランスパイルするという、ちょっと議論の方向性がよくわからない感じですが、継続的にウォッチ

[RFC] [Vote] Readonly amendments - Externals

Readonly の軌道修正 RFC について、投票が終わりました。

結果は、提案2つのうち、1つだけ可決となりました。

PHP: rfc:readonly_amendments

却下された提案は、Readonly クラスを通常クラスが継承できるというものでした。正直言って、Readonly が継承の仕組み内に現れたら、もう制御が難しすぎて人間には理解できそうにないなと思っていたので、こちらは想定内。

その代わりとして、clone 時にプロパティの再設定が出来るようにすることは、可決となりました。

特にライブラリ作者の方々などが、clone 時の再設定について熱望していたので、よい結果かなと思います。

RFC Proposal - Types for Inline Variables - Externals

変数宣言に型をつけようという RFC 提案についてです。

3年前にも同様の提案は、RFC が作られていたようです。

PHP: rfc:declare_vars

目的はコードの安全性を高めるためという目的で導入したいということです。

今回用の新しい RFC も作られました。

PHP: rfc:local_variable_types

現在来ているコメント

  • ローカル変数の型チェックを行うとパフォーマンスに影響がでる
  • BCブレークになる(any のようななんでもない型が必要になるだろうか?)
  • PHP_MAX_INT に +1 すると float になるような、ユニオン型も必要になる
  • 型付の配列や、ジェネリクスを導入していくのなら、型付変数は必要になると思う

などなどです。個人的には関数シグネチャーでの型チェックだけで、意外と満足しているので、さらにすべての変数に型をつけられる必要があるかどうかは、私は分からないです。PHPという言語においては、むしろ、変数に型が無いことが利点になっていることが多そうなので、この RFC はどう決着するのか楽しみです。

こうすれば、今でも出来るよという実装例も出てきました。& 付きの関数にするとできるんですね。コレは面白い。

https://3v4l.org/T6GFS

'Uninitialized' creates a lot of cluttering - Externals

イシューから発展してきた、Uninitialized State についてのお便りです。

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

発言では、8系の Typed Property は初期化されているかどうかを isset で検査する必要があるという風に書かれています。
実際には、型付プロパティ 7.4 から入った機能です。

べき論で言うならば、完全コンストラクタになっていれば、初期化されていないプロパティは無いから大丈夫みたいな話になるのですが、型付プロパティが持つ状態に、未初期化が存在するというのは、特に PHP に入ってきたばかりの人にはなじまないのかもしれないです。

uninitialized は、定義済みではあるが値が入っていないということに明確に表している状態であり、かつちゃんとエラーメッセージもでるので便利だなと思いました。

[VOTE] include cleanup - Externals

ちょっと、コミュニーケーションが熱くなってしまっていて、もう無理かもしれんという感じです。Vote もほぼほぼ否決方向です。

RFC proposal: values getter in BackedEnum - Externals

BackedEnum に関するお便り

BackedEnum の値だけの配列を取得するのが結構面倒くさい。なので values() というゲッターを追加しようというお話。

現状でも、\BackedEnum::cases() 静的メソッドを使うことで、case すべての配列を取得することはできるので、例えば下記のような書き方で取得することは可能です。

<?php
enum Animal: int
{
    case Cat = 1;
    case Dog = 2;
}
$enumValues = array_column(Animal::cases(), 'value');
print_r($enumValues);
$nameToValue = array_column(Animal::cases(), 'name', 'value');
print_r($nameToValue);

出力

Array
(
    [0] => 1
    [1] => 2
)
Array
(
    [1] => Cat
    [2] => Dog
)

個人的な意見としては、values() というものは、無いほうが良いと感じます。上の例の $nameToValue などは、かなり限られた場所で使ってほしい代物です。(チェックボックスとか、ラジオボタンの表示など)
連想配列や、配列は enum ではないので、検査が行われない弱い括りになると思います。 というわけで、まあ、いらないんじゃないかなぁ。

How to deal with bugs in vendored libraries? - Externals

拡張系の不具合に対して、どう対応したら良いですか?というお便り

  1. c99 の古い整数チェックを削除する PR を送って、マージされた。
  2. 同様に timelib にも PR 送ったけど、理由もなくクローズされた。
  3. 最初の PR も直接 Push で元に戻された

この3について、投稿者の方は、かなり怒っているようでしたが、timelib 側の変更は php-src に同期されるようになっているようなので、サイレント push ではないよという解説が入りました。

善意で始まった行動ではあると思うので、動機自体はピュアだったと思うので、コミュニティと上手くつきあってくれるようになると良いなと思います。

Bugs

8.2.2: segfault when garbage collector is invoked inside of fiber · Issue #10496 · php/php-src

Fiber 内で GC すると、Seg V になるというイシュー。Fiber の細かい不具合潰し案件です。

Cannot directly modify an object stored in a constant · Issue #10497 · php/php-src

const キーワードがつけられた変数にオブジェクトを格納するおt,直接編集することができないというイシュー
そもそも、正しい挙動がよくわからないけど、イシューに上がっている、OK例、NG例が面白い

OK のパターン

<?php
const a = new stdClass;
$_ = a;
$_->b = 42;
var_dump(a); // it works

<?php
const a = new stdClass;
constant('a')->b = 42;
var_dump(a); // it works

NG のパターン

<?php
const a = new stdClass;
a->b = 42;
var_dump(a);

Metaphone cleanup by nielsdos · Pull Request #10501 · php/php-src

metaphone って初耳です。

https://www.php.net/manual/ja/function.metaphone.php

英単語の発音で、似ているものは似たキーが変えるという関数らしい。

この PR は、そんな Metaphone のパフォーマンス改善。Alpine Linux で Metaphone の実行が遅いということに起因しているようです。

array_unique: add way to compare items with an identity check (``===``) · Issue #10526 · php/php-src

array_unique に関するお便り

<?php
var_dump(array_unique([1, "1"], SORT_REGULAR));

上記のコードは [1] をアウトプットします。[1,"1"] じゃないの?という話です。
似たような話がどっかでもあったような気がしますが、厳密な array_unique はできないのか?ということです。

仕様としては array_unique は内部で == を使って比較を行っているので、正しい挙動です。
ドキュメントにも書かれています。

phpversion · Issue #10543 · php/php-src

知らなかったですシリーズ。 phpversion という関数。引数にモジュール名が入れられて、場合によって返却値が PHP のバージョンじゃないことがある。

https://3v4l.org/psXP2#v8.0.27

このバージョン番号に、PHP のバージョンを入れるのか、拡張のバージョンをいれるのかは、拡張側のチョイスだから、これは期待された結果だという回答が remi さんから来ていた。

Single backslash triggers autoloading with empty string · Issue #10550 · php/php-src

class_exists('\\')string(0) "" と出力されるという不具合報告

https://3v4l.org/RPQ95

不具合というよりは、一貫性のなさという部分でしょうか。空文字を与えた場合は、出力なしなので、同じようにバックスラッシュのみを与えられた場合は、出力なしが良いだろうという話です。

Discussion