Cet article présente principalement une brève discussion sur une liaison statique tardive dans Laravel. Le contenu est assez bon, je vais le partager avec vous maintenant et le donner comme référence.
Concernant la nouvelle liaison statique retardée de PHP, ou liaison statique tardive, j'ai rencontré un problème d'utilisation dans Laravel. Comme suit, lorsque vous appelez le Modèle dans Laravel pour ajouter de nouvelles données, ajoutez d'abord une méthode au Modèle pour obtenir la sous-table :
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; }
Le La méthode setTable est ici la méthode d'obtention de la sous-table définie dans le modèle :
public function setTable($table) { $this->table = $table; return $this; }
Il ressort du journal des erreurs que $this-> ;table ne prend pas effet, mais en fait, lorsque le nom de la table est imprimé avant d'appeler la méthode create, c'est la valeur attendue. Pourquoi $this->table n'est-il pas réinitialisé lorsque la méthode create est appelée ici ?
Ici $this->message est une classe modèle qui hérite de la classe Model, où la méthode create :
public static function create(array $attributes = []) { $model = new static($attributes); $model->save(); return $model; }
est situé dans supplierlaravelframeworksrcIlluminateDatabaseEloquentModel.php Line 557.
Étant donné que la classe Model du framework Laravel est un type abstrait, la classe abstraite en PHP peut être instanciée à l'aide d'une nouvelle liaison statique tardive, et dans la méthode create $model = new static ($ attributs) est en fait réinstancié et renvoyé, et la classe Model de l'appelant ne définit pas l'attribut table, donc $this->table n'a aucune valeur pour le moment.
La solution est d'utiliser la méthode de sauvegarde, comme indiqué sur l'image. En fait, la méthode create appelle également la méthode save.
Expérience
Une classe abstraite A a une méthode create, qui est instanciée et renvoyée via une liaison statique retardée. La classe B hérite de A et l'attribut name de la classe parent est modifié dans la méthode de test.
<?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);
Les résultats montrent que les deux instances de $obj1 et $obj2 sont des instances de B. Lorsque la méthode de test est appelée, le nom de l'attribut change, mais lorsque la méthode create est appelée ultérieurement, l'attribut name n'a pas changé. C'est la scène rencontrée à Lavarel évoquée dans cet article. (Si l'annotation est activée ici, le nom imprimé est la valeur réécrite)
Si la classe abstraite A est remplacée par une classe normale et que le nouveau statique est remplacé par le nouveau self pour l'instanciation, le résultat sera différent, l'imprimé Le nom de l'attribut est un attribut de la classe respective.
Ce qui précède représente l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'étude de chacun. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois !
Recommandations associées :
À propos de Laravel5 Comment imprimer l'instruction SQL exécutée
Modèle de framework Laravel 5 et apprentissage. les processus de base des contrôleurs et des vues
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!