


So überwinden Sie die Namensbeschränkungen von PHP zur Modellierung von MongoDB-Operatoren
MongoDB bietet Treiber für verschiedene Sprachen, einschließlich PHP. Um den Prozess der Erstellung von Aggregationspipelines in PHP zu vereinfachen, müssen wir alle Phasen und Operatoren als zusammensetzbare Funktionen modellieren.
Aggregationspipeline ist eine Liste von „Stufen“-Dokumenten. Wir geben ein Beispiel für die Abfrage von $match und die Verknüpfung mit $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" } } ])
Jeder Schlüssel mit einem Dollar-Präfix ist ein Operator, für den wir eine Factory-Methode bereitstellen möchten.
Namespace-Funktionen
Die naheliegendste Lösung besteht darin, eine Namespace-Funktion zu erstellen, zum Beispiel: MongoDBOperatoreqof$eq-Operator.
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, ]]; }
Bei Verwendung von Funktionen mit benannten Parametern werden Pipes in PHP geschrieben:
pipeline( match( or( query(status: eq('shipped')), query(date: gte(new UTCDateTime())), ), ), lookup(from: 'inventory', localField: 'product_id', foreignField: 'product_id', as: 'inventory_docs'), );
Allerdings stehen einige Operatornamen im Konflikt mit reservierten Schlüsselwörtern in PHP. Wir können keine Funktionen (global oder Namespace) mit den folgenden Namen erstellen:
and,
or,
match,
unset,
set,
Suffix zum Funktionsnamen hinzufügen
Um das Problem der Namensspeicherung zu vermeiden, können wir dem Funktionsnamen ein Präfix oder Suffix hinzufügen.
Mit dem Operatortyp angehängt:
function andQuery(...) { /* ... */ } function matchStage(...) { /* ... */ }
Unterstrichen:
function _and(...) { /* ... */ } function _match(...) { /* ... */ }
Oder verwenden Sie Emoticons. Schön, aber unpraktisch:
function ?and(...) { /* ... */ } function ?match(...) { /* ... */ }
Statische Klassenmethode
Zufällig ist die Liste der reservierten Schlüsselwörter für Methodennamen kürzer. Wir können statische Methoden für Klassen erstellen.
final class Stage { public static function lookup(...) { /* ... */ } public static function match(...) { /* ... */ } } final class Query { public static function and(...) { /* ... */ } public static function eq(...) { /* ... */ } }
Der Text ist etwas lang, aber dennoch lesbar.
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'), );
Um zu verhindern, dass jemand eine Instanz dieser Klasse erstellt, können wir den Konstruktor privat machen.
final class Operator { // ... private function __construct() {} // This constructor cannot be called }
Wir können enum auch ohne Shell verwenden. Enum akzeptiert statische Methoden und kann nicht instanziiert werden.
enum Query { public static function and() { /* ... */ } public static function eq() { /* ... */ } }
Statische Klassen- und Aufzählungsmethoden können auf die gleiche Weise aufgerufen werden.
Abschlüsse in Variablen
Da wir keine ideale Lösung finden konnten, begannen wir, uns für unwahrscheinliche Lösungen zu begeistern.
Wenn wir eine kurze Syntax wünschen, die der MongoDB-Syntax ohne Namensbeschränkungen sehr ähnlich sieht, dann würden wir über die Verwendung von Variablen zum Speichern von Abschlüssen nachdenken. Beachten Sie, dass dies (...) die neue Syntax zum Erstellen von Abschlüssen in PHP 8.1 ist.
$eq = Operator::eq(...); $and = Operator::and(...);
$PHP verwendet ein Dollarzeichen für variable Präfixe und MongoDB verwendet denselben Operator für Präfixe.
pipeline( $match( $or( $query(status: $eq('shipped')), $query(date: $gte(new UTCDateTime())), ), ), $lookup(from: 'inventory', localField: 'product_id', foreignField: 'product_id', as: 'inventory_docs'), );
Die Bibliothek kann diese Abschlüsse als Arrays bereitstellen.
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(...), ]; } }
Die Syntax zum Abrufen aller Variablen ist etwas ausführlich, aber dennoch lesbar.
['and' => $and, 'eq' => $eq, 'query' => $query] = Query::functions();
extrahieren Wir können alle Variablen in den aktuellen Bereich importieren, indem wir eine magische Funktion in Laravel verwenden, die oft verwendet wird, aber von PHPStorm und statischen Analysetools gehasst wird.
extract(Query::functions()); var_dump($and( $query(foo: $eq(5)), $query(bar: $eq(10)) )); // INFO: MixedFunctionCall - Cannot call function on mixed
Fazit
Wie Sie sehen, ist die Benennung von Funktionen in PHP nicht so einfach, wenn reservierte Schlüsselwörter verwendet werden.
Das obige ist der detaillierte Inhalt vonSo überwinden Sie die Namensbeschränkungen von PHP zur Modellierung von MongoDB-Operatoren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



JWT ist ein offener Standard, der auf JSON basiert und zur sicheren Übertragung von Informationen zwischen Parteien verwendet wird, hauptsächlich für die Identitätsauthentifizierung und den Informationsaustausch. 1. JWT besteht aus drei Teilen: Header, Nutzlast und Signatur. 2. Das Arbeitsprinzip von JWT enthält drei Schritte: Generierung von JWT, Überprüfung von JWT und Parsingnayload. 3. Bei Verwendung von JWT zur Authentifizierung in PHP kann JWT generiert und überprüft werden, und die Funktionen und Berechtigungsinformationen der Benutzer können in die erweiterte Verwendung aufgenommen werden. 4. Häufige Fehler sind Signaturüberprüfungsfehler, Token -Ablauf und übergroße Nutzlast. Zu Debugging -Fähigkeiten gehört die Verwendung von Debugging -Tools und Protokollierung. 5. Leistungsoptimierung und Best Practices umfassen die Verwendung geeigneter Signaturalgorithmen, das Einstellen von Gültigkeitsperioden angemessen.

In PHP8 sind Übereinstimmungsausdrücke eine neue Kontrollstruktur, die unterschiedliche Ergebnisse basierend auf dem Wert des Expression zurückgibt. 1) Es ähnelt einer Switch -Anweisung, gibt jedoch einen Wert anstelle eines Ausführungsanweisungsblocks zurück. 2) Der Match -Ausdruck wird streng verglichen (===), was die Sicherheit verbessert. 3) Es vermeidet mögliche Auslassungen in Switch -Anweisungen und verbessert die Einfachheit und Lesbarkeit des Codes.

In PHP können Sie CSRF -Angriffe effektiv verhindern, indem Sie unvorhersehbare Token verwenden. Spezifische Methoden umfassen: 1. CSRF -Token in der Form erzeugen und einbetten; 2. Überprüfen Sie die Gültigkeit des Tokens bei der Bearbeitung der Anfrage.

In PHP wird das endgültige Schlüsselwort verwendet, um zu verhindern, dass Klassen vererbt werden, und die Methoden überschrieben werden. 1) Wenn die Klasse als endgültig markiert wird, kann die Klasse nicht vererbt werden. 2) Wenn die Methode als endgültig markiert wird, kann die Methode nicht von der Unterklasse neu geschrieben werden. Durch die Verwendung von endgültigen Schlüsselwörtern wird die Stabilität und Sicherheit Ihres Codes sichergestellt.

Der ... (SPLAT) -Operator in PHP wird verwendet, um Funktionsparameter und Arrays auszupacken, wodurch die Einfachheit und Effizienz der Code verbessert wird. 1) Funktionsparameter Auspacken: Übergeben Sie das Array -Element als Parameter an die Funktion. 2) Array -Auspacken: Auspacken Sie ein Array in ein anderes Array oder als Funktionsparameter.

Strenge Typen in PHP werden durch Hinzufügen von Declare aktiviert (strict_types = 1); oben in der Datei. 1) IT erzwingt die Typprüfung der Funktionsparameter und der Rückgabewerte, um die implizite Typumwandlung zu verhindern. 2) Die Verwendung strenger Typen kann die Zuverlässigkeit und Vorhersehbarkeit des Codes verbessern, Fehler reduzieren und die Wartbarkeit und Lesbarkeit verbessern.

Composer ist ein Abhängigkeitsmanagement -Tool für PHP. Zu den Kernschritten für die Verwendung von Komponisten gehören: 1) Deponcies in Composer.json wie "Stripe/Stripe-Php": "^7.0"; 2) CompoSerinstall ausführen, um Abhängigkeiten herunterzuladen und zu konfigurieren. 3) Verwalten Sie Versionen und Autoloads über Composer.lock und autoload.php. Composer vereinfacht das Abhängigkeitsmanagement und verbessert die Projekteffizienz und -wartbarkeit.

Die Zukunft von PHP wird erreicht, indem sich an neue Technologietrends angepasst und innovative Funktionen eingeführt werden: 1) Anpassung an Cloud Computing, Containerisierung und Microservice -Architekturen, Unterstützung von Docker und Kubernetes; 2) Einführung von JIT -Compilern und Aufzählungsarten zur Verbesserung der Leistung und der Datenverarbeitungseffizienz; 3) die Leistung kontinuierlich optimieren und Best Practices fördern.
