Readonlyプロパティを備えたPHPに不変のオブジェクトを構築します
PHP 8.2のReadonlyプロパティは、コンストラクターまたは宣言で1回しか割り当てられず、その後修正できず、言語レベルで不変性を実施します。 2。深い不変性を実現するには、ArrayObjectの配列などの可変タイプをラップするか、直接状態の変更を防ぐタグコレクションなどのカスタム不変のコレクションを使用します。 3.ベストプラクティスには、コンストラクター内のすべてのプロパティの初期化、セッターの回避、with()メソッドを介して新しいインスタンスの返却、最終クラスの使用、および突然変異を防ぐためにクローニングを無効にすることが含まれます。 4.制限には、動的特性のサポートの欠如、オブジェクトや配列の深い凍結がなく、ネストされた可変性の手動処理の必要性が含まれます。 5.これらのゴッチャにもかかわらず、読み取りプロパティと値オブジェクトと機能パターンを組み合わせることで、ネイティブPHP機能のみを使用して安全で予測可能なスレッドに安全な不変のオブジェクトを使用することで、外部ライブラリなしで堅牢なドメインモデルを簡単に構築できます。
PHP 8.2では、強力な機能が導入されました: Readonlyプロパティ。これにより、不変のオブジェクトを構築するのがはるかに簡単になります。これは、作成後に状態を変更できないオブジェクトです。不変のオブジェクトは、予測可能でスレッドセーフであり、意図しない状態の変化によって引き起こされるバグを減らすため、価値があります。

readonly
使用して、PHPで真に不変の価値オブジェクトを作成する方法は次のとおりです。
Readonlyプロパティとは何ですか?
readonly
プロパティは、宣言またはコンストラクター内のいずれかで1回しか割り当てられません。その後、変更することはできません。

クラスユーザー { パブリック関数__construct( public readonly string $ id、 public readonly string $ email ){} }
設定すると、 $user->email = 'new@example.com';
Cannot modify readonly property
。
これにより、言語レベルでの不変性が強制されます。慣習や魔法の方法に依存する必要はありません。

深い不変性を実施します
readonly
使用すると、プロパティが配列やオブジェクトなどの可変タイプを保持している場合、完全な不変性を保証しません。例えば:
クラスブログポスト { パブリック関数__construct( public readonly文字列$タイトル、 public readonly配列$タグ ){} } $ post = new blogpost( 'php 8.2'、['php'、 'inmutable']); $ post-> tags [] = 'readonly'; //これは機能します!配列コンテンツは引き続き変更される可能性があります。
これを防ぐには、アレイとオブジェクトの突然変異から防御する必要があります。
✅ソリューション: ArrayObject
に配列をラップするか、不変のコレクションを使用します
クラスブログポスト { /** * @var readonly arrayobject <int、string> */ public readonly arrayobject $タグ。 パブリック関数__construct( public readonly文字列$タイトル、 配列$タグ ){ $ this-> tags = new ArrayObject($ tags); $ this-> tags-> setFlags(arrayObject :: array_as_props); $ this-> tags-> getFlags()&〜ArrayObject :: STD_PROP_LIST; } }
これで、 $post->tags
を読み取ることができますが、それを変更すること(例: $post->tags[] = 'hack'
)は失敗します。プロパティ自体が読み取られているため、再割り当てすることはできません。また、内部状態を操作するためにメソッドを公開すると、明示的に制御します。
または、コレクションに値オブジェクトを使用することを検討してください。
/** * @implements \ iteratorAggregate <String> */ クラスタグコレクションは\ iteratorAggregateを実装します { プライベート配列$タグ。 public function __construct(array $ tags){ $ this-> tags = array_values(array_unique($ tags)); } public function getiterator():\ traversable { new \ arrayiterator($ this-> tags)を返します。 } パブリック機能with with(string $ tag):self { 新しい自己を返します([... $ this-> tags、$ tag]); } } クラスブログポスト { パブリック関数__construct( public readonly文字列$タイトル、 public Readonly TagCollection $タグ ){} }
現在、不変性が保存されています。 $post->tags
変更することはできません。また、繰り返しても、変更が新しいインスタンスを作成する必要があります。
不変のオブジェクトのベストプラクティス
PHPで堅牢な不変のオブジェクトを構築するには:
- compleすべてのプロパティで
readonly
使用します - constructorconstructuncturtorのすべてを初期化します
- cublic公開セッターまたはミューテーターメソッドを避けてください
- state状態を変更する代わりに、新しいインスタンスを返します
- final最終クラスを使用して、意図しないオーバーライドを防ぎます
__clone()
を使用して、クローニングによる偶発的な突然変異を防ぐことを検討してください
最終クラスユーザー { パブリック関数__construct( public readonly string $ id、 public readonly string $ name、 public readonly string $ email ){} // setEmail()の代わりに、新しいインスタンスを返します パブリック機能withemail(string $ email):self { 新しいself($ this-> id、$ this-> name、$ email); } //クローニングを防ぐ(オプション) パブリック関数__clone() { 新しい\ badmethodcallexceptionを投げます( '不変のオブジェクトの場合、'クローニングは無効になります。 '); } }
使用法:
$ user = new user( '123'、 'alice'、 'alice@example.com'); $ updated = $ user-> withemail('alice@new.com '); //新しいインスタンス // $ユーザーは変更されていません
制限とゴッチャ
-
readonly
はクラスのプロパティでのみ動作します - 動的プロパティではありません - クラス内からであっても、コンストラクターの外側の外側のReadonlyプロパティに割り当てることはできません
- Readonlyの小道具に割り当てられたオブジェクトと配列は深く凍結していません - あなたはそれを自分で処理する必要があります
- PHPには組み込みの不変のアレイがないため、ラッパーやカスタムロジックが必要です
まとめ
PHP 8.2にreadonly
あるため、不変のオブジェクトの構築は実用的で安全です。 readonly
プロパティを防御的なコピー、値オブジェクト、および機能スタイルのメソッド(setx withX()
setX()
)と組み合わせて、クリーンで予測可能なドメインモデルを作成します。
フレームワークやライブラリは必要ありません。優れたデザインとPHPの組み込み機能です。
基本的に:一度宣言し、安全に保ちます。
以上がReadonlyプロパティを備えたPHPに不変のオブジェクトを構築しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undress AI Tool
脱衣画像を無料で

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

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

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

n 1クエリの問題を避け、関連するデータを事前にロードすることにより、データベースクエリの数を減らします。 2.必要なフィールドのみを選択して、メモリと帯域幅を保存するために完全なエンティティをロードしないようにします。 3. DoctrineのセカンダリキャッシュやRedis Cacheの高周波クエリ結果など、キャッシュ戦略を合理的に使用します。 4.エンティティのライフサイクルを最適化し、クリア()を定期的に呼び出してメモリを解放してメモリオーバーフローを防ぎます。 5.データベースインデックスが存在し、生成されたSQLステートメントを分析して、非効率的なクエリを避けます。 6.変更が不要なシナリオで自動変更追跡を無効にし、パフォーマンスを改善するためにアレイまたは軽量モードを使用します。 ORMを正しく使用するには、SQLモニタリング、キャッシュ、バッチ処理、適切な最適化を組み合わせて、開発効率を維持しながらアプリケーションのパフォーマンスを確保する必要があります。

settings.jsonファイルは、ユーザーレベルまたはワークスペースレベルのパスにあり、VSCODE設定のカスタマイズに使用されます。 1。ユーザーレベルのパス:WindowsはC:\ users \\ appdata \ roaming \ code \ user \ settings.json、macos is/users //settings.json、linux is /home/.config/code/user/settings.json; 2。Workspace-Level Path:.vscode/settings Project Root Directoryの設定

BREFにより、PHP開発者は、サーバーを管理せずにスケーラブルで費用対効果の高いアプリケーションを構築できます。 1.Brefは、最適化されたPHPランタイムレイヤーを提供し、PHP8.3およびその他のバージョンをサポートし、LaravelやSymfonyなどのフレームワークとシームレスに統合することにより、PHPをAwslambdaにもたらします。 2。展開手順には、次のものが含まれます。Composerを使用してBREFのインストール、httpエンドポイントや職人コマンドなどの関数とイベントを定義するためにserverless.ymlの構成。 3. serverlessdeployコマンドを実行して、展開を完了し、Apigatewayを自動的に構成し、アクセスURLを生成します。 4。Lambdaの制限については、Brefは解決策を提供します。

readonlypropertiesinphp8.2canonlybeassignedonedonedontheconstructoraturatiddeclaration andcannotBemodifiedifiedifiedifiedifiedifiedifiedifiadtivedabilityattthelanguagelele.2.

PHPのゴミ収集メカニズムは参照カウントに基づいていますが、周期的な円形のゴミコレクターによって円形の参照を処理する必要があります。 1。変数への参照がない場合、参照カウントはすぐにメモリを解放します。 2.参照参照により、メモリを自動的にリリースできなくなり、GCを検出およびクリーニングすることがGCに依存します。 3。GCは、「可能なルート」ZVALがしきい値に到達するか、GC_COLLECT_CYCLES()を手動で呼び出すとトリガーされます。 4.長期実行PHPアプリケーションは、メモリの漏れを避けるために、gc_status()を監視し、gc_collect_cycles()を呼び出す必要があります。 5.ベストプラクティスには、gc_disable()を使用してパフォーマンスキー領域を最適化し、ormのclear()メソッドを介して繰り返しのオブジェクトを最適化する回路参照の回避が含まれます。

GOのHTTPログミドルウェアは、リクエストメソッド、パス、クライアントIP、および時間がかかることを記録できます。 1. http.handlerfuncを使用してプロセッサをラップします。2。next.servehttpを呼び出す前後の開始時間と終了時間を記録します。完全なサンプルコードの実行が検証されており、中小のプロジェクトの開始に適しています。拡張機能の提案には、ステータスコードのキャプチャ、JSONログのサポート、リクエストIDトラッキングが含まれます。

まず、JavaScriptを使用して、ユーザーシステムの設定とローカルに保存されたテーマ設定を取得し、ページテーマを初期化します。 1. HTML構造には、トピックの切り替えをトリガーするボタンが含まれています。 2。CSSの使用:rootは明るいテーマ変数を定義し、.dark-modeクラスは暗いテーマ変数を定義し、これらの変数をvar()を介して適用します。 3. JavaScript検出は、カラーのスchemeを好み、LocalStorageを読み取り、最初のテーマを決定します。 4.ボタンをクリックするときにHTML要素のダークモードクラスを切り替え、現在の状態をLocalStorageに保存します。 5.すべての色の変更には、ユーザーを強化するために0.3秒の移行アニメーションが伴います

testthepdfinanapptodetermineisisiis withthefileoredge.2.enablethebuiltinpdfviewerbyturningoff "Alwaysopenpdffilesexternally" and "downloadpdffiles" inedgesettings.3.Clearbrowsingdataincluding andcachedfilestororeveren
