今週の PHP 2022/06/18 〜 2022/06/24
PHP のメーリングリストから、気になった情報をピックアップします。
Internal
Feature Freeze まで 30日
7/5 までに Vote オープンしないと間に合わないよというリマインダー
PHP: rfc:random_extension_improvement
RFC が分割されてる
Random Extension 5.X で出てきた細かい修正点を解決するための分割RFC。Class 名などの詳細な議論が続けられている。
2022/7/19 のフィーチャーフリーズに間に合うようにと、急ピッチで議論が進んでいる。
PHP: rfc:dnf_types
そもそも、DNF Disjunctive Normal Form
がわからなかったけど。
論理演算式の標準方式ということらしい。
- disjunction 論理和
- conjunction 論理積
RFC に書かれているサンプル
interface A {}
interface B {}
interface C extends A {}
interface D {}
class W implements A {}
class X implements B {}
class Y implements A, B {}
class Z extends Y implements C {}
// Accepts an object that implements both A and B,
// OR an object that implements D.
(A&B)|D
// Accepts an object that implements C,
// OR a child of X that also implements D,
// OR null.
C|(X&D)|null
// Accepts an object that implements all three of A, B, and D,
// OR an int,
// OR null.
(A&B&D)|int|null
複雑な型を、論理演算式で表現できるという。クラス名が長いと辛そう。
Discussion about new Curl URL API and ext/curl improvements
cURL 6.62.0 になって、いろいろなフィーチャーが追加されている。これを PHP の拡張にどうやって取り込もうか?というディスカッション
OOP スタイルのAPIに追加するのか、プロシージャルな curl 関数群に追加するのか?など
ディスカッションにおいては、最低限 curl 側で追加された機能を利用できる薄いラッパーとしての変更のみを行うこと、OOP スタイルのAPIに追加することなどの方向性で話されている。
PHP: rfc:fetch_property_in_const_expressions
PHP 本体に送られたイシューから派生して生まれた RFC
num E: string {
case Foo = 'foo';
}
const C = E::Foo->name;
function f() {
static $v = E::Foo->value;
}
#[Attr(E::Foo->name)]
class C {}
function f(
$p = E::Foo->value,
) {}
class C {
public string $p = E::Foo->name;
}
// The rhs of -> allows other constant expressions
const VALUE = 'value';
class C {
const C = E::Foo->{VALUE};
}
PHP: rfc:constants_in_traits
sji さんの RFC
運良く PHPer Room にあらわれてくれたので、本人から詳細に内容を聞けました。RFC 自体の要点は下記の一文に凝縮されています。
This RFC proposes to allow defining constants in traits
trait T {
public const CONSTANT = 42;
public function doSomething(): void {
// Fatal Error
echo T::CONSTANT;
// OK
echo self::CONSTANT;
echo static::CONSTANT;
echo $this::CONSTANT;
}
}
trait の機能が PHP に追加されたのは、5.4 の時でした。
trait 自体が提案された初期は、状態(プロパティーや、定数)を持っていなかった。
- それだと流石に不便なので、プロパティーは持たせた。
- 多重継承の形になったときは、同名のプロパティーはエラー。
- 通常のクラスなどでは継承時に上書きできるものも、trait ではエラーになる
このあたりの 状態に関する仕様については、RFC にも詳しく載っています。
今回のtrait で定数を使えるようにする提案は、その既存実装と一貫性をもつので、同じ名前だとエラーになってしまうし、利用者側のクラスで上書きすることは出来ない。
通常のクラス変数、クラス定数は final
修飾子がついてなければ、継承した側で改変することが可能なので、trait の場合は少しルールが異なる。trait だと複数継承のような使い方も出来てしまうのでルールが異なるのも致し方がない。
Bugs
PHP :: Request #77726 :: Support NULs in PCRE patterns
PCRE の パターンに Null も可能にするというパッチ。
PR の説明文に、今までの経緯などが記載されていて面白かったです。
Allowing this is consistent with the behaviour of many
other languages, including JavaScript, and thanks to PCRE2[0], it does
not require manually escaping null characters. Now that we can avoid the
error here without the cost of escaping characters, there is really no
need anymore to stray here from the conventional behaviour.
better error reporting · Issue #8808 · php/php-src
Specify unit in out of memory error
php-cli core dump calling a badly formed function · Issue #8841 · php/php-src
$ rpm -q php-cli
php-cli-8.1.4-1.el8.remi.x86_64
$ php -n -dauto_prepend_file= -a
Interactive shell
php > echo phpversion();
8.1.4
php > function f ($x): void { return $x;}
Fatal error: A void function must not return a value in php shell code on line 1
php > f(10);
Segmentation fault (core dumped)
Exception type hint · Issue #8843 · php/php-src
例外をUnion Type の戻り値で書けたら、すごく解析しやすくてよくない?というイシュー。
public function myFunc(?int $int = null): int | !LogicException
{
if (null === $int) {
throw new LogicException();
}
// ...
return $int;
}
RFC 出してね。と
PHP では、新しい機能提案などは、RFC として議論して採択するという流れになっています。
Attribute parameters cannot contain BackedEnum values · Issue #8344 · php/php-src
<?php
enum Status: string
{
case DRAFT = 'draft';
case PUBLISHED = 'published';
case ARCHIVED = 'archived';
}
#[Attribute]
class ListensTo
{
public string $event;
public function __construct(string $event)
{
$this->event = $event;
}
}
#[ListensTo(Status::DRAFT->value)]
class TestClass {}
Attribute のパラメーターに Enum の値が使えないというイシュー。
結果、これは、そもそも想定されていなかったので、 RFC が出されることになりました。
Discussion