2017-03-08 155 views
0

我正在爲此苦苦掙扎了一段時間,由於谷歌在這個問題上有tons of results我想知道我在做什麼錯誤,因爲沒有任何解決方案似乎適用於我。將繼承構造子類的構造參數傳遞給繼承子類

我有兩個類FileImage。我讓File類決定輸入是圖像還是其他類型的文件。當文件是圖像時,我想將該文件傳遞給Image類來處理它。

到目前爲止,我有這個

Class File{ 
    public $file; 

    function __construct($input){ 
      $this->file = $input; 
    } 

    public function getFileType(){ 
      // determine filetype of $this->file 
      return 'image'; 
    } 
} 

Class Image Extends File{ 

    function __construct(){} 

    public function test(){ 
      return $this->file; 
    } 
} 

$file = new File('file.jpg'); 
if($file->getFileType() == 'image'){ 
    $image = new Image; 
    echo $image->test(); 
} 

但這並不輸出任何東西。我如何訪問繼承類中父類的構造函數參數的值?在子構造函數類中調用parent::__construct();(如mentioned here)給了我一個缺少的參數警告,並且this onecall_user_func_array(array($this, 'parent::__construct'), $args);在子構​​造函數中)也不起作用。

我在想什麼?

+0

'$ image'和'$ file'是__2__個不同的對象。 –

+0

我知道,但我認爲(基於...以及我的假設)通過使Image類成爲文件類的擴展,我可以繼承父類的值。我在這個假設上錯了嗎? – Maurice

+0

@Maurice - 問題是Image是派生類,而File是父類。這兩個類都是獨立的對象,子類可以訪問父類的(公共)屬性/方法。 在你的情況下,你正在嘗試它,反過來,你傳遞的東西到PARENT類,並試圖訪問這個在子類中,這將無法正常工作,因爲子類是一個不同的對象 – xhallix

回答

2

首先您需要了解的是$image$file在您的代碼中是2個不同的對象。

$image$file一無所知,反之亦然。

與您的代碼設計的解決方案可以是:

Class File { 
    public $file; 

    function __construct($input){ 
      $this->file = $input; 
    } 

    public function getFileType(){ 
      // determine filetype of $this->file 
      return 'image'; 
    } 
} 

Class Image Extends File{ 

    function __construct($input) 
    { 
     parent::__construct($input); 
     // after that you have `$this->file` set 
    } 

    public function test(){ 
      return $this->file; 
    } 
} 

$file = new Image('file.jpg'); 
if ($file->getFileType() == 'image'){ 
    echo $file->test(); 
} 

但是,這種做法是凌亂。你創建類Image的對象,並在創建後確保它是真正的圖像。我想你需要使用類似fabric模式的東西,並在File類中生成適當類型的對象。

+0

啊謝謝!這清理了很多! – Maurice