📊 PHP 8.x Comparison Cheat Sheet

Valid for PHP 8.0 - 8.5 – behavior is consistent across all these versions. (See results for PHP 7.x)

Operator ==

true
false
Error
"0""0.0"0"foo"""" 42""042""42""42foo"42falsetruenull[][1]stdClass
"0"truetruetruefalsefalsefalsefalsefalsefalsefalsetruefalsefalsefalsefalsefalse
"0.0"truetruetruefalsefalsefalsefalsefalsefalsefalsefalsetruefalsefalsefalsefalse
0truetruetruefalsefalsefalsefalsefalsefalsefalsetruefalsetruefalsefalse
"foo"falsefalsefalsetruefalsefalsefalsefalsefalsefalsefalsetruefalsefalsefalsefalse
""falsefalsefalsefalsetruefalsefalsefalsefalsefalsetruefalsetruefalsefalsefalse
" 42"falsefalsefalsefalsefalsetruetruetruefalsetruefalsetruefalsefalsefalsefalse
"042"falsefalsefalsefalsefalsetruetruetruefalsetruefalsetruefalsefalsefalsefalse
"42"falsefalsefalsefalsefalsetruetruetruefalsetruefalsetruefalsefalsefalsefalse
"42foo"falsefalsefalsefalsefalsefalsefalsefalsetruefalsefalsetruefalsefalsefalsefalse
42falsefalsefalsefalsefalsetruetruetruefalsetruefalsetruefalsefalsefalse
falsetruefalsetruefalsetruefalsefalsefalsefalsefalsetruefalsetruetruefalsefalse
truefalsetruefalsetruefalsetruetruetruetruetruefalsetruefalsefalsetruetrue
nullfalsefalsetruefalsetruefalsefalsefalsefalsefalsetruefalsetruetruefalsefalse
[]falsefalsefalsefalsefalsefalsefalsefalsefalsefalsetruefalsetruetruefalsefalse
[1]falsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsetruefalsefalsetruefalse
stdClassfalsefalsefalsefalsefalsefalsefalsefalsefalsetruefalsefalsefalsetrue

Operator ===

true
false
Error
"0""0.0"0"foo"""" 42""042""42""42foo"42falsetruenull[][1]stdClass
"0"truefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalse
"0.0"falsetruefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalse
0falsefalsetruefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalse
"foo"falsefalsefalsetruefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalse
""falsefalsefalsefalsetruefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalse
" 42"falsefalsefalsefalsefalsetruefalsefalsefalsefalsefalsefalsefalsefalsefalsefalse
"042"falsefalsefalsefalsefalsefalsetruefalsefalsefalsefalsefalsefalsefalsefalsefalse
"42"falsefalsefalsefalsefalsefalsefalsetruefalsefalsefalsefalsefalsefalsefalsefalse
"42foo"falsefalsefalsefalsefalsefalsefalsefalsetruefalsefalsefalsefalsefalsefalsefalse
42falsefalsefalsefalsefalsefalsefalsefalsefalsetruefalsefalsefalsefalsefalsefalse
falsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsetruefalsefalsefalsefalsefalse
truefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsetruefalsefalsefalsefalse
nullfalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsetruefalsefalsefalse
[]falsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsetruefalsefalse
[1]falsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsetruefalse
stdClassfalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsetrue

Operator <

true
false
Error
"0""0.0"0"foo"""" 42""042""42""42foo"42falsetruenull[][1]stdClass
"0"falsefalsefalsetruefalsetruetruetruetruetruefalsetruefalsetruetruetrue
"0.0"falsefalsefalsetruefalsetruetruetruetruetruefalsefalsefalsetruetruetrue
0falsefalsefalsetruefalsetruetruetruetruetruefalsetruefalsetruetrue
"foo"falsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsetruetruetrue
""truetruetruetruefalsetruetruetruetruetruefalsetruefalsetruetruetrue
" 42"falsefalsefalsetruefalsefalsefalsefalsetruefalsefalsefalsefalsetruetruetrue
"042"falsefalsefalsetruefalsefalsefalsefalsetruefalsefalsefalsefalsetruetruetrue
"42"falsefalsefalsetruefalsefalsefalsefalsetruefalsefalsefalsefalsetruetruetrue
"42foo"falsefalsefalsetruefalsefalsefalsefalsefalsefalsefalsefalsefalsetruetruetrue
42falsefalsefalsetruefalsefalsefalsefalsetruefalsefalsefalsefalsetruetrue
falsefalsetruefalsetruefalsetruetruetruetruetruefalsetruefalsefalsetruetrue
truefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalse
nulltruetruefalsetruefalsetruetruetruetruetruefalsetruefalsefalsetruetrue
[]falsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsetruefalsefalsetruetrue
[1]falsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsetrue
stdClassfalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalse

Operator >

true
false
Error
"0""0.0"0"foo"""" 42""042""42""42foo"42falsetruenull[][1]stdClass
"0"falsefalsefalsefalsetruefalsefalsefalsefalsefalsefalsefalsetruefalsefalsefalse
"0.0"falsefalsefalsefalsetruefalsefalsefalsefalsefalsetruefalsetruefalsefalsefalse
0falsefalsefalsefalsetruefalsefalsefalsefalsefalsefalsefalsefalsefalsefalse
"foo"truetruetruefalsetruetruetruetruetruetruetruefalsetruefalsefalsefalse
""falsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalse
" 42"truetruetruefalsetruefalsefalsefalsefalsefalsetruefalsetruefalsefalsefalse
"042"truetruetruefalsetruefalsefalsefalsefalsefalsetruefalsetruefalsefalsefalse
"42"truetruetruefalsetruefalsefalsefalsefalsefalsetruefalsetruefalsefalsefalse
"42foo"truetruetruefalsetruetruetruetruefalsetruetruefalsetruefalsefalsefalse
42truetruetruefalsetruefalsefalsefalsefalsefalsetruefalsetruefalsefalse
falsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalse
truetruefalsetruefalsetruefalsefalsefalsefalsefalsetruefalsetruetruefalsefalse
nullfalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalse
[]truetruetruetruetruetruetruetruetruetruefalsefalsefalsefalsefalsefalse
[1]truetruetruetruetruetruetruetruetruetruetruefalsetruetruefalsefalse
stdClasstruetruetruetruetruetruetruetruetruefalsetruetruetruefalse

Operator <=

true
false
Error
"0""0.0"0"foo"""" 42""042""42""42foo"42falsetruenull[][1]stdClass
"0"truetruetruetruefalsetruetruetruetruetruetruetruefalsetruetruetrue
"0.0"truetruetruetruefalsetruetruetruetruetruefalsetruefalsetruetruetrue
0truetruetruetruefalsetruetruetruetruetruetruetruetruetruetrue
"foo"falsefalsefalsetruefalsefalsefalsefalsefalsefalsefalsetruefalsetruetruetrue
""truetruetruetruetruetruetruetruetruetruetruetruetruetruetruetrue
" 42"falsefalsefalsetruefalsetruetruetruetruetruefalsetruefalsetruetruetrue
"042"falsefalsefalsetruefalsetruetruetruetruetruefalsetruefalsetruetruetrue
"42"falsefalsefalsetruefalsetruetruetruetruetruefalsetruefalsetruetruetrue
"42foo"falsefalsefalsetruefalsefalsefalsefalsetruefalsefalsetruefalsetruetruetrue
42falsefalsefalsetruefalsetruetruetruetruetruefalsetruefalsetruetrue
falsetruetruetruetruetruetruetruetruetruetruetruetruetruetruetruetrue
truefalsetruefalsetruefalsetruetruetruetruetruefalsetruefalsefalsetruetrue
nulltruetruetruetruetruetruetruetruetruetruetruetruetruetruetruetrue
[]falsefalsefalsefalsefalsefalsefalsefalsefalsefalsetruetruetruetruetruetrue
[1]falsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsetruefalsefalsetruetrue
stdClassfalsefalsefalsefalsefalsefalsefalsefalsefalsetruefalsefalsefalsetrue

Operator >=

true
false
Error
"0""0.0"0"foo"""" 42""042""42""42foo"42falsetruenull[][1]stdClass
"0"truetruetruefalsetruefalsefalsefalsefalsefalsetruefalsetruefalsefalsefalse
"0.0"truetruetruefalsetruefalsefalsefalsefalsefalsetruetruetruefalsefalsefalse
0truetruetruefalsetruefalsefalsefalsefalsefalsetruefalsetruefalsefalse
"foo"truetruetruetruetruetruetruetruetruetruetruetruetruefalsefalsefalse
""falsefalsefalsefalsetruefalsefalsefalsefalsefalsetruefalsetruefalsefalsefalse
" 42"truetruetruefalsetruetruetruetruefalsetruetruetruetruefalsefalsefalse
"042"truetruetruefalsetruetruetruetruefalsetruetruetruetruefalsefalsefalse
"42"truetruetruefalsetruetruetruetruefalsetruetruetruetruefalsefalsefalse
"42foo"truetruetruefalsetruetruetruetruetruetruetruetruetruefalsefalsefalse
42truetruetruefalsetruetruetruetruefalsetruetruetruetruefalsefalse
falsetruefalsetruefalsetruefalsefalsefalsefalsefalsetruefalsetruetruefalsefalse
truetruetruetruetruetruetruetruetruetruetruetruetruetruetruetruetrue
nullfalsefalsetruefalsetruefalsefalsefalsefalsefalsetruefalsetruetruefalsefalse
[]truetruetruetruetruetruetruetruetruetruetruefalsetruetruefalsefalse
[1]truetruetruetruetruetruetruetruetruetruetruetruetruetruetruefalse
stdClasstruetruetruetruetruetruetruetruetruetruetruetruetruetrue

Operator <=>

Spaceship operator: Returns -1 if left is less, 0 if equal, 1 if left is greater.
-1 (less)
0 (equal)
1 (greater)
Error
"0""0.0"0"foo"""" 42""042""42""42foo"42falsetruenull[][1]stdClass
"0"000-11-1-1-1-1-10-11-1-1-1
"0.0"000-11-1-1-1-1-1101-1-1-1
0000-11-1-1-1-1-10-10-1-1
"foo"1110111111101-1-1-1
""-1-1-1-10-1-1-1-1-10-10-1-1-1
" 42"111-11000-10101-1-1-1
"042"111-11000-10101-1-1-1
"42"111-11000-10101-1-1-1
"42foo"111-1111101101-1-1-1
42111-11000-10101-1-1
false0-10-10-1-1-1-1-10-100-1-1
true1010100000101100
null-1-10-10-1-1-1-1-10-100-1-1
[]11111111110-100-1-1
[1]111111111110110-1
stdClass11111111101110

🔍 in_array() without strict mode

Testing how in_array() finds values when strict mode is disabled (default behavior).
Needle"0""0.0"0"foo"""" 42""042""42""42foo"42falsetruenull[][1]stdClass
"0"truetruetruefalsefalsefalsefalsefalsefalsefalsetruefalsefalsefalsefalsefalse
"0.0"truetruetruefalsefalsefalsefalsefalsefalsefalsefalsetruefalsefalsefalsefalse
0truetruetruefalsefalsefalsefalsefalsefalsefalsetruefalsetruefalsefalse
"foo"falsefalsefalsetruefalsefalsefalsefalsefalsefalsefalsetruefalsefalsefalsefalse
""falsefalsefalsefalsetruefalsefalsefalsefalsefalsetruefalsetruefalsefalsefalse
" 42"falsefalsefalsefalsefalsetruetruetruefalsetruefalsetruefalsefalsefalsefalse
"042"falsefalsefalsefalsefalsetruetruetruefalsetruefalsetruefalsefalsefalsefalse
"42"falsefalsefalsefalsefalsetruetruetruefalsetruefalsetruefalsefalsefalsefalse
"42foo"falsefalsefalsefalsefalsefalsefalsefalsetruefalsefalsetruefalsefalsefalsefalse
42falsefalsefalsefalsefalsetruetruetruefalsetruefalsetruefalsefalsefalse
falsetruefalsetruefalsetruefalsefalsefalsefalsefalsetruefalsetruetruefalsefalse
truefalsetruefalsetruefalsetruetruetruetruetruefalsetruefalsefalsetruetrue
nullfalsefalsetruefalsetruefalsefalsefalsefalsefalsetruefalsetruetruefalsefalse
[]falsefalsefalsefalsefalsefalsefalsefalsefalsefalsetruefalsetruetruefalsefalse
[1]falsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsetruefalsefalsetruefalse
stdClassfalsefalsefalsefalsefalsefalsefalsefalsefalsetruefalsefalsefalsetrue

🔀 Sorting behavior (SORT flags)

SORT flags are used in sorting functions (sort, usort, asort, etc.) and array_unique().
When two values are considered equal (=), their relative order in the result is undefined and may vary between PHP versions or implementations.

Sorting flag SORT_REGULAR

< (less than)
= (equal)
> (greater than)
Error
"0""0.0"0"foo"""" 42""042""42""42foo"42falsetruenull[][1]stdClass
"0"===<><<<<<=<><<<
"0.0"===<><<<<<>=><<<
0===<><<<<<=<=<<
"foo">>>=>>>>>>>=><<<
""<<<<=<<<<<=<=<<<
" 42">>><>===<=>=><<<
"042">>><>===<=>=><<<
"42">>><>===<=>=><<<
"42foo">>><>>>>=>>=><<<
42>>><>===<=>=><<
false=<=<=<<<<<=<==<<
true>=>=>=====>=>>==
null<<=<=<<<<<=<==<<
[]>>>>>>>>>>=<==<<
[1]>>>>>>>>>>>=>>=<
stdClass>>>>>>>>>=>>>=

Sorting flag SORT_NUMERIC

< (less than)
= (equal)
> (greater than)
Error
"0""0.0"0"foo"""" 42""042""42""42foo"42falsetruenull[][1]stdClass
"0"=====<<<<<=<==<
"0.0"=====<<<<<=<==<
0=====<<<<<=<==<
"foo"=====<<<<<=<==<
""=====<<<<<=<==<
" 42">>>>>=====>>>>>
"042">>>>>=====>>>>>
"42">>>>>=====>>>>>
"42foo">>>>>=====>>>>>
42>>>>>=====>>>>>
false=====<<<<<=<==<
true>>>>><<<<<>=>>=
null=====<<<<<=<==<
[]=====<<<<<=<==<
[1]>>>>><<<<<>=>>=
stdClass

Sorting flag SORT_STRING

< (less than)
= (equal)
> (greater than)
Error
"0""0.0"0"foo"""" 42""042""42""42foo"42falsetruenull[][1]stdClass
"0"=<=<>><<<<><>
"0.0">=><>><<<<><>
0=<=<>><<<<><>
"foo">>>=>>>>>>>>>
""<<<<=<<<<<=<=
" 42"<<<<>=<<<<><>
"042">>><>>=<<<><>
"42">>><>>>=<=>>>
"42foo">>><>>>>=>>>>
42>>><>>>=<=>>>
false<<<<=<<<<<=<=
true>>><>>><<<>=>
null<<<<=<<<<<=<=
[]
[1]
stdClass

Sorting flag SORT_NATURAL

< (less than)
= (equal)
> (greater than)
Error
"0""0.0"0"foo"""" 42""042""42""42foo"42falsetruenull[][1]stdClass
"0"=<=<><<<<<><>
"0.0">=><><<<<<><>
0=<=<><<<<<><>
"foo">>>=>>>>>>>>>
""<<<<=<<<<<=<=
" 42">>><>===<=>>>
"042">>><>===<=>>>
"42">>><>===<=>>>
"42foo">>><>>>>=>>>>
42>>><>===<=>>>
false<<<<=<<<<<=<=
true>>><><<<<<>=>
null<<<<=<<<<<=<=
[]
[1]
stdClass

📅 DateTime objects

DateTime objects support comparison operators, which many developers don't realize!

✅ DateTime supports <, >, <=, >=

$past   = new DateTime('2023-01-01');
$now    = new DateTime('2024-01-01');
$future = new DateTime('2025-01-01');

$past < $now     → true
$future > $now   → true
$now <= $now     → true

✅ == checks value equality, === checks identity

$date1 = new DateTime('2024-06-15 10:30:00');
$date2 = new DateTime('2024-06-15 10:30:00');  // same time, different object
$date3 = $date1;                               // same reference

$date1 == $date2   → true  // ✅ same timestamp
$date1 === $date2  → false // ❌ different objects
$date1 === $date3  → true  // ✅ same reference

✅ DateTime and DateTimeImmutable are comparable

$mutable   = new DateTime('2024-03-15 12:00:00');
$immutable = new DateTimeImmutable('2024-03-15 12:00:00');

$mutable == $immutable   → true  // ✅ same timestamp

🔧 Closures and first-class callables

PHP's == operator intelligently compares closures and first-class callables!
Note: This behavior applies to PHP 8.1 - 8.5. PHP 8.0 had different comparison semantics for closures.

✅ Same function references compare equal with ==

$trim1   = trim(...);
$trim2   = trim(...);
$strlen1 = strlen(...);

$trim1 == $trim2      → true   // ✅ same function
$trim1 == $strlen1    → false  // ❌ different functions
$trim1 === $trim2     → false  // ❌ different objects

❌ Closures with identical code are NOT equal

$closure1 = fn($x) => $x * 2;
$closure2 = fn($x) => $x * 2;   // identical code
$closure3 = $closure1;          // same reference

$closure1 == $closure2   → false  // ❌ different closure objects
$closure1 === $closure2  → false  // ❌ different objects
$closure1 === $closure3  → true   // ✅ same reference

✅ Method references on same object are equal

class MyClass {
	public function myMethod() {}
}

$objA = new MyClass;
$objB = new MyClass;

$methodA1 = $objA->myMethod(...);
$methodA2 = $objA->myMethod(...);
$methodB  = $objB->myMethod(...);

$methodA1 == $methodA2   → true   // ✅ same object, same method
$methodA1 == $methodB    → false  // ❌ different object instances
$methodA1 === $methodA2  → false  // ❌ different closure objects