26
26
use MongoDB \Exception \UnsupportedValueException ;
27
27
use stdClass ;
28
28
29
+ use function array_key_exists ;
29
30
use function is_object ;
30
31
31
32
/** @template-implements Encoder<stdClass|array|string, Pipeline|StageInterface|ExpressionInterface|QueryInterface> */
@@ -45,7 +46,7 @@ class BuilderEncoder implements Encoder
45
46
OperatorInterface::class => OperatorEncoder::class,
46
47
];
47
48
48
- /** @var array<class-string, ExpressionEncoder> */
49
+ /** @var array<class-string, ExpressionEncoder|null > */
49
50
private array $ cachedEncoders = [];
50
51
51
52
/** @param array<class-string, class-string<ExpressionEncoder>> $customEncoders */
@@ -77,17 +78,15 @@ public function encode(mixed $value): stdClass|array|string
77
78
private function getEncoderFor (object $ value ): ExpressionEncoder |null
78
79
{
79
80
$ valueClass = $ value ::class;
80
- if (isset ( $ this ->cachedEncoders [ $ valueClass ] )) {
81
+ if (array_key_exists ( $ valueClass , $ this ->cachedEncoders )) {
81
82
return $ this ->cachedEncoders [$ valueClass ];
82
83
}
83
84
84
85
$ encoderList = $ this ->customEncoders + $ this ->defaultEncoders ;
85
86
86
87
// First attempt: match class name exactly
87
- foreach ($ encoderList as $ className => $ encoderClass ) {
88
- if ($ className === $ valueClass ) {
89
- return $ this ->cachedEncoders [$ valueClass ] = new $ encoderClass ($ this );
90
- }
88
+ if (isset ($ encoderList [$ valueClass ])) {
89
+ return $ this ->cachedEncoders [$ valueClass ] = new $ encoderList [$ valueClass ]($ this );
91
90
}
92
91
93
92
// Second attempt: catch child classes
@@ -97,6 +96,6 @@ private function getEncoderFor(object $value): ExpressionEncoder|null
97
96
}
98
97
}
99
98
100
- return null ;
99
+ return $ this -> cachedEncoders [ $ valueClass ] = null ;
101
100
}
102
101
}
0 commit comments