Une description détaillée de la liaison statique tardive dans Laravel

小云云
Libérer: 2023-03-19 17:32:02
original
2023 Les gens l'ont consulté

Concernant la nouvelle liaison statique retardée de PHP, ou liaison statique tardive, j'ai rencontré un problème d'utilisation dans Laravel. Cet article présente principalement une brève discussion sur une liaison statique tardive dans Laravel. L'éditeur pense qu'elle est plutôt bonne, je vais donc la partager avec vous maintenant et la donner comme référence. Suivons l'éditeur et jetons un œil. J'espère que cela pourra aider tout le monde.

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;
}
Copier après la connexion

Ici La méthode setTable est une méthode définie dans le Modèle pour obtenir des sous-tables :


public function setTable($table)
{
  $this->table = $table;
  return $this;
}
Copier après la connexion

D'après le journal des erreurs, on constate 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 de 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;
}
Copier après la connexion

se trouve dans supplierlaravelframeworksrcIlluminateDatabaseEloquentModel .php Ligne 557 .

Étant donné que la classe Model du framework Laravel est un type abstrait, la classe abstraite en PHP peut être instanciée en utilisant une nouvelle liaison statique tardive, et dans la méthode create $model = new static( $attributes) en fait Ce qui précède est réinstancié et renvoyé, mais 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 = &#39;纸牌屋弗兰克&#39;;
 
  public function test()
  {
    $this->name = "Tony Tan";
    return $this;
  }
}
 
$obj1 = (new B)->test();
$obj2 = (new B)->test()->create();
var_dump($obj1);
var_dump($obj2);
Copier après la connexion

Les résultats montrent que les deux instances de $obj1 et $obj2 sont des instances de B. Le nom de l'attribut a changé en appelant la méthode de test, mais après avoir appelé la méthode create, nom Les propriétés n'ont 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.

Recommandations associées :

Explication détaillée de la définition et des exemples d'utilisation de la liaison post-statique php

php retardé statique contraignant Qu'est-ce que c'est ? Explication détaillée de l'exemple de code de liaison statique retardée

Analyse de l'utilisation de la liaison statique retardée PHP

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!