web-dev-qa-db-ja.com

なぜ新しい静的を返すのですか? (PHP)

一部の人々がすべてのメソッドを静的にするのではなく、新しい静的を返す1つのメソッドを作成するのはなぜですか?そのメソッドがnew staticを返すである理由は何ですか? staticとselfの違い、またはstaticとselfの意味は問わないたとえば、次の1つの単純なクラスを使用します。

<?php

class Expression
{
    public static function make()
    {
        return new static;
    }


    public function find($value)
    {
        return '/' . $value .'/';
    }

    public function then($value)  
    {
        return $this->find($value);
    }

    public function hi($value)  
    {
        return "hi";
    }

}

ご覧のとおり、静的メソッドmake()があり、新しい静的を返します。次に、このような他のメソッドを呼び出す人もいます。

$regex = Expression::make()->find('www');

それの目的は何ですか?ここではnew Expression構文を使用していないことがわかります例、静的?違いは何ですか、new staticを返すメソッドがある理由は何ですか?

27
PeraMika

_new static_は、現在のクラスから新しいオブジェクトをインスタンス化し、遅延静的バインディングで動作します(クラスがサブクラス化されている場合、サブクラスをインスタンス化します。理解していると思います)。

同じインスタンスを返すクラスでstaticメソッドを使用することは、代替コンストラクターです。つまり、通常、コンストラクタは_public function __construct_であり、通常、特定の一連のパラメータが必要です。

_class Foo {
    public function __construct(BarInterface $bar, array $baz = []) { ... }
}
_

代替コンストラクターを使用すると、さまざまなデフォルトを提供したり、特定の引数を指定したりすることなくこのクラスをインスタンス化したりするための便利なショートカットや、代替コンストラクターが標準の引数に変換するさまざまな引数を提供します。

_class Foo {

    public function __construct(BarInterface $bar, array $baz = []) { ... }

    public static function fromBarString($bar) {
        return new static(new Bar($bar));
    }

    public static function getDefault() {
        return new static(new Bar('baz'), [42]);
    }

}
_

これで、正規のコンストラクターに一連の複雑な引数が必要な場合でも、クラスのデフォルトのインスタンスを作成できます。これは、Foo::getDefault()を使用するだけで、ほとんどの用途に適しています。

PHPこのための正規の例はDateTimeおよび _DateTime::createFromFormat_ です。

あなたの具体的な例では、代替コンストラクターは実際には何もしないので、かなり不必要ですが、それは不完全な例だからです。確かに_new static_以外に何もしない代替コンストラクタがある場合、それはおそらく_(new Foo)->_に対する便利な構文として意図されているにすぎません。

32
deceze

get_called_class() )。

class A {
    public static function get_self() {
        return new self();
    }

    public static function get_static() {
        return new static();
    }
}

class B extends A {}

echo get_class(B::get_self());  // A
echo get_class(B::get_static()); // B
echo get_class(A::get_self()); // A
echo get_class(A::get_static()); // A
8
Sergey Shuchkin