public static function __callStatic($name, $args) { if (!self::$instance) { self::$instance = new D\ump(); } return call_user_func_array([self::$instance, $name], $args); }
<?php class C { /** @return static */ static function instance() { return new static(); } /** @return static */ function f() { return $this; } } class D extends C { } class E { } function g(E $p) { } g(D::instance()->f()); g(C::instance()->f());