Maison >cadre php >Laravel >Une liaison statique tardive dans Laravel

Une liaison statique tardive dans Laravel

藏色散人
藏色散人avant
2019-10-23 13:43:092319parcourir

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;
}

La méthode setTable est ici la méthode définie dans le Modèle pour obtenir la sous-table. -table :

public function setTable($table)
{
    $this->table = $table;
    return $this;
}

J'ai trouvé dans le journal des erreurs que $this->table n'a pas pris effet, mais en fait, lorsque le nom de la table a été imprimé avant d'appeler la méthode create, c'était la valeur attendue. Pourquoi. $this->table n'était-il pas utilisé lorsque la méthode create a été appelée ici ? Qu'en est-il de la réinitialisation ?

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;
}

se trouve dans supplierlaravelframeworksrcIlluminateDatabaseEloquentModel.php Ligne 557.

En raison du framework Laravel, cette classe Model est un type abstrait. En PHP, les classes abstraites peuvent être instanciées à l'aide d'une nouvelle liaison statique tardive, et $model = new static ($attributes) dans la méthode create est réinstanciée et renvoyée, et appelant La classe Model ne définit pas l'attribut table, donc $this->table n'a aucune valeur pour le moment.

Une liaison statique tardive dans Laravel

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);

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 l'attribut name n'a pas changé après l'appel de la méthode create. 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.

Pour plus d'articles techniques liés à Laravel, veuillez visiter la colonne Tutoriel d'introduction au framework Laravel pour apprendre !

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer