<?php
interface I {}
interface J {}
// Simulate a "never" parameter type.
interface AlmostNever extends I, J {}
class C implements I {}
interface Base {
public function foo(AlmostNever $x, AlmostNever $y): mixed;
}
interface ReturnI extends Base {
public function foo(AlmostNever $x, AlmostNever $y): I;
}
interface AcceptI extends Base {
public function foo(I $x, AlmostNever $y): mixed;
}
interface AcceptSecondI extends Base {
public function foo(AlmostNever $x, I $y): mixed;
}
class AcceptReturnI implements ReturnI, AcceptI, AcceptSecondI {
public function foo(I $x, I $y): I {
return $x;
}
}
function f(AcceptI&AcceptSecondI&ReturnI $callme, I $x): I {
return $callme->foo($x, $x);
}
f(new AcceptReturnI(), new C(), new C());