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 メソッドは、サブテーブルを取得するためにモデルで定義されているメソッドです。 -table:
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; }
は、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);
Laravel Framework Getting Started Tutorial 列にアクセスして学習してください。
以上がLaravelの後期静的バインディングの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。