使用switch-case按类型创建不同的对象?

Good day every one,

We use a lot of statements like if-else or switch-case for creating different object depending on different conditions like:

interface Job {
    public function do();
}

class Auto implement Job {
    ...
}

class Month implement Job {
    ...
}

...
// another script to run jobs
...
switch($type) {
    case 'auto':
        $instance = new Auto();
        break;
    case 'month':
        $instance = new Month();
        break;
    default:
        throw new Exception('not support type!');
}

$instance->do();

The problem is if we use if-else / switch-case make code grows fast with more and more types.
We can use reflection or dynamical instance initiation however the IDE (like PHPStorm) will not able to find the class usage..
Is there any better way against using switch-case?

Two answers really.

You should be type hinting $instance as the interface Job. That is the whole purpose of an Interface in OOP. You can do that with the following:

switch ($type) {
    case 'auto':
        $instance = new Auto();
        break;
    // ...
}

/** @var \Job $instance */
$instance->do();

You can provide metadata to PHPStorm for type hinting factory methods if you want to go that route. The metadata file can be committed to source control just like your code https://confluence.jetbrains.com/display/PhpStorm/PhpStorm+Advanced+Metadata