2012-12-12 45 views
0

可能重複:
What exactly is late-static binding in PHP?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 
{ 
} 

理所當然的還沒有知道關於B ..我不知道這是否是可能的,我不希望有實現我所有的170子類的創建功能...

你認爲我應該使用工廠,它會返回我的170個類中的一個類的實例嗎?這很麻煩,不是很維護..

+0

對不起,但我不明白你究竟想要什麼。 – Hast

+0

有可能,請參閱'static'關鍵字或Late Static Binding。很可能你做錯了(因爲你可以使用標準的構造函數),只是說,所以你以後可以不會說你沒有受到警告。 – hakre

+2

正如你所提到的,A不會知道它的任何孩子,也不應該。你正在努力的目標行爲是什麼?它聽起來像你正在尋找工廠設計。 –

回答

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

等等....(我還沒有編譯它,遺憾的語法錯誤)

現在你知道靜態方法與創建的對象實例無關,因爲這就是爲什麼我們首先創建靜態方法的原因。

所以你可以把它們放在任何其他類中,恭喜你實現了工廠設計模式。

但是這不是一個好的實現。

+0

對不起,這不是我正在等待的,父母不應該知道子類的類型......但是,無論如何感謝你的時間:) –

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) 
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()