MongoDB 연산자를 모델링하기 위해 PHP의 명명 제한을 극복하는 방법
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,
또는
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 자주 사용되지만 PHPStorm 및 정적 분석 도구에서는 싫어하는 Laravel의 마법 같은 기능을 사용하여 모든 변수를 현재 범위로 가져올 수 있습니다.
extract(Query::functions()); var_dump($and( $query(foo: $eq(5)), $query(bar: $eq(10)) )); // INFO: MixedFunctionCall - Cannot call function on mixed
결론
보시다시피 PHP에서 예약어를 사용하면 함수 이름 지정이 그리 간단하지 않습니다.
위 내용은 MongoDB 연산자를 모델링하기 위해 PHP의 명명 제한을 극복하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











JWT는 주로 신분증 인증 및 정보 교환을 위해 당사자간에 정보를 안전하게 전송하는 데 사용되는 JSON을 기반으로 한 개방형 표준입니다. 1. JWT는 헤더, 페이로드 및 서명의 세 부분으로 구성됩니다. 2. JWT의 작업 원칙에는 세 가지 단계가 포함됩니다. JWT 생성, JWT 확인 및 Parsing Payload. 3. PHP에서 인증에 JWT를 사용하면 JWT를 생성하고 확인할 수 있으며 사용자 역할 및 권한 정보가 고급 사용에 포함될 수 있습니다. 4. 일반적인 오류에는 서명 검증 실패, 토큰 만료 및 대형 페이로드가 포함됩니다. 디버깅 기술에는 디버깅 도구 및 로깅 사용이 포함됩니다. 5. 성능 최적화 및 모범 사례에는 적절한 시그니처 알고리즘 사용, 타당성 기간 설정 합리적,

PHP8에서 매치 표현식은 표현식의 값에 따라 다른 결과를 반환하는 새로운 제어 구조입니다. 1) 스위치 명령문과 유사하지만 실행 명령문 블록 대신 값을 반환합니다. 2) 경기 표현식은 엄격하게 비교되어 (===) 보안을 향상시킵니다. 3) 스위치 명세서에서 가능한 파손을 피하고 코드의 단순성과 가독성을 향상시킵니다.

PHP에서는 예측할 수없는 토큰을 사용하여 CSRF 공격을 효과적으로 방지 할 수 있습니다. 특정 방법은 다음과 같습니다. 1. 형태로 CSRF 토큰을 생성하고 포함시킨다. 2. 요청을 처리 할 때 토큰의 유효성을 확인하십시오.

PHP에서 최종 키워드는 클래스가 상속되고 메소드가 덮어 쓰는 것을 방지하는 데 사용됩니다. 1) 클래스를 최종적으로 표시 할 때는 수업을 상속받을 수 없습니다. 2) 메소드를 최종으로 표시 할 때는 메소드를 서브 클래스로 다시 작성할 수 없습니다. 최종 키워드를 사용하면 코드의 안정성과 보안이 보장됩니다.

PHP의 ... (SPLAT) 연산자는 기능 매개 변수 및 배열을 포장하여 코드 단순성 및 효율성을 향상시키는 데 사용됩니다. 1) 함수 매개 변수 풀기 : 배열 요소를 함수로 매개 변수로 전달합니다. 2) 배열 풀기 : 배열을 다른 배열 또는 함수 매개 변수로 포장합니다.

php의 엄격한 유형은 declare (strict_types = 1)를 추가하여 활성화됩니다. 파일 상단에서. 1) 함정 유형 변환을 방지하기 위해 함수 매개 변수 및 리턴 값의 검사 유형 검사를 강요합니다. 2) 엄격한 유형을 사용하면 코드의 신뢰성과 예측 가능성을 향상시키고 버그를 줄이며 유지 관리 및 가독성을 향상시킬 수 있습니다.

Composer는 PHP의 종속성 관리 도구입니다. 작곡가를 사용하는 핵심 단계는 다음과 같습니다. 1) Composer.json의 종속성 선언 "Stripe/Stripe-PHP": "^7.0"; 2) ComposerInstall을 실행하여 종속성을 다운로드하고 구성합니다. 3) Composer.lock 및 Autoload.php를 통해 버전 및 자동로드를 관리합니다. 작곡가는 종속성 관리를 단순화하고 프로젝트 효율성과 유지 관리를 향상시킵니다.

PHP의 미래는 새로운 기술 트렌드에 적응하고 혁신적인 기능을 도입함으로써 달성 될 것입니다. 1) 클라우드 컴퓨팅, 컨테이너화 및 마이크로 서비스 아키텍처에 적응, Docker 및 Kubernetes 지원; 2) 성능 및 데이터 처리 효율을 향상시키기 위해 JIT 컴파일러 및 열거 유형을 도입합니다. 3) 지속적으로 성능을 최적화하고 모범 사례를 홍보합니다.
