Dieser Artikel führt hauptsächlich eine kurze Diskussion über eine späte statische Bindung in Laravel ein. Der Inhalt ist ziemlich gut, ich werde ihn jetzt mit Ihnen teilen und als Referenz geben.
Bezüglich der neuen statischen verzögerten statischen Bindung oder späten statischen Bindung von PHP bin ich in Laravel auf ein Nutzungsproblem gestoßen. Wenn Sie das Modell in Laravel aufrufen, um neue Daten hinzuzufügen, fügen Sie wie folgt zunächst eine Methode zum Modell hinzu, um die Untertabelle zu erhalten:
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; }
Die setTable-Methode Hier ist im Modell die Methode zum Erhalten der Untertabelle definiert in:
public function setTable($table) { $this->table = $table; return $this; }
Es wird aus dem Fehlerprotokoll gefunden, das $this->table ausführt nicht wirksam, aber die Erstellungsmethode wird tatsächlich aufgerufen. Als der Tabellenname zuvor gedruckt wurde, war es der erwartete Wert. Warum wird $this->table nicht zurückgesetzt, wenn die Erstellungsmethode hier aufgerufen wird?
Hier ist $this->message eine Modellklasse, die die Model-Klasse erbt, in der sich die Erstellungsmethode:
public static function create(array $attributes = []) { $model = new static($attributes); $model->save(); return $model; }
befindet VendorlaravelframeworksrcIlluminateDatabaseEloquentModel.php Zeile 557.
Da die Model-Klasse des Laravel-Frameworks ein abstrakter Typ ist, kann die abstrakte Klasse in PHP mithilfe der neuen statischen späten statischen Bindung und in der Erstellungsmethode $model = new static instanziiert werden ($attributes) Tatsächlich wird es erneut instanziiert und zurückgegeben, aber die Modellklasse des Aufrufers definiert das Tabellenattribut nicht, sodass $this->table zu diesem Zeitpunkt keinen Wert hat.
Die Lösung besteht darin, die Speichermethode zu verwenden, wie im Bild gezeigt. Tatsächlich ruft die Methode create auch die Methode save auf.
Experiment
Eine abstrakte Klasse A verfügt über eine Erstellungsmethode, die durch verzögerte statische Bindung instanziiert und zurückgegeben wird. Klasse B erbt A und das Namensattribut der übergeordneten Klasse wird in der Testmethode geändert.
<?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);
Die Ergebnisse zeigen, dass beide Instanzen von $obj1 und $obj2 Instanzen von B sind. Der Attributname hat sich durch den Aufruf der Testmethode geändert, aber nach dem Aufruf Bei der Erstellungsmethode hat sich das Namensattribut nicht geändert. Dies ist die in diesem Artikel erwähnte Szene in Lavarel. (Wenn die Annotation hier aktiviert ist, ist der gedruckte Name der umgeschriebene Wert)
Wenn die abstrakte Klasse A in eine normale Klasse geändert wird und die neue statische Klasse zur Instanziierung in ein neues Selbst geändert wird, ist das Ergebnis wie folgt Anders, der gedruckte Attributname ist ein Attribut der jeweiligen Klasse.
Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er wird für das Studium aller hilfreich sein. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website.
Verwandte Empfehlungen:
Über Laravel5. So drucken Sie die ausgeführte SQL-Anweisung aus
Laravel 5-Framework-Modell und Lernen die grundlegenden Prozesse von Controllern und Ansichten
Das obige ist der detaillierte Inhalt vonÜber späte statische Bindung in Laravel. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!