PHP的oo编程父母来实例化孩子
可能重复:
PHP中的后期静态绑定究竟是什么?
我想构建一个抽象类 ,它将使用静态函数实例化它的子类。
<?php
class A
{
protected $value;
public function __construct($value)
{
$this->value = $value;
}
public static function create($value)
{
/* A must not know about B!
* I give that example for the context understanding */
return **new B**($value);
}
}
class B extends A
{
}
当然,A 不知道B ..我不知道这是否可能,我不想在我所有的170个子类中实现create函数......
你认为我应该使用一个工厂来返回我的170个类中的一个的实例吗? 这很麻烦,不太可维护。
我找到了一个解决方案,但它可以吗?
<?php
class A
{
protected $value;
public function __construct($value)
{
$this->value = $value;
}
public static function create($value)
{
$child = get_called_class();
return new $child($value);
}
}
我测试了它,它工作正常,它在我的上下文中非常有用..我不知道它是否很难看,因为父类不知道子类,如果Child类不存在,调用者将不会允许调用创建函数..
现在,对于我的实际测试,我使用:
$graph->setBgcolor(Bgcolor::create('yellow')->valid());
同
public function setBgcolor(Bgcolor $bgcolor)
成功的实施可能是这样的
class A
{
protected $value;
public static function create($value)
{
$type = "NotDivisible";
for ($i = 2; $i <= 10; $i++) {
if($value % $i == 0)
{
$type = "DivisibleBy".$i;
break;
}
}
$instance = new $type;
$instance->value = $value;
return $instance;
}
}
public class DivisibleBy2 extends A
{
}
public class DivisibleBy3 extends A
{
}
public class DivisibleBy5 extends A
{
}
...
等等....(我没有编译它,抱歉语法错误)
现在你知道静态方法与创建的对象实例无关,因为这就是为什么我们首先创建静态方法的原因。
所以你可以把它们放在任何其他课堂上,并恭喜你实施了工厂设计模式。
但是这不是一个好的实现。
另一种解决方案不会使用静态函数并使用基本的新...
<?php
class A
{
protected $value;
public function __construct($value)
{
$this->value = $value;
}
}
现在,对于我的实际测试,我使用:
$graph->setBgcolor(new Bgcolor('yellow'));
同
public function setBgcolor(Bgcolor $bgcolor)
我仍然这么认为
Bgcolor::create('yellow')->foo()
看起来比
(new Bgcolor('yellow'))->foo()
链接地址: http://www.djcxy.com/p/58033.html