@@ -44,25 +44,26 @@ public static function getEvaluationResult($context): EvaluationResult
4444 $ evaluatedFeatures = [];
4545
4646 /** @var array<string, SegmentContext> */
47- $ matchedSegmentsByFeatureKey = [];
47+ $ matchedSegmentsByFeatureName = [];
4848
4949 /** @var array<string, FlagResult> */
5050 $ evaluatedFlags = [];
5151
52+ $ context = self ::getEnrichedContext ($ context );
53+
5254 foreach ($ context ->segments as $ segment ) {
5355 if (!self ::isContextInSegment ($ context , $ segment )) {
5456 continue ;
5557 }
5658
5759 $ segmentResult = new SegmentResult ();
58- $ segmentResult ->key = $ segment ->key ;
5960 $ segmentResult ->name = $ segment ->name ;
6061 $ segmentResult ->metadata = $ segment ->metadata ;
6162 $ evaluatedSegments [] = $ segmentResult ;
6263
6364 foreach ($ segment ->overrides as $ overrideFeature ) {
64- $ featureKey = $ overrideFeature ->feature_key ;
65- $ evaluatedFeature = $ evaluatedFeatures [$ featureKey ] ?? null ;
65+ $ featureName = $ overrideFeature ->name ;
66+ $ evaluatedFeature = $ evaluatedFeatures [$ featureName ] ?? null ;
6667 if ($ evaluatedFeature ) {
6768 $ overrideWinsPriority =
6869 ($ overrideFeature ->priority ?? self ::WEAKEST_PRIORITY ) <
@@ -72,19 +73,18 @@ public static function getEvaluationResult($context): EvaluationResult
7273 }
7374 }
7475
75- $ evaluatedFeatures [$ featureKey ] = $ overrideFeature ;
76- $ matchedSegmentsByFeatureKey [ $ featureKey ] = $ segment ;
76+ $ evaluatedFeatures [$ featureName ] = $ overrideFeature ;
77+ $ matchedSegmentsByFeatureName [ $ featureName ] = $ segment ;
7778 }
7879 }
7980
8081 foreach ($ context ->features as $ feature ) {
81- $ featureKey = $ feature ->feature_key ;
8282 $ featureName = $ feature ->name ;
83- $ evaluatedFeature = $ evaluatedFeatures [$ featureKey ] ?? null ;
83+ $ evaluatedFeature = $ evaluatedFeatures [$ featureName ] ?? null ;
8484 if ($ evaluatedFeature ) {
8585 $ evaluatedFlags [$ featureName ] = self ::getFlagResultFromSegmentContext (
8686 $ evaluatedFeature ,
87- $ matchedSegmentsByFeatureKey [ $ featureKey ],
87+ $ matchedSegmentsByFeatureName [ $ featureName ],
8888 );
8989 continue ;
9090 }
@@ -101,6 +101,24 @@ public static function getEvaluationResult($context): EvaluationResult
101101 return $ result ;
102102 }
103103
104+ /**
105+ * Get an enriched evaluation context with derived values:
106+ * - `$.identity.key` if missing
107+ * Returns a cloned context if any enrichment is applied.
108+ * Returns the original context if no enrichment is needed.
109+ * @param EvaluationContext $context
110+ * @return EvaluationContext
111+ */
112+ private static function getEnrichedContext (EvaluationContext $ context ): EvaluationContext
113+ {
114+ if ($ context ->identity !== null && $ context ->identity ->key === null ) {
115+ $ context = clone $ context ;
116+ $ context ->identity = clone $ context ->identity ;
117+ $ context ->identity ->key = "{$ context ->environment ->key }_ {$ context ->identity ->identifier }" ;
118+ }
119+ return $ context ;
120+ }
121+
104122 /**
105123 * @param EvaluationContext $context
106124 * @param SegmentContext $segment
@@ -147,7 +165,6 @@ private static function getFlagResultFromFeatureContext($feature, $splitKey)
147165 $ percentageValue < $ limit
148166 ) {
149167 $ flag = new FlagResult ();
150- $ flag ->feature_key = $ feature ->feature_key ;
151168 $ flag ->name = $ feature ->name ;
152169 $ flag ->enabled = $ feature ->enabled ;
153170 $ flag ->value = $ variant ->value ;
@@ -160,7 +177,6 @@ private static function getFlagResultFromFeatureContext($feature, $splitKey)
160177 }
161178
162179 $ flag = new FlagResult ();
163- $ flag ->feature_key = $ feature ->feature_key ;
164180 $ flag ->name = $ feature ->name ;
165181 $ flag ->enabled = $ feature ->enabled ;
166182 $ flag ->value = $ feature ->value ;
@@ -177,7 +193,6 @@ private static function getFlagResultFromFeatureContext($feature, $splitKey)
177193 private static function getFlagResultFromSegmentContext ($ feature , $ segment )
178194 {
179195 $ flag = new FlagResult ();
180- $ flag ->feature_key = $ feature ->feature_key ;
181196 $ flag ->name = $ feature ->name ;
182197 $ flag ->enabled = $ feature ->enabled ;
183198 $ flag ->value = $ feature ->value ;
@@ -259,7 +274,7 @@ private static function _contextMatchesCondition(
259274
260275 switch ($ condition ->operator ) {
261276 case SegmentConditionOperator::IN :
262- if ($ contextValue === null ) {
277+ if ($ contextValue === null || gettype ( $ contextValue ) === ' boolean ' ) {
263278 return false ;
264279 }
265280 if (is_array ($ condition ->value )) {
@@ -278,7 +293,8 @@ private static function _contextMatchesCondition(
278293 $ inValues = explode (', ' , $ condition ->value );
279294 }
280295 }
281- $ inValues = array_map ($ cast , $ inValues );
296+ $ contextValue = strval ($ contextValue );
297+ $ inValues = array_map ('strval ' , $ inValues );
282298 return in_array ($ contextValue , $ inValues , strict: true );
283299
284300 case SegmentConditionOperator::PERCENTAGE_SPLIT :
0 commit comments