Rumah pembangunan bahagian belakang tutorial php Bagaimana untuk mengatasi had penamaan PHP untuk memodelkan pengendali MongoDB

Bagaimana untuk mengatasi had penamaan PHP untuk memodelkan pengendali MongoDB

Oct 18, 2023 am 10:56 AM
php mongodb

MongoDB menyediakan pemacu untuk pelbagai bahasa termasuk PHP. Untuk memudahkan proses mencipta saluran paip pengagregatan dalam PHP, kita perlu memodelkan semua peringkat dan pengendali sebagai fungsi yang boleh digubah.

Saluran paip pengagregatan ialah senarai dokumen "peringkat". Kami akan memberikan contoh pertanyaan $match dan menyertai menggunakan $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"
        }
    }
])
Salin selepas log masuk

Setiap kunci dengan awalan dolar ialah operator yang kami mahu sediakan kaedah kilang.

Fungsi ruang nama

Penyelesaian yang paling jelas ialah mencipta fungsi ruang nama, contohnya: operator 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,
    ]];
}
Salin selepas log masuk

Menggunakan fungsi dengan parameter bernama, paip akan ditulis dalam 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'),
);
Salin selepas log masuk

Walau bagaimanapun, sesetengah nama operator bercanggah dengan kata kunci simpanan dalam PHP. Kami tidak boleh mencipta fungsi (global atau ruang nama) dengan nama berikut:

dan,

atau,

padanan,

nyahset,

set,

Tambah akhiran pada nama fungsi

Untuk mengelakkan masalah pengekalan nama, kita boleh menambah awalan atau akhiran pada nama fungsi.

Diakhiri dengan jenis operator:

function andQuery(...) { /* ... */ }
function matchStage(...) { /* ... */ }
Salin selepas log masuk

Bergaris bawah:

function _and(...) { /* ... */ }
function _match(...) { /* ... */ }
Salin selepas log masuk

Atau gunakan emotikon. Cantik, tetapi tidak praktikal:

function ?and(...) { /* ... */ }
function ?match(...) { /* ... */ }
Salin selepas log masuk

Kaedah kelas statik

Apabila berlaku, senarai kata kunci yang dikhaskan untuk nama kaedah adalah lebih pendek. Kita boleh mencipta kaedah statik pada kelas.

final class Stage {
    public static function lookup(...) { /* ... */ }
    public static function match(...) { /* ... */ }
}
final class Query {
    public static function and(...) { /* ... */ }
    public static function eq(...) { /* ... */ }
}
Salin selepas log masuk

Tulisannya agak panjang, tetapi masih boleh dibaca.

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'),
);
Salin selepas log masuk

Untuk menghalang sesiapa daripada mencipta tika kelas ini, kita boleh menjadikan pembina peribadi.

final class Operator {
    // ...
    private function __construct() {} // This constructor cannot be called 
}
Salin selepas log masuk

Kita juga boleh menggunakan enum tanpa cangkerang. Enum menerima kaedah statik dan tidak boleh digunakan.

enum Query {
    public static function and() { /* ... */ }
    public static function eq() { /* ... */ }
}
Salin selepas log masuk

Kedua-dua kaedah statik kelas dan penghitungan boleh dipanggil dengan cara yang sama.

Penutupan dalam pembolehubah

Memandangkan kami tidak dapat mencari penyelesaian yang ideal, kami mula bersemangat tentang penyelesaian yang tidak mungkin.

Jika kami mahukan sintaks pendek yang kelihatan sangat serupa dengan sintaks MongoDB tanpa sekatan nama, maka kami akan memikirkan untuk menggunakan pembolehubah untuk menyimpan penutupan. Ambil perhatian bahawa ini (...) ialah sintaks baharu untuk membuat penutupan dalam PHP 8.1.

$eq = Operator::eq(...);
$and = Operator::and(...);
Salin selepas log masuk

$PHP menggunakan tanda dolar untuk awalan berubah dan MongoDB menggunakan operator yang sama untuk awalan.

pipeline(
    $match(
        $or(
            $query(status: $eq('shipped')),
            $query(date: $gte(new UTCDateTime())),
        ),
    ),
    $lookup(from: 'inventory', localField: 'product_id', foreignField: 'product_id', as: 'inventory_docs'),
);
Salin selepas log masuk

Pustaka boleh menyediakan penutupan ini sebagai tatasusunan.

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(...),
        ];
    }
}
Salin selepas log masuk

Sintaks untuk mendapatkan semua pembolehubah agak bertele-tele, tetapi masih boleh dibaca.

['and' => $and, 'eq' => $eq, 'query' => $query] = Query::functions();
Salin selepas log masuk

ekstrak Kami boleh mengimport semua pembolehubah ke dalam skop semasa menggunakan ciri ajaib dalam Laravel yang sering digunakan tetapi dibenci oleh PHPStorm dan alat analisis statik.

extract(Query::functions());
var_dump($and(
    $query(foo: $eq(5)),
    $query(bar: $eq(10))
));
// INFO: MixedFunctionCall - Cannot call function on mixed
Salin selepas log masuk

Kesimpulan

Seperti yang anda lihat, penamaan fungsi dalam PHP tidak semudah itu apabila menggunakan kata kunci simpanan.

Atas ialah kandungan terperinci Bagaimana untuk mengatasi had penamaan PHP untuk memodelkan pengendali MongoDB. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Jelaskan JSON Web Tokens (JWT) dan kes penggunaannya dalam PHP API. Jelaskan JSON Web Tokens (JWT) dan kes penggunaannya dalam PHP API. Apr 05, 2025 am 12:04 AM

JWT adalah standard terbuka berdasarkan JSON, yang digunakan untuk menghantar maklumat secara selamat antara pihak, terutamanya untuk pengesahan identiti dan pertukaran maklumat. 1. JWT terdiri daripada tiga bahagian: header, muatan dan tandatangan. 2. Prinsip kerja JWT termasuk tiga langkah: menjana JWT, mengesahkan JWT dan muatan parsing. 3. Apabila menggunakan JWT untuk pengesahan di PHP, JWT boleh dijana dan disahkan, dan peranan pengguna dan maklumat kebenaran boleh dimasukkan dalam penggunaan lanjutan. 4. Kesilapan umum termasuk kegagalan pengesahan tandatangan, tamat tempoh, dan muatan besar. Kemahiran penyahpepijatan termasuk menggunakan alat debugging dan pembalakan. 5. Pengoptimuman prestasi dan amalan terbaik termasuk menggunakan algoritma tandatangan yang sesuai, menetapkan tempoh kesahihan dengan munasabah,

Terangkan pengikatan statik lewat dalam php (statik: :). Terangkan pengikatan statik lewat dalam php (statik: :). Apr 03, 2025 am 12:04 AM

Mengikat statik (statik: :) Melaksanakan pengikatan statik lewat (LSB) dalam PHP, yang membolehkan kelas panggilan dirujuk dalam konteks statik dan bukannya menentukan kelas. 1) Proses parsing dilakukan pada masa runtime, 2) Cari kelas panggilan dalam hubungan warisan, 3) ia boleh membawa overhead prestasi.

Apakah kaedah Magic PHP (__construct, __destruct, __call, __get, __set, dll) dan menyediakan kes penggunaan? Apakah kaedah Magic PHP (__construct, __destruct, __call, __get, __set, dll) dan menyediakan kes penggunaan? Apr 03, 2025 am 12:03 AM

Apakah kaedah sihir PHP? Kaedah sihir PHP termasuk: 1. \ _ \ _ Membina, digunakan untuk memulakan objek; 2. \ _ \ _ Destruct, digunakan untuk membersihkan sumber; 3. \ _ \ _ Call, mengendalikan panggilan kaedah yang tidak wujud; 4. \ _ \ _ Mendapatkan, melaksanakan akses atribut dinamik; 5. \ _ \ _ Set, melaksanakan tetapan atribut dinamik. Kaedah ini secara automatik dipanggil dalam situasi tertentu, meningkatkan fleksibiliti dan kecekapan kod.

Terangkan ungkapan perlawanan (Php 8) dan bagaimana ia berbeza dari suis. Terangkan ungkapan perlawanan (Php 8) dan bagaimana ia berbeza dari suis. Apr 06, 2025 am 12:03 AM

Dalam Php8, ungkapan perlawanan adalah struktur kawalan baru yang mengembalikan hasil yang berbeza berdasarkan nilai ungkapan. 1) Ia sama dengan pernyataan suis, tetapi mengembalikan nilai dan bukannya blok pernyataan pelaksanaan. 2) Ekspresi perlawanan secara ketat (===), yang meningkatkan keselamatan. 3) Ia mengelakkan kemungkinan ketinggalan dalam penyataan suis dan meningkatkan kesederhanaan dan kebolehbacaan kod.

Cara mengkonfigurasi pengembangan automatik MongoDB pada Debian Cara mengkonfigurasi pengembangan automatik MongoDB pada Debian Apr 02, 2025 am 07:36 AM

Artikel ini memperkenalkan cara mengkonfigurasi MongoDB pada sistem Debian untuk mencapai pengembangan automatik. Langkah -langkah utama termasuk menubuhkan set replika MongoDB dan pemantauan ruang cakera. 1. Pemasangan MongoDB Pertama, pastikan MongoDB dipasang pada sistem Debian. Pasang menggunakan arahan berikut: SudoaptDateSudoaptInstall-ImongoDB-Org 2. Mengkonfigurasi set replika replika MongoDB MongoDB Set memastikan ketersediaan dan kelebihan data yang tinggi, yang merupakan asas untuk mencapai pengembangan kapasiti automatik. Mula MongoDB Service: sudosystemctlstartmongodsudosys

Apakah pemalsuan permintaan lintas tapak (CSRF) dan bagaimana anda melaksanakan perlindungan CSRF di PHP? Apakah pemalsuan permintaan lintas tapak (CSRF) dan bagaimana anda melaksanakan perlindungan CSRF di PHP? Apr 07, 2025 am 12:02 AM

Dalam PHP, anda boleh mencegah serangan CSRF dengan menggunakan token yang tidak dapat diramalkan. Kaedah khusus termasuk: 1. Menjana dan membenamkan token CSRF dalam bentuk; 2. Sahkan kesahihan token semasa memproses permintaan.

Huraikan tujuan dan penggunaan operator ... (splat) dalam argumen fungsi PHP dan array membongkar. Huraikan tujuan dan penggunaan operator ... (splat) dalam argumen fungsi PHP dan array membongkar. Apr 06, 2025 am 12:07 AM

Pengendali ... (Splat) dalam PHP digunakan untuk membongkar parameter fungsi dan tatasusunan, meningkatkan kesederhanaan dan kecekapan kod. 1) Parameter Fungsi Membongkar: Lulus elemen array sebagai parameter ke fungsi. 2) Array Unpacking: Buka array ke array lain atau sebagai parameter fungsi.

Bagaimanakah anda dapat mengelakkan kelas daripada dilanjutkan atau kaedah yang ditindas dalam PHP? (kata kunci akhir) Bagaimanakah anda dapat mengelakkan kelas daripada dilanjutkan atau kaedah yang ditindas dalam PHP? (kata kunci akhir) Apr 08, 2025 am 12:03 AM

Dalam PHP, kata kunci akhir digunakan untuk mencegah kelas daripada diwarisi dan kaedah ditimpa. 1) Apabila menandakan kelas sebagai muktamad, kelas tidak boleh diwarisi. 2) Apabila menandakan kaedah sebagai muktamad, kaedah itu tidak boleh ditulis semula oleh subkelas. Menggunakan kata kunci akhir memastikan kestabilan dan keselamatan kod anda.

See all articles