🕌

今週の PHP 2022/06/18 〜 2022/06/24

2022/06/25に公開

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

Internal

Feature Freeze まで 30日

7/5 までに Vote オープンしないと間に合わないよというリマインダー

PHP: rfc:random_extension_improvement

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

RFC が分割されてる

Random Extension 5.X で出てきた細かい修正点を解決するための分割RFC。Class 名などの詳細な議論が続けられている。

2022/7/19 のフィーチャーフリーズに間に合うようにと、急ピッチで議論が進んでいる。

PHP: rfc:dnf_types

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

そもそも、DNF Disjunctive Normal Form がわからなかったけど。

https://en.wikipedia.org/wiki/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 関数群に追加するのか?など

https://wiki.php.net/rfc/curl-url-api

ディスカッションにおいては、最低限 curl 側で追加された機能を利用できる薄いラッパーとしての変更のみを行うこと、OOP スタイルのAPIに追加することなどの方向性で話されている。

PHP: rfc:fetch_property_in_const_expressions

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

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

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

https://wiki.php.net/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 の時でした。

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

trait 自体が提案された初期は、状態(プロパティーや、定数)を持っていなかった。

  • それだと流石に不便なので、プロパティーは持たせた。
  • 多重継承の形になったときは、同名のプロパティーはエラー。
  • 通常のクラスなどでは継承時に上書きできるものも、trait ではエラーになる

このあたりの 状態に関する仕様については、RFC にも詳しく載っています。

今回のtrait で定数を使えるようにする提案は、その既存実装と一貫性をもつので、同じ名前だとエラーになってしまうし、利用者側のクラスで上書きすることは出来ない。

通常のクラス変数、クラス定数は final 修飾子がついてなければ、継承した側で改変することが可能なので、trait の場合は少しルールが異なる。trait だと複数継承のような使い方も出来てしまうのでルールが異なるのも致し方がない。

https://3v4l.org/FcvLo

Bugs

PHP :: Request #77726 :: Support NULs in PCRE patterns

https://bugs.php.net/bug.php?id=77726&edit=1

PCRE の パターンに Null も可能にするというパッチ。

https://github.com/php/php-src/pull/8114/files

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

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

https://github.com/php/php-src/pull/8820/files

Specify unit in out of memory error

php-cli core dump calling a badly formed function · Issue #8841 · php/php-src

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

$ 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;
}

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

RFC 出してね。と

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

PHP では、新しい機能提案などは、RFC として議論して採択するという流れになっています。

Attribute parameters cannot contain BackedEnum values · Issue #8344 · php/php-src

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

<?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