PHP の命名制限を克服して MongoDB オペレーターをモデル化する方法
MongoDB は、PHP を含むさまざまな言語用のドライバーを提供します。 PHP で集計パイプラインを作成するプロセスを簡素化するには、すべてのステージと演算子を構成可能な関数としてモデル化する必要があります。
集約パイプラインは「ステージ」ドキュメントのリストです。 $match をクエリし、$lookup を使用して結合する例を示します。
db.orders.aggregate([ { $match: { $or: [ { status: "shipped" }, { created_at: { $gte: ISODate("2023-01-01T00:00:00Z") } } ] } }, { $lookup: { from: "inventory", localField: "product_id", foreignField: "product_id", as: "inventory_docs" } } ])
ドルの接頭辞が付いた各キーは、ファクトリ メソッドを提供する演算子です。
名前空間関数
最も明白な解決策は、名前空間関数を作成することです (例: MongoDBOperatoreqof$eq 演算子)。
namespace MongoDB\Operator; function eq(mixed $value): array { return ['$eq' => $value]; } function lookup(string $from, string $localField, string $foreignField, string $as): array { return ['$lookup' => [ 'from' => $from, 'localField' => $localField, 'foreignField' => $foreignField, 'as' => $as, ]]; }
名前付きパラメータを持つ関数を使用すると、パイプは PHP で記述されます:
pipeline( match( or( query(status: eq('shipped')), query(date: gte(new UTCDateTime())), ), ), lookup(from: 'inventory', localField: 'product_id', foreignField: 'product_id', as: 'inventory_docs'), );
ただし、一部の演算子名は PHP の予約キーワードと競合します。次の名前の関数 (グローバルまたは名前空間) を作成することはできません:
and、
or、
match、
unset、
set,
関数名にサフィックスを追加
名前保持の問題を回避するために、関数名にプレフィックスまたはサフィックスを追加できます。
演算子の種類を末尾に付ける:
function andQuery(...) { /* ... */ } function matchStage(...) { /* ... */ }
下線付き:
function _and(...) { /* ... */ } function _match(...) { /* ... */ }
または絵文字を使用します。きれいですが、非現実的です:
function ?and(...) { /* ... */ } function ?match(...) { /* ... */ }
静的クラス メソッド
偶然ですが、メソッド名の予約キーワードのリストは短くなります。クラス上に静的メソッドを作成できます。
final class Stage { public static function lookup(...) { /* ... */ } public static function match(...) { /* ... */ } } final class Query { public static function and(...) { /* ... */ } public static function eq(...) { /* ... */ } }
文章は少し長いですが、それでも読みやすいです。
new Pipeline( Stage::match( Query::or( Query::query(status: Query::eq('shipped')), Query::query(date: Query::gte(new UTCDateTime())), ), ), Stage::lookup(from: 'inventory', localField: 'product_id', foreignField: 'product_id', as: 'inventory_docs'), );
誰もこのクラスのインスタンスを作成できないようにするには、コンストラクターをプライベートにします。
final class Operator { // ... private function __construct() {} // This constructor cannot be called }
シェルなしで enum を使用することもできます。 Enum は静的メソッドを受け入れますが、インスタンス化することはできません。
enum Query { public static function and() { /* ... */ } public static function eq() { /* ... */ } }
クラス静的メソッドと列挙静的メソッドの両方を同じ方法で呼び出すことができます。
変数のクロージャ
理想的な解決策が見つからなかったため、私たちはありそうもない解決策に熱中し始めました。
名前の制限がない MongoDB 構文によく似た短い構文が必要な場合は、クロージャを格納するために変数を使用することを考えるでしょう。これ (...) は、PHP 8.1 でクロージャを作成するための新しい構文であることに注意してください。
$eq = Operator::eq(...); $and = Operator::and(...);
$PHP は変数の接頭辞にドル記号を使用し、MongoDB は接頭辞に同じ演算子を使用します。
pipeline( $match( $or( $query(status: $eq('shipped')), $query(date: $gte(new UTCDateTime())), ), ), $lookup(from: 'inventory', localField: 'product_id', foreignField: 'product_id', as: 'inventory_docs'), );
ライブラリはこれらのクロージャを配列として提供できます。
enum Query { public static function and(array ...$queries) { /* ... */ } public static function eq(mixed $value) { /* ... */ } public static function query(mixed ...$query) { /* ... */ } /** @return array{and:callable,eq:callable,query:callable} */ public static function functions(): array { return [ 'and' => self::and(...), 'eq' => self::eq(...), 'query' => self::query(...), ]; } }
すべての変数を取得するための構文は少し冗長ですが、それでも読みやすいです。
['and' => $and, 'eq' => $eq, 'query' => $query] = Query::functions();
extract Laravel の魔法の機能を使用して、すべての変数を現在のスコープにインポートできます。この機能は頻繁に使用されますが、PHPStorm や静的分析ツールでは嫌われています。
extract(Query::functions()); var_dump($and( $query(foo: $eq(5)), $query(bar: $eq(10)) )); // INFO: MixedFunctionCall - Cannot call function on mixed
結論
ご覧のとおり、予約キーワードを使用する場合、PHP での関数の名前付けはそれほど単純ではありません。
以上がPHP の命名制限を克服して MongoDB オペレーターをモデル化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

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

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

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

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

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

ホットトピック









JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

PHP8では、一致式は、式の値に基づいて異なる結果を返す新しい制御構造です。 1)Switchステートメントに似ていますが、実行ステートメントブロックの代わりに値を返します。 2)一致式の式は厳密に比較され、セキュリティが向上します。 3)スイッチステートメントの脱落の可能性を回避し、コードのシンプルさと読みやすさを向上させます。

PHPでは、予測不可能なトークンを使用して、CSRF攻撃を効果的に防ぐことができます。特定の方法には次のものが含まれます。1。フォームのCSRFトークンを生成および埋め込みます。 2.リクエストを処理するときにトークンの有効性を確認します。

PHPでは、最終的なキーワードを使用して、クラスが継承されないようにし、メソッドが上書きされます。 1)クラスを決勝としてマークする場合、クラスを継承することはできません。 2)メソッドを最終的にマークする場合、メソッドはサブクラスによって書き換えられません。最終的なキーワードを使用すると、コードの安定性とセキュリティが保証されます。

PHPの...(SPLAT)演算子は、機能パラメーターと配列を開梱するために使用され、コードのシンプルさと効率を向上させます。 1)関数パラメーター解放:アレイ要素をパラメーターとして関数に渡します。 2)配列の開梱:アレイを別の配列または関数パラメーターに解除します。

PHPの厳格なタイプは、declare(strict_types = 1)を追加することで有効になります。ファイルの上部に。 1)関数パラメーターのタイプチェックと戻り値を強制して、暗黙の型変換を防ぎます。 2)厳格なタイプを使用すると、コードの信頼性と予測可能性を改善し、バグを減らし、保守性と読みやすさを向上させることができます。

作曲家は、PHPの依存関係管理ツールです。 Composerを使用するコアステップは次のとおりです。1)「Stripe/Stripe-PHP」などのComposer.jsonの依存関係を宣言:「^7.0」; 2)ComposerInStallを実行して、依存関係をダウンロードおよび構成します。 3)Composer.LockおよびAutoload.phpを介してバージョンとオートロードを管理します。 Composerは依存関係管理を簡素化し、プロジェクトの効率と保守性を向上させます。

PHPの将来は、新しいテクノロジーの傾向に適応し、革新的な機能を導入することで達成されます。1)クラウドコンピューティング、コンテナ化、マイクロサービスアーキテクチャに適応し、DockerとKubernetesをサポートします。 2)パフォーマンスとデータ処理の効率を改善するために、JITコンパイラと列挙タイプを導入します。 3)パフォーマンスを継続的に最適化し、ベストプラクティスを促進します。
