ホームページ > PHPフレームワーク > Laravel > Laravelの後期静的バインディング

Laravelの後期静的バインディング

藏色散人
リリース: 2019-10-23 13:43:09
転載
2285 人が閲覧しました

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 には値がありません。

Laravelの後期静的バインディング

#解決策は、図に示すように、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 = &#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);
ログイン後にコピー
結果は、$obj1 と $obj2 の両方のインスタンスが B のインスタンスであることを示しています。属性名は test メソッドの呼び出しによって変更されましたが、name 属性は create メソッドの呼び出し後も変更されていません。これは、この記事で言及したラヴァレルで遭遇したシーンです。 (ここでアノテーションがオンになっている場合、出力される名前は書き換えられた値になります)

抽象クラス A を通常のクラスに変更し、インスタンス化のために new static を new self に変更すると、結果は次のようになります。異なる場合は、出力される属性名は、それぞれのクラスの属性です。

Laravel 関連の技術記事の詳細については、

Laravel Framework Getting Started Tutorial 列にアクセスして学習してください。

以上がLaravelの後期静的バインディングの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:segmentfault.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート