3v4l.org

run code in 300+ PHP versions simultaneously
<?php declare(strict_types=1); namespace Ws\Shared\Users { interface SearchByIdData { public function getId(): int; } abstract class Users { // Add as many abstract methods as needed for any object you need. abstract public function buildSearchByIdData(int $value, string $other): SearchByIdData; public function searchById(int $id, string $otherParam) { $filter = $this->buildSearchByIdData($id, $otherParam); echo 'Do something with ' . get_class($filter) . "\n"; var_dump($filter); } // All other public methods using abstract methods to create objects } } namespace Ws\V1\Users { use Ws\Shared\Users\SearchByIdData as SearchByIdDataInterface; use Ws\Shared\Users\Users as BaseUsers; class SearchByIdDataOption1 { public function __construct(public string $value) {} } class SearchByIdDataOption2 { public function __construct(public string $value) {} } class SearchByIdData implements SearchByIdDataInterface { public function __construct( private int $id, private SearchByIdDataOption1|SearchByIdDataOption2 $option ) {} public function getId(): int { return $this->id; } } class Users extends BaseUsers { public function buildSearchByIdData(int $value, string $other): SearchByIdDataInterface { $option = ($other === 'yes') ? new SearchByIdDataOption1($other) : new SearchByIdDataOption2($other); return new SearchByIdData($value, $option); } } } namespace Ws\V2\Users { use Ws\Shared\Users\SearchByIdData as SearchByIdDataInterface; use Ws\Shared\Users\Users as BaseUsers; class SearchByIdDataOption1 { public function __construct(public string $value) {} } class SearchByIdDataOption2 { public function __construct(public string $value) {} } class SearchByIdData implements SearchByIdDataInterface { public function __construct( private int $id, private SearchByIdDataOption1|SearchByIdDataOption2 $option ) {} public function getId(): int { return $this->id; } } class Users extends BaseUsers { public function buildSearchByIdData(int $value, string $other): SearchByIdDataInterface { $option = ($other === 'yes') ? new SearchByIdDataOption1($other) : new SearchByIdDataOption2($other); return new SearchByIdData($value, $option); } } } namespace Somewhere\Else { // Using v1: $v1Users = new \Ws\V1\Users\Users(); $v1Users->searchById(1, 'yes'); $v1Users->searchById(1, 'maybe'); // Using v2: $v2Users = new \Ws\V2\Users\Users(); $v2Users->searchById(1, 'yes'); $v2Users->searchById(1, 'maybe'); }
Output for git.master_jit, git.master
Do something with Ws\V1\Users\SearchByIdData object(Ws\V1\Users\SearchByIdData)#3 (2) { ["id":"Ws\V1\Users\SearchByIdData":private]=> int(1) ["option":"Ws\V1\Users\SearchByIdData":private]=> object(Ws\V1\Users\SearchByIdDataOption1)#2 (1) { ["value"]=> string(3) "yes" } } Do something with Ws\V1\Users\SearchByIdData object(Ws\V1\Users\SearchByIdData)#2 (2) { ["id":"Ws\V1\Users\SearchByIdData":private]=> int(1) ["option":"Ws\V1\Users\SearchByIdData":private]=> object(Ws\V1\Users\SearchByIdDataOption2)#3 (1) { ["value"]=> string(5) "maybe" } } Do something with Ws\V2\Users\SearchByIdData object(Ws\V2\Users\SearchByIdData)#4 (2) { ["id":"Ws\V2\Users\SearchByIdData":private]=> int(1) ["option":"Ws\V2\Users\SearchByIdData":private]=> object(Ws\V2\Users\SearchByIdDataOption1)#3 (1) { ["value"]=> string(3) "yes" } } Do something with Ws\V2\Users\SearchByIdData object(Ws\V2\Users\SearchByIdData)#3 (2) { ["id":"Ws\V2\Users\SearchByIdData":private]=> int(1) ["option":"Ws\V2\Users\SearchByIdData":private]=> object(Ws\V2\Users\SearchByIdDataOption2)#4 (1) { ["value"]=> string(5) "maybe" } }

This tab shows result from various feature-branches currently under review by the php developers. Contact me to have additional branches featured.

Active branches

Archived branches

Once feature-branches are merged or declined, they are no longer available. Their functionality (when merged) can be viewed from the main output page


preferences:
67.52 ms | 408 KiB | 5 Q