2017-09-14 55 views
0

这是我的代码。我没有经验,所以请用简单的语言告诉我答案。如何覆盖PHP类的构造函数?

<?php 
function println($message) { 
    echo "\n".$message; 
} 

println是essentialy回声,但与消息之前的\ n。我只是习惯于Python 3,但不能使用print()。

class Car { 
    public function __construct($name) { 
    //If the constructor is that of a car, it will be said that a car was made. 

     println("Car made!"); 
     $this->distance_drived = 0; 
     $this->name = $name; 
    } 
    function introductory() { 
     return "This car is called ".$this->name."."; 
    } 
} 

class Battery { 
    function __construct($max_capacity, $current_capacity) { 
     echo "Constructed!"; 
     $this->max_capacity = $max_capacity; 
     $this->current_capacity = $current_capacity; 
    } 
    function fill($amount) { 
     if ($amount + $this->current_capacity >= $this->max_capacity) { 
      $this->fill_full(); 
     } else { 
      $this->current_capacity += $amount; 
     } 
    } 
    function fill_full() { 
     $this->current_capacity = $this->max_capacity; 
    } 
    function use_power($amount) { 
     if ($amount + $this->current_capacity >= $this->max_capacity) { 
      return $this->current_capacity; 
      $this->current_capacity = 0; 
     } else { 
      $this->current_capacity -= $amount; 
      return $amount; 
     } 
    } 
    function check_percentage() { 
     return ($this->current_capacity/$this->max_capacity) * 100; 
    } 
} 

class ElectricCar extends Car { 
    public function __construct($name, $max_capacity, $current_capacity, $power_per_km) { 
     println("Electric car made!"); 

     //If the constructor is that of an electric car, it will be said that a car was made. 

     $this->distance_drived = 0; 
     $this->name = $name; 
     println($max_capacity); 
     $this->battery = new Battery($max_capacity, $current_capacity); 
    } 
    public function move($km) { 
     $power_required = $km * $this->power_per_km; 
     $used = $battery->use_power($power_required); 
     $this->distance_drived += $used/$this->power_per_km; 
    } 
} 

$toyota = new Car("Toyota 2017"); 
println($toyota->name); 
println($toyota->introductory()); 
$tesla = new Car("Tesla Model S", 1000, 750, 5); 
println($tesla->introductory()); 
println("Capacity is ".$tesla->battery->max_capacity); 

?> 

我的主要问题是,该消息仍然是汽车的在ElectricCar消息,所以__construct()并没有改变。

+0

尝试'$特斯拉=新ElectricCar(“特斯拉S型“,1000,750,5);'那么至少你会使用正确的类来实例化'$ tesla'对象 – RiggsFolly

+0

我建议我们把它作为TYPO来关闭 – RiggsFolly

回答

4

您的问题是在这条线:

$tesla = new Car("Tesla Model S", 1000, 750, 5); 

你从来没有试图创造一个ElectricCar。将该行更改为

$tesla = new ElectricCar("Tesla Model S", 1000, 750, 5); 

并且所有内容都应按预期工作。

1

其实你已经覆盖父构造函数,只是在子类中写一个新的构造函数。当你不重写构造函数时,则调用父函数。

从您的代码中,我可以看到您将Tesla创建为Car,而不是ElectricCar,这就是您获取Car消息而不是ElectricCar消息的原因。

FYI当你希望你的孩子类的构造函数来扩展父类的构造函数,你所要做的是调用父类的构造这样

parent::__construct();