🗂

今週の PHP 2023-04-01 〜 2023-04-07

2023/05/22に公開2

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

Internal

[RFC][Vote] Arbitrary static variable initializers - Externals

PHP: rfc:arbitrary_static_variable_initializers

満場一致で受理されました。

static キーワードを使った変数宣言で関数を使った初期化が出来るようになります。

<?php

function bar() {
    echo "bar() called\n";
    return 1;
}
 
function foo() {
    static $i = bar();
    echo $i++, "\n";
}
 
foo();
foo();
foo();

まだ実行できないですが、そのうち下のコードは実行できるようになるでしょうl.

https://3v4l.org/bAFd9/rfc#vgit.master

[IDEA] allow extending enum - Externals

そのまんまですね。Enum を継承したいぜ!というお便り

列挙型から Finality を削除すると、前提が大幅に狂ってしまうから、だめなのでは?というコメントがありました。なるほどという感じ。

Enum は制限することが目的なのだから、列挙の継承は行えないようにした上で、union 型を使うことで、列挙A|列挙Bという表現を使えば、継承は必要ないし、アプローチとして正しいという意見があり、なるほど感。

やったことなかったけど、Enum で interface を実装できるんですね。

https://3v4l.org/tKtQ0#v8.1.19

途中で出てきた良さそうな読み物

Property Hooks Discussion - Externals

PHP: rfc:property-hooks

TLの皆さんが激アツと評していたRFCです。私はまだこの重大性がピンときてません。

PHP 8.2 では、constructor property promotion が出来るようになりました。記述が短くできます。

<?php
class User 
{
    public function __construct(public string $name) {}
}

ただ、上の $name に追加の振る舞いを行いたい場合、困るよね?と

  1. getter, setter を追加する
  2. __get __set のマジックメソッドを利用する

ただ、getter, setter の場合は、プロパティに直アクセスしている既存コードの修正が必要だし、マジックメソッドを使った場合は、プロパティ名を指定した冗長なコードを書かないと行けないですし、複数プロパティが存在する場合は、それぞれの振る舞いを条件分岐なりで表現する必要がある。

property hook だと...

class User 
{
    public string $name {
        set {
            if (strlen($value) === 0) {
                throw new ValueError("Name must be non-empty");
            }
            $field = $value;
        }
    }
 
    public function __construct(string $name) {
        $this->name = $name;
    }
}

こんな感じで、特定プロパティに対する追加挙動を個別に定義できます。set, get の双方を定義できます。

interface でも指定できる

interface Named
{
    // Objects implementing this interface must have a readable
    // $fullName property.  That could be satisfied with a traditional
    // property or a property with a "get" hook.
    public string $fullName { get; }
}
 
// The "User" class above satisfies this interface, but so does:
 
class SimpleUser implements Named
{
    public function __construct(public readonly string $fullName) {}
}

便利じゃん!!!

マジックメソッド不要で、複雑性の追加なしに明示的にプロパティへの挙動を追加できるのは実に便利そう。記述量が減りそう。良さそう!

応援していきたい Proposal です。

Bugs

PoC: Allow catching "Non-abstract method must contain body" compile errors by iluuu1994 · Pull Request #10997 · php/php-src

Non-abstract method must contain body をキャッチできるようにしようというPoC
コンパイルエラーを例外機構でキャッチできるのはナイスだよね〜ということで、取り込まれそうです。

PHPとして対処不能なエラーが減れば減るほど、PHP自体の安定性が増します。

Incorrect behavior of literal value of PHP_INT_MIN · Issue #2400 · php/doc-en

PHP_INT_MINに-をつけたら、指数表現になるのはおかしいじゃん?というお便り。

整数にマイナスをつけた負数表現は、数値を負数化するため、PHP_INT_MINの桁あふれを起こすよね。という話。

ドキュメントに修正を入れて、わかりやすくしましょうという方向になりました。

PHP silently ignores FPM pool configuration errors · Issue #11000 · php/php-src

php-fpm の設定ミスが合ったときに無視しないで欲しいというイシュー。PHP 8.2 で ini 周りの修正があったので、きっと8.2なら大丈夫という返答。

こちらは修正が行われた関連イシュー

PHP does not report invalid values for file sizes and interpret them incorrectly · Issue #7860 · php/php-src

Add ngx-php to opcache supported sapis by joanhey · Pull Request #11013 · php/php-src

ngx-php を OPcache でサポートするSAPIとして登録しようというイシュー。マージされました。
知らなかったんですが、ZendAccelerator.cに許可SAPIとして登録しないとだめなんですね。

Revert refactoring by dstogov · Pull Request #11008 · php/php-src

Make /dev/random available as source for randomness via configuration · Issue #11024 · php/php-src

/dev/urandom しかサポートされてない!/dev/randomもサポートしてよ!というイシュー。

zeriyoshi さんから丁寧な回答

In most cases, PHP does not use /dev/urandom directly. It uses the secure method provided by the OS or libc to generate random numbers. It will only use /dev/urandom if they are not available at all.

Assuming such a situation occurs, /dev/random will provide "blocking" random numbers. In other words, if the random number source runs out, using /dev/random may result in blocking even for PHP.

Many implementations guarantee that /dev/urandom is "non-blocking" and of sufficient random number quality, so there is no need to change it.

dev/random は Blocking API だから旨味はないですよ。/dev/urandom はよりセキュアな乱数実装が利用不可能だった場合のみに使われるフォールバックですよ。という説明。

確かに、これを考慮すると、/dev/randome をサポートする意味は無いですね。

Allow class constants in strings · Issue #11018 · php/php-src

変数展開でもクラス定数にアクセスできるべきでしょ?というイシュー

<?php
echo "{$foo::$Bar}\n"; // ok
echo "{$foo::Bar}\n"; // parse error
echo "{$foo::class}\n"; // parse error

確かに、出来ると嬉しい。逆はできるようになったけどね。Bar::$foo とか

array_push($arr, ...$map) should support non-numeric keys · Issue #11026 · php/php-src

そう言われてみれば....という話。
array_push は暗黙的にnumericなキーになりますが、no-numeric なキーもpush出来るようにしたいというもの。

今のところ、どんな落とし所になるかはよくわかりません。

Discussion

rana_kualurana_kualu

Property Hooks

その昔Property AccessorsというRFCがありまして(というかHooksはAccessorsの発展ですね)、
これはかのNikitaですらもぅマヂ無理。。。って漏らすくらいだったのですがProperty Hooksは実装とか大丈夫なんでしょうかね。

Ryo TomidokoroRyo Tomidokoro

すでにもうマヂ無理って言われてたやつなんですね!PHPプログラマーにとっては利便性向上だけど、Internal としては慎重になりそうなやつですね。

俄然興味が湧いてきたので PoC も見てみます!