<?php
enum E: int { case A = 1; case B = 2; }
var_export(in_array(1, [E::A], false));
echo "\n";
var_export(in_array(E::A, [1], false));
echo "\n";
var_export(in_array('1', [E::A], false));
echo "\n";
var_export(in_array(E::A, [E::A], true)); // must stay true
echo "\n";
./script/docker-exec.sh -- bash -lc 'source script/php-env.sh
php -r "enum E:int{case A=1;} var_export(in_array(1,[E::A],false)); echo \"\\n\";"
php bin/vm.php -r "enum E:int{case A=1;} var_export(in_array(1,[E::A],false)); echo \"\\n\";"
'
Category
stdlibProblem
With loose comparison (
$strict = false),in_array()must not treat a backed enum case as equal to its backing scalar (and vice versa). This compiler usesVariable::equals()which coerces enum cases to ints/strings, soin_array(1, [E::A], false)is true; Zend returns false.php-src reference
ext/standard/array.c—php_in_array,zend_compareonIS_OBJECTenum casesZend/zend_enum.c— enum object identity in comparisonsRepro (verified 2026-06-04)
in_array(1, [E::A], false)falsetruein_array(E::A, [1], false)falsetruein_array(E::A, [E::A], true)truetrueScope (this repo)
ext/standard/in_array.php—looseEquals()/equals()pathlib/VM/Variable.php— enum-aware loose compare (coordinate #5178 loose==)ext/standard/in_array.phpJIT lowering viaArrayBuiltinHelpertest/compliance/cases/stdlib/in_array_enum_loose.phptDone when
false; strict identity linetrue./script/ci-fast.sh --filter in_array_enumgreenRelated
==int/string · enum array coercion cluster (Stdlib: array_map()/array_filter() on enum arrays must preserve enum case objects (ext/standard/array.c) #5564–Stdlib: array_pop()/array_shift()/array_unshift()/array_splice() on enum case arrays coerces to backed scalars (ext/standard/array.c) #5586)