この記事では、主に Laravel の後期静的バインディングについて簡単に説明します。内容が非常に優れているので、参考として紹介します。
PHP の新しい静的遅延静的バインディング、または遅延静的バインディングに関して、Laravel での使用上の問題が発生しました。次のように、Laravel でモデルを呼び出して新しいデータを追加するときは、まずサブテーブルを取得するメソッドをモデルに追加します。
protected function addToMessage($msgType, $userID, $commentID, $replyCommentID, $replyUserID, $gameID) { if (!$userID) { return false; } $table = 't_message_' . hashID($userID, 100); $this->message->setTable($table)->create([ 'msg_type' => $msgType, 'user_id' => $userID, 'comment_id' => $commentID, 'reply_comment_id' => $replyCommentID, 'reply_user_id' => $replyUserID, 'game_id' => $gameID, 'is_read' => 0, 'created_at' => date('Y-m-d H:i:s'), ]); return true; }
setTable メソッドこれはモデル内に定義されているサブテーブルを取得する方法です。
public function setTable($table) { $this->table = $table; return $this; }
$this->table が実行していることがエラー ログからわかります。有効になりませんが、実際には create メソッドが呼び出されます。前にテーブル名が出力されたとき、それは期待された値でしたが、ここで create メソッドが呼び出されたときに $this->table がリセットされないのはなぜですか?
ここで、$this->message は Model クラスを継承するモデル クラスで、作成メソッド
public static function create(array $attributes = []) { $model = new static($attributes); $model->save(); return $model; }
は次の場所にあります。 Vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php 557 行目.
Laravel フレームワークの Model クラスは抽象型であるため、PHP の抽象クラスは新しい静的クラスを使用してインスタンス化できます。遅延静的バインディング、および create メソッドの $model = new static($attributes) は実際には再インスタンス化されて返され、呼び出し元の Model クラスはテーブル属性を定義しないため、$this->table には値がありません。この時。
#解決策は、図に示すように、save メソッドを使用することです。実際、create メソッドは save メソッドも呼び出します。実験
抽象クラス A には create メソッドがあり、このメソッドは遅延静的バインディングによってインスタンス化されて返されます。クラス B は A を継承し、親クラスの name 属性がテスト メソッドで変更されます。<?php abstract class A { protected $name = "tanteng"; public static function create() { return new static(); } } class B extends A { //protected $name = '纸牌屋弗兰克'; public function test() { $this->name = "Tony Tan"; return $this; } } $obj1 = (new B)->test(); $obj2 = (new B)->test()->create(); var_dump($obj1); var_dump($obj2);結果は、$obj1 と $obj2 の両方のインスタンスが B のインスタンスであることを示しています。テスト メソッドの呼び出しによって属性名が変更されましたが、呼び出し後はcreate メソッド、name 属性は変更されていません。これは、この記事で言及したラヴァレルで遭遇したシーンです。 (ここでアノテーションがオンになっている場合、出力される名前は書き換えられた値になります) 抽象クラス A を通常のクラスに変更し、インスタンス化のために new static を new self に変更すると、結果は次のようになります。異なる場合は、出力される属性名は、それぞれのクラスの属性です。 上記がこの記事の全内容です。その他の関連コンテンツについては、PHP 中国語 Web サイトをご覧ください。 関連する推奨事項:
Laravel5 について。実行された SQL ステートメントを出力する方法
以上がLaravelの遅延静的バインディングについての詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。