PHP laravelには、次のようなコードがあります
$user = User::find(1);
var_dump($user->name);
find
メソッドの使用方法については関係ありませんが、なぜlaravel静的メソッドを使用するのか?静的メソッドを使用するとメソッドのテストが難しくなるのではないでしょうか?
シングルトンを使用して設計した方がよいでしょうか?
例えば.
$user = User::getInstance()->find(1);
var_dump($user->name);
実際、あなたの例は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
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);
これにより、システムのユーザーは1人だけに制限されます。 find
メソッドは静的である可能性がありますが、Userクラスにはそうでない他のメソッドとプロパティがあります。おそらく、次の例があります。$user->name
インスタンス変数に依存しないメソッド。つまり、値が特定のオブジェクトインスタンスに固有であるが、代わりにすべてのインスタンスに適用される汎用機能を提供し、静的である可能性があり、おそらく静的である必要があります。これが$this
演算子は、特定のオブジェクトインスタンスを参照できないため、静的メソッド内では無効です。