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 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.28, 8.2.0 - 8.2.18, 8.3.0 - 8.3.4, 8.3.6
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 8.3.5
Warning: PHP Startup: Unable to load dynamic library 'sodium.so' (tried: /usr/lib/php/8.3.5/modules/sodium.so (libsodium.so.23: cannot open shared object file: No such file or directory), /usr/lib/php/8.3.5/modules/sodium.so.so (/usr/lib/php/8.3.5/modules/sodium.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0 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:
163.63 ms | 403 KiB | 180 Q