<?php
abstract class Form {
abstract protected function do_shit();
public function f() {
$this->do_shit();
}
public static function build($type) : Form {
return new $type();
}
}
class FormA extends Form {
protected function do_shit() : void {
echo "A";
}
}
class FormB extends Form {
protected function do_shit() : void {
echo "B";
}
}
class FormC extends Form {
protected function do_shit() : void {
echo "C";
}
}
class FormD extends Form {
protected function do_shit() : void {
echo "D";
}
}
class FormE extends Form {
protected function do_shit() : void {
echo "E";
}
}
$f = Form::build('FormC');
$f->f();
PD9waHAKCmFic3RyYWN0IGNsYXNzIEZvcm0gewoJYWJzdHJhY3QgcHJvdGVjdGVkIGZ1bmN0aW9uIGRvX3NoaXQoKTsKCQoJcHVibGljIGZ1bmN0aW9uIGYoKSB7CgkJJHRoaXMtPmRvX3NoaXQoKTsKCX0KCQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBidWlsZCgkdHlwZSkgOiBGb3JtIHsKCQlyZXR1cm4gbmV3ICR0eXBlKCk7Cgl9Cn0KCmNsYXNzIEZvcm1BIGV4dGVuZHMgRm9ybSB7Cglwcm90ZWN0ZWQgZnVuY3Rpb24gZG9fc2hpdCgpIDogdm9pZCB7CgkJZWNobyAiQSI7Cgl9Cn0KY2xhc3MgRm9ybUIgZXh0ZW5kcyBGb3JtIHsKCXByb3RlY3RlZCBmdW5jdGlvbiBkb19zaGl0KCkgOiB2b2lkIHsKCQllY2hvICJCIjsKCX0KfQoKY2xhc3MgRm9ybUMgZXh0ZW5kcyBGb3JtIHsKCXByb3RlY3RlZCBmdW5jdGlvbiBkb19zaGl0KCkgOiB2b2lkIHsKCQllY2hvICJDIjsKCX0KfQpjbGFzcyBGb3JtRCBleHRlbmRzIEZvcm0gewoJcHJvdGVjdGVkIGZ1bmN0aW9uIGRvX3NoaXQoKSA6IHZvaWQgewoJCWVjaG8gIkQiOwoJfQp9CmNsYXNzIEZvcm1FIGV4dGVuZHMgRm9ybSB7Cglwcm90ZWN0ZWQgZnVuY3Rpb24gZG9fc2hpdCgpIDogdm9pZCB7CgkJZWNobyAiRSI7Cgl9Cn0KCgokZiA9IEZvcm06OmJ1aWxkKCdGb3JtQycpOwokZi0+ZigpOwoKCg==