3v4l.org

run code in 300+ PHP versions simultaneously
<?php class A { protected $c; protected $d; public function set(B $test) { static $testMap = []; if (empty($testMap)) { $testMap = [ C::class => 'setC', // only need to know which method to call D::class => 'setD', // ]; } if ($test === null) { return; } $testType = get_class($test); if (!array_key_exists($testType, $testMap)) { throw new InvalidArgumentException( sprintf( "Encountered unexpected body type (%s) that isn't supported", $testType ) ); } call_user_func([$this, $testMap[$testType]], $test); // uses $this to call the method on this object // alternatively, $this->{$testMap[$testType]}($test); } /** * @param C|null $c */ public function setC(C $c = null) { $this->c = $c; } /** * @param D|null $d */ public function setD(D $d = null) { $this->d = $d; } } abstract class B { protected $data; public function __construct($q = '') { $this->data = $q; } } class C extends B { } class D extends B {} $a1 = new A; $a1->set(new C("test c1")); var_dump($a1); $a2 = new A; $a2->set(new C("test c2")); var_dump($a2); $a3 = new A; $a3->set(new C("test c3")); var_dump($a3);
Output for 8.4.1 - 8.4.12
Deprecated: A::setC(): Implicitly marking parameter $c as nullable is deprecated, the explicit nullable type must be used instead in /in/Hm6kS on line 34 Deprecated: A::setD(): Implicitly marking parameter $d as nullable is deprecated, the explicit nullable type must be used instead in /in/Hm6kS on line 42 object(A)#1 (2) { ["c":protected]=> object(C)#2 (1) { ["data":protected]=> string(7) "test c1" } ["d":protected]=> NULL } object(A)#3 (2) { ["c":protected]=> object(C)#4 (1) { ["data":protected]=> string(7) "test c2" } ["d":protected]=> NULL } object(A)#5 (2) { ["c":protected]=> object(C)#6 (1) { ["data":protected]=> string(7) "test c3" } ["d":protected]=> NULL }
Output for 7.2.0 - 7.2.33, 7.3.0 - 7.3.33, 7.4.0 - 7.4.33, 8.0.0 - 8.0.30, 8.1.0 - 8.1.33, 8.2.0 - 8.2.29, 8.3.0 - 8.3.25
object(A)#1 (2) { ["c":protected]=> object(C)#2 (1) { ["data":protected]=> string(7) "test c1" } ["d":protected]=> NULL } object(A)#3 (2) { ["c":protected]=> object(C)#4 (1) { ["data":protected]=> string(7) "test c2" } ["d":protected]=> NULL } object(A)#5 (2) { ["c":protected]=> object(C)#6 (1) { ["data":protected]=> string(7) "test c3" } ["d":protected]=> NULL }

preferences:
151.9 ms | 410 KiB | 5 Q