我有一个具有复杂静态工厂方法的类,我们称之为ClassA。我已将ClassA扩展为ClassB,并且我希望ClassB的工厂方法执行ClassA的工厂方法所做的所有操作,除了返回ClassB。
class ClassA{
static public function Factory($construct_args, $contents){
$new = new ClassA($construct_args);
//Does lots of stuff with $contents
}
}
class ClassB extends ClassA{
//specialty methods and properties
}
echo get_class(ClassB::Factory($construct_args, $contents);
这应该回应ClassB
有没有办法可以使用ClassA的工厂方法而无需将其复制粘贴到ClassB?我使用的是PHP5,但不是5.3.0。
答案 0 :(得分:2)
要完全按照您的需要进行Late Static Binding,所以您需要PHP 5.3。它无法在PHP 5.2中完成。人们尝试过。
我见过/用于5.2的解决方法是
正如您所提到的(并且不想这样做)将工厂方法复制到每个班级
要求工厂的最终用户提供他们作为参数实例化的类的名称
要求您的工厂实现接口或让它们从需要定义静态“getClassName”方法的抽象类(或只知道约定)继承,该方法将在工厂中使用。这类似于第一,但有些人更喜欢它,因为它允许他们的工厂方法保持在“底层”类。
答案 1 :(得分:0)
我想这是Late Static Binding的情况。如果你不在5.3,你必须复制它。
但是,您也可以从ClassA中删除工厂方法,并将其设置为专用的Factory或Builder类,该类知道如何创建ClassA和任何特殊类。
答案 2 :(得分:0)
在PHP 5.3中,只需要做(see late static bindings):
static public function Factory($construct_args, $contents){
$new = new static($construct_args);
//Does lots of stuff with $contents
return $new;
}
在PHP 5.2中,您必须更具创造性。类似的东西:
class ClassA {
static function Factory($construct_args, $contents) {
return self::privFactory($construct_args, $contents, "ClassA");
}
static protected function privFactory($construct_args, $contents, $type){
$new = new $type($construct_args);
//Does lots of stuff with $contents
return $new;
}
}
class ClassB extends ClassA{
static function Factory($construct_args, $contents) {
return self::privFactory($construct_args, $contents, "ClassB");
}
}