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

上一篇: php oo programming parent to instantiate child

下一篇: Is instantiation required for function overriding?