今週の PHP 2023-04-01 〜 2023-04-07
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
TLの皆さんが激アツと評していたRFCです。私はまだこの重大性がピンときてません。
PHP 8.2 では、constructor property promotion が出来るようになりました。記述が短くできます。
<?php
class User
{
public function __construct(public string $name) {}
}
ただ、上の $name
に追加の振る舞いを行いたい場合、困るよね?と
- getter, setter を追加する
-
__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なら大丈夫という返答。
こちらは修正が行われた関連イシュー
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
その昔Property AccessorsというRFCがありまして(というかHooksはAccessorsの発展ですね)、
これはかのNikitaですらもぅマヂ無理。。。って漏らすくらいだったのですがProperty Hooksは実装とか大丈夫なんでしょうかね。
すでにもうマヂ無理って言われてたやつなんですね!PHPプログラマーにとっては利便性向上だけど、Internal としては慎重になりそうなやつですね。
俄然興味が湧いてきたので PoC も見てみます!