3v4l.org

run code in 300+ PHP versions simultaneously
<?php trait Eq { public function equiv(Eq $lhs, Eq $rhs): bool { return $lhs->equiv($lhs, $rhs); } } class Tuple2 { use Eq; public function __construct(public Eq $key, public Eq $value) {} public function equiv(Eq $lhs, Eq $rhs): bool { return $lhs->key->equiv($lhs->key, $rhs->key) && $lhs->value->equiv($lhs->value, $rhs->value); } } class Tuple3 { use Eq; public function __construct(public Eq $key, public Eq $value, public Eq $column) {} public function equiv(Eq $lhs, Eq $rhs): bool { return $lhs->key->equiv($lhs->key, $rhs->key) && $lhs->value->equiv($lhs->value, $rhs->value) && $lhs->column->equiv($lhs->column, $rhs->column); } } function check_equiv(Eq $lhs, Eq $rhs) { return $lhs->equiv($lhs, $rhs); } class Number { use Eq; public function __construct(public int $value) {} public function equiv(int $lhs, int $rhs): bool { return $lhs === $rhs; } } var_dump(check_equiv( new Tuple3(new Tuple2(new Number(1), new Number(2)), new Tuple2(new Number(3), new Number(4)), new Tuple2(new Number(5), new Number(6))), new Tuple3(new Tuple2(new Number(1), new Number(2)), new Tuple2(new Number(3), new Number(4)), new Tuple2(new Number(5), new Number(6))) ));

preferences:
27.7 ms | 402 KiB | 5 Q