将构造函数参数传递给继承的子类

时间:2017-03-08 08:23:02

标签: php oop

我现在已经挣扎了一段时间,因为谷歌在这个问题上有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 one(子构造函数中的call_user_func_array(array($this, 'parent::__construct'), $args);)也不起作用。

我缺少什么?

1 个答案:

答案 0 :(得分: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类中生成适当类型的对象。