2015-03-02 65 views
2

我想建立一個類,它實現了許多基於ID的方法, ,所以我想有一個實現這些方法的父類! 當我想使用這個類,我將擴展它,只是覆蓋id變量:你如何重寫自我?

class parent 
    { 
     $id = "parent"; 
     private __construct() 
     { 
     } 

     public static function create_instance() 
     { 
      $instance = new self(); 
      return $instance; 
     } 

     public static function print_id() 
     { 
      echo $this->id; 
     } 




    } 

class child extend parent 
{ 
    $id = "child"; 

} 

$instance = child::create_instance(); 
$instance->print_id(); 

的結果將是「父」,但我想要的結果是孩子? 如何做到這一點?

編輯:我也嘗試過這一點,並得到了父母,而不是孩子:

class parent1 { 
    private $id = "parent"; 
    public function __construct() { 
    } 
    public static function create_instance() { 
     $instance = new static(); 
     return $instance; 
    } 
    public function print_id() { 
     echo $this->id; 
    } 
} 
class child extends parent1 { 
    private $id = "child"; 
} 

$instance = child::create_instance(); 
$instance->print_id(); 

回答

2

的問題是,$id能見度私人,而應該保護,因爲print_id()只被定義對父母;因此它只能達到它自己的$id

class parent1 { 
    protected $id = "parent"; 
    // ... 
} 

class child extends parent1 { 
    protected $id = "child"; 
} 

當然,替代方法是覆蓋子類中的print_id()

+0

謝謝你的回答! – david 2015-03-03 08:57:02

2

目前,當你調用create_instance法對兒童類作爲父類的結果,比如,你想到的是創建不子類。

使用後期靜態的父類綁定「create_instance」的方法:

public static function create_instance() 
{ 
    $instance = new static(); 
    return $instance; 
} 

更多細節http://php.net/manual/en/language.oop5.late-static-bindings.php

+0

謝謝你的回答,但我仍然得到父母; – david 2015-03-03 08:50:59