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

もちろん、AB について知る必要はありません。可能かどうかはわかりません。170 のサブクラスすべてに create 関数を実装する必要はありません。

170 個のクラスのうちの 1 つのインスタンスを返すFactoryを使用する必要があると思いますか? それは面倒で、あまり維持できません..

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 に答える