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'); }

preferences:
29.18 ms | 405 KiB | 5 Q