2016-11-18 182 views
0

我很困惑這兩種情況之間會有什麼區別或性能增益。爲什麼要選擇另一個呢?這兩種OOP情景之間的區別?

父類:

class exampleB 
{ 
    public function __construct($arg1, $arg2) 
    { 
     // Do something with the arguments. 
    } 
} 

兒童類A

class exampleA extends exampleB 
{ 
    public function make($arg1, $arg2) 
    { 
     parent::__construct($arg1, $arg2); 
    } 
} 

運行的第一個例子:

$exampleA = new exampleA(); 
$exampleA->make('arg1', 'arg2'); 

第二個例子是:

子類中

class exampleA extends exampleB 
{ 
    public static function make($arg1, $arg2) 
    { 
     return new static($arg1, $arg2); 
    } 
} 

運行第二個例子:

exampleA::make('arg1', 'arg2'); 

有人能告訴我的優點和/或這兩種情況之間的缺點?我有這些例子的原因是我不想重寫我的父類的構造函數。

+2

我也不會要麼使用'$照例a =新照例a(「ARG1」,「ARG2」);'是所有你需要在'exambleB'構造,只要將自動稱爲你不不會覆蓋它。 – jeroen

+0

我不想重寫我的父類中現有的構造函數,這就是爲什麼我想出了這些解決方案。應該補充一點。 –

回答

2

你既不應該也不要使用構造函數來初始化對象。對象必須在施工後處於有效狀態。

我有這些例子的原因,因爲我不想重寫我的父類的構造函數。

然後,只是不要在子類中定義構造函數。

class Parent { 
    public function __construct() { 
     echo 'parent ctor called'; 
    } 
} 

class Child extends Parent {} 

new Child(); // echo's parent ctor called 
-1

我會選擇第二個例子。 Make()的作用類似於構造函數,因此應該像一個一樣調用,即靜態。

在第一個示例中,您創建兩個對象而不是一個。當其他開發人員閱讀/維護您的代碼時,這可能會造成一些混淆。