web-dev-qa-db-ja.com

PHPのlaravelモデルクラスで静的メソッドを使用するのはなぜですか?

PHP laravelには、次のようなコードがあります

$user = User::find(1);
var_dump($user->name);

findメソッドの使用方法については関係ありませんが、なぜlaravel静的メソッドを使用するのか?静的メソッドを使用するとメソッドのテストが難しくなるのではないでしょうか?

シングルトンを使用して設計した方がよいでしょうか?

例えば.

$user = User::getInstance()->find(1);
var_dump($user->name);
10
Ryan

実際、あなたの例はLaravelが舞台裏で行うことと非常に似ています。User::find()を実行すると、実際には新しいインスタンス、つまりコレクションのインスタンスを要求します。またはQueryBuilder。

Illuminate\Database\Eloquent\Model( 参照 ):

_public static function find($id, $columns = array('*'))
{
    if (is_array($id) && empty($id)) return new Collection;

    $instance = new static;

    return $instance->newQuery()->find($id, $columns);
}
_

補足として、Laravel例:Input::get()で静的メソッドを使用する別の方法もあります。これらはファサードと呼ばれます。

ファサードは、アプリケーションのIoCコンテナーで使用可能なクラスへの「静的」インターフェースを提供します... Laravel「ファサード」は、IoCコンテナー内の基礎となるクラスへの「静的プロキシ」として機能し、利点を提供します従来の静的メソッドよりもテスト容易性と柔軟性を維持しながら、簡潔で表現力豊かな構文を採用しています。

ユーザーが...ファサードの静的メソッドを参照すると、LaravelはIoCコンテナーからのキャッシュバインディングを解決し、そのオブジェクトに対して要求されたメソッド(この場合はget)を実行します。

Laraveのファサードの詳細については、次のURLをご覧ください。 http://laravel.com/docs/facades

16
Unnawut

Unnawutの答えはとても良いですが、さらに説明を加える必要があると感じました。

あなたの例では

$user = User::find(1);
var_dump($user->name);

Laravelは静的メソッドを使用していません。おそらく探しているこれを行う別の方法は、依存性注入を使用することです。これは、自動的に実行できるため、Laravelは非常に簡単です。したがって、どのクラスでもUserモデルで、コンストラクターでこのようなものを設定する必要があります...

public function __construct(User $user)
{
    $this->user = $user;
}

次に、静的バインディングを使用しないようにコードを変更できます。

$user = $this->user->find(1);
var_dump($user->name);
14
user1669496

これにより、システムのユーザーは1人だけに制限されます。 findメソッドは静的である可能性がありますが、Userクラスにはそうでない他のメソッドとプロパティがあります。おそらく、次の例があります。$user->name

インスタンス変数に依存しないメソッド。つまり、値が特定のオブジェクトインスタンスに固有であるが、代わりにすべてのインスタンスに適用される汎用機能を提供し、静的である可能性があり、おそらく静的である必要があります。これが$this演算子は、特定のオブジェクトインスタンスを参照できないため、静的メソッド内では無効です。

2
Alex