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

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で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
Laravel(PHP)vs。Python:長所と短所を計量しますLaravel(PHP)vs。Python:長所と短所を計量しますApr 17, 2025 am 12:18 AM

LaravelはWebアプリケーションを迅速に構築するのに適していますが、Pythonはより広い範囲のアプリケーションシナリオに適しています。 1.Laravelは、Web開発を簡素化するために、Eloquentorm、Bladeテンプレートエンジン、職人ツールを提供します。 2。Pythonは、その動的なタイプ、リッチ標準ライブラリ、サードパーティのエコシステムで知られており、Web開発、データサイエンス、その他の分野に適しています。

Laravel vs. Python:フレームワークとライブラリの比較Laravel vs. Python:フレームワークとライブラリの比較Apr 17, 2025 am 12:16 AM

LaravelとPythonにはそれぞれ独自の利点があります。Laravelは、機能が豊富なWebアプリケーションを迅速に構築するのに適しており、Pythonはデータサイエンスと一般的なプログラミングの分野でうまく機能します。 1.Laravelは、最新のWebアプリケーションの構築に適したEloquentormおよびBladeテンプレートエンジンを提供します。 2。Pythonには豊富な標準的な図書館とサードパーティライブラリがあり、DjangoとFlaskのフレームワークはさまざまな開発ニーズを満たしています。

Laravelの目的:堅牢でエレガントなWebアプリケーションの構築Laravelの目的:堅牢でエレガントなWebアプリケーションの構築Apr 17, 2025 am 12:13 AM

Laravelは、コード構造を明確にし、開発プロセスをより芸術的にすることができるため、選択する価値があります。 1)LaravelはPHPに基づいており、MVCアーキテクチャに従い、Web開発を簡素化します。 2)Eloquentorm、Artisan Tools、Bladeテンプレートなどのコア機能は、開発の優雅さと堅牢性を高めます。 3)ルーティング、コントローラー、モデル、ビューを通じて、開発者はアプリケーションを効率的に構築できます。 4)キューやイベントモニタリングなどの高度な機能により、アプリケーションのパフォーマンスがさらに向上します。

Laravel:主にバックエンドフレームワークが説明しましたLaravel:主にバックエンドフレームワークが説明しましたApr 17, 2025 am 12:02 AM

Laravelは、バックエンドフレームワークであるだけでなく、完全なWeb開発ソリューションでもあります。ルーティング、データベース操作、ユーザー認証などの強力なバックエンド機能を提供し、フロントエンド開発をサポートし、Webアプリケーション全体の開発効率を向上させます。

Laravel(PHP)vs。Python:重要な違​​いの理解Laravel(PHP)vs。Python:重要な違​​いの理解Apr 17, 2025 am 12:01 AM

LaravelはWeb開発に適しており、Pythonはデータサイエンスと迅速なプロトタイピングに適しています。 1.LaravelはPHPに基づいており、Eloquentormなどのエレガントな構文とリッチ機能を提供します。 2。Pythonは、そのシンプルさで知られており、Web開発とデータサイエンスで広く使用されており、豊富なライブラリエコシステムがあります。

Laravel In Action:実際のアプリケーションと例Laravel In Action:実際のアプリケーションと例Apr 16, 2025 am 12:02 AM

laravelcanbeefeectiveivefectively-worldapplications for buildingscalablewebsolutions.1)その概要を説明することで、lastulavel'secosystem(toolslikenovaを含むlaravel'secosystem)を拡張します

Laravelの主な機能:バックエンド開発Laravelの主な機能:バックエンド開発Apr 15, 2025 am 12:14 AM

バックエンド開発におけるLaravelのコア機能には、ルーティングシステム、Eloquentorm、移行機能、キャッシュシステム、キューシステムが含まれます。 1.ルーティングシステムは、URLマッピングを簡素化し、コードの組織とメンテナンスを改善します。 2.Eloquentormは、開発効率を改善するためにオブジェクト指向のデータ操作を提供します。 3.移行関数は、バージョン制御を介してデータベース構造を管理して、一貫性を確保します。 4.キャッシュシステムは、データベースクエリを削減し、応答速度を向上させます。 5.キューシステムは、大規模なデータを効果的に処理し、ユーザー要求のブロックを避け、全体的なパフォーマンスを改善します。

Laravelのバックエンド機能:データベース、ロジックなどLaravelのバックエンド機能:データベース、ロジックなどApr 14, 2025 am 12:04 AM

Laravelは、バックエンド開発で強く機能し、Eloquentorm、コントローラー、サービスクラスを介してデータベース操作を簡素化し、ビジネスロジックを処理し、キュー、イベント、その他の機能を提供します。 1)Eloquentormは、モデルを介してデータベーステーブルをマップしてクエリを簡素化します。 2)ビジネスロジックは、モジュール性と保守性を向上させるために、コントローラーとサービスクラスで処理されます。 3)キューシステムなどのその他の機能は、複雑なニーズの処理に役立ちます。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境