0

可能重复:
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 个类之一的实例吗?这很麻烦,而且不太可维护。

4

3 回答 3

1

我找到了解决方案,但是可以吗?

<?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);
    }
}

我测试了它,它工作正常它在我的上下文中真的很有用..我不知道它是否丑陋,因为父类不知道子类,如果子类不存在,调用者将不会允许调用创建函数..

现在,对于我的实际测试,我使用:

$graph->setBgcolor(Bgcolor::create('yellow')->valid());

 public function setBgcolor(Bgcolor $bgcolor)
于 2012-12-12T20:17:44.747 回答
0

一个成功的实现可能是这样的

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
{
} 
...

依此类推......(我还没有编译它,抱歉语法错误)

现在您知道静态方法与创建的对象实例无关,因为这就是我们首先创建静态方法的原因。

所以你可以把它们放在任何其他类中,恭喜你已经实现了工厂设计模式。

然而,这不是一个好的实现。

于 2012-12-12T20:04:43.233 回答
0

另一种解决方案是使用静态函数并使用基本的新...

<?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()
于 2012-12-12T21:09:16.563 回答