PHP の新しい静的遅延静的バインディング、または遅延静的バインディングに関して、Laravel で使用上の問題が発生しました。この記事では主に、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 は使用されていませんでした。reset はどうなるのでしょうか?
ここで $this->message は Model クラスを継承するモデル クラスで、create メソッド:
public static function create(array $attributes = []) { $model = new static($attributes); $model->save(); return $model; }
は、vendorlaravelframeworksrcIlluminateDatabaseEloquentModel.php の 557 行目にあります。
なぜなら、Laravel フレームワークのこの Model クラスは抽象型、PHP 抽象クラスは new static late static binding を使用してインスタンス化でき、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 のインスタンスであることを示しています。 test メソッドの呼び出しによって属性名は変更されましたが、create メソッドの呼び出し後、name 属性は変更されていません。 これは、この記事で言及したラヴァレルで遭遇したシーンです。 (ここでアノテーションがオンになっている場合、出力される名前は書き換えられた値になります)
抽象クラス A を通常のクラスに変更し、インスタンス化のために新しい static を新しい self に変更すると、結果は異なります。出力される属性名は各クラスのプロパティになります。
関連する推奨事項:
PHPの遅延静的バインディングとは何ですか?遅延静的バインディングのサンプルコードの詳細説明
以上がLaravelの遅延静的バインディングの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。