3v4l.org

run code in 300+ PHP versions simultaneously
<?php namespace Translatable { interface Translatable {} } namespace Translatable\Impl { use Translatable\Translatable; class Translatable1 implements Translatable {} class Translatable2 implements Translatable {} class Translatable3 implements Translatable {} } namespace Translation { use Translatable\Translatable; use Translation\Impl\BaseTranslator; interface Translator {} class TranslatorFactory { /** * @throws \ReflectionException */ public static function getTranslator(Translatable $a, Translatable $b): Translator { $translatorNamespace = (new \ReflectionClass(BaseTranslator::class))->getNamespaceName(); $translatorClassName = $translatorNamespace . '\\TranslatorFor' . (new \ReflectionClass($a))->getShortName() . 'And' . (new \ReflectionClass($b))->getShortName(); return new $translatorClassName(); } } } namespace Translation\Impl { use Translation\Translator; class BaseTranslator implements Translator {} class Translator1 extends BaseTranslator {} class_alias(Translator1::class, TranslatorForTranslatable1AndTranslatable2::class); class Translator2 extends BaseTranslator {} class_alias(Translator2::class, TranslatorForTranslatable1AndTranslatable3::class); class Translator3 extends BaseTranslator {} class_alias(Translator3::class, TranslatorForTranslatable2AndTranslatable3::class); } namespace { use Translatable\Impl\Translatable1; use Translatable\Impl\Translatable3; use Translation\TranslatorFactory; $translatable1 = new Translatable1(); $translatable3 = new Translatable3(); $translator = TranslatorFactory::getTranslator($translatable1, $translatable3); var_dump($translator); }

preferences:
36.1 ms | 405 KiB | 5 Q