以下是您可以尝试的可能解决方案的想法.让Cow和Human类扩展Entity类.但是,实体类将使用
factory基于值是否安全来实例化对象.让我们更详细地看一下:
/*
* Class Entity should not be able to be instantiated.
* It should contain a factory to instantiate the
* appropriate entity and an abstract function declaring
* the method that each entity will need to implement.
*/
abstract class Entity {
public static function factory($type) {
return (is_subclass_of($type, "Entity")) ? new $type() : FALSE;
}
abstract public function sayHi();
}
/*
* Human class extends Entity and implements the
* abstract method from Entity.
*/
class Human extends Entity {
public function sayHi() {
echo "Hello World!";
}
}
/*
* Cow class extends Entity and implements the
* abstract method from Entity.
*/
class Cow extends Entity {
public function sayHi() {
echo "Moo!";
}
}
现在使用这个方法,调用工厂方法,如果一切正常,它将实例化适当的类,它将扩展实体.
$person = Entity::factory("Human");
$person->sayHi();
$cow = Entity::factory("Cow");
$cow->sayHi();
使用is_subclass_of()会保证您的安全,因为如果传入的值不是扩展Entity的类,则返回值为FALSE.
如果你想看到上面的代码在行动,复制上面的PHP代码并在phpfiddle.org测试它.