ホームページ  >  記事  >  バックエンド開発  >  プロパティフック PHP なし

プロパティフック PHP なし

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-09 06:13:29552ブラウズ

Property Hooks no PHP

11 月には、私たちが愛する PHP のバージョン 8.4 がリリースされます。それに伴い、コミュニティが待ち望んでいた新機能、プロパティ フックが追加されます。 C#、Swift、Kotlin などの他の言語からインスピレーションを得たこの新機能は、魔法の __set() メソッドや __get() メソッドの手間を省きます。

プロパティをプライベートとして作成せずにゲッターとセッターを現在使用し、プロパティとは異なる名前を持つ 2 つの新しいメソッドを作成する方法の例を示します。

class Foo
{
    private String $bar;

    public function __set($name, $value)
    {
        $this->$name = $value . "!!!"; 
    }

    public function __get($name)
    {
         return "!!!" . $this->$name;
    }
}

__get() と __set() を使用すると、値を設定するときと値を検索するときに $bar をパブリックのままにすることができますが、実装は異なり、プロパティとは異なる名前のメソッドを作成する必要はありません。視覚的な例では、使用法は次のようになります:

$foo = new Foo();

$foo->bar = "new release";
// aqui o valor que ficará salvo seria "new release!!!"

echo $foo->bar; // aqui retornaria "!!!new release!!!"

次に、__get() と __set() が他のプロパティでどのように見えるか想像してみてください。完全に混乱しています。これを行うもう 1 つの方法は、getBar() メソッドと別の setBar() メソッドを作成することです。ただし、これでは 1 つのプロパティのみが考慮されるため、使用方法は前のものとは異なります。

class Foo
{
    private String $bar;

    public function setBar($value)
    {
        $this->bar = $value . "!!!"; 
    }

    public function getBar()
    {
         return "!!!" . $this->bar;
    }
}

$foo = new Foo();

$foo->setBar('new release');
// aqui o valor que ficará salvo seria "new release!!!"

echo $foo->getBar(); // aqui retornaria "!!!new release!!!"

個人的には、このユースケースで新しいメソッドを作成するのは少し面倒だと感じています。値の取得と設定の両方にプロパティの直接呼び出しを使用することを好みます。この新機能は、この混乱を解決するために登場し、クラス内の宣言とともに get と set を個別に定義できるようになります。

class Foo
{
    public String $bar {
        set (String $value) => $this->bar = $value . "!!!";
        get => "!!! . $this->bar";
    }
}

この新しいコードは、同じことを個別に実行します。新しいメソッドを作成したり、クラスが持つ各プロパティの処理が必要な __get() や __set() を使用したりする必要はありません。

あとは、この新機能のリリースを待つだけです。11 月 21 日にリリースされる予定です。

以上がプロパティフック PHP なしの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。