2014-11-20 3 views
0

Поэтому у меня есть следующий интерфейс, определенный для автомобиля:инъекционных интерфейсов в класс PHP

interface FuelTank 
{ 
    public function useFuel(); 
} 

interface WaterTank 
{ 
    public function useWater(); 
} 

interface CarInterface extends FuelTank, WaterTank 
{ 
    public function drive($miles); 

    public function setFuelTank(FuelTank $tank); 

    public function setWaterTank(WaterTank $tank); 
} 

Я попытался создать класс, который реализует и соответствует к CarInterface, но у меня возникают проблемы с впрыском зависимостей FuelTank и Watertank. Это класс, я придумал:

class Car implements CarInterface 
{ 
    protected $fuelTank; 
    protected $waterTank; 

    public function drive($miles) 
    { 
     return $miles; 
    } 

    public function useWater() 
    { 

    } 

    public function useFuel() 
    { 

    } 

    public function setFuelTank(FuelTank $tank) 
    { 
     $this->fuelTank = $tank; 
    } 

    public function setWaterTank(WaterTank $tank) 
    { 
     $this->waterTank = $tank; 
    } 
} 

Теперь, когда я запускаю следующее:

$car = new Car; 
$car->setFuelTank(new FuelTank); 

Я получаю сообщение:

Fatal error: Cannot instantiate interface FuelTank

Я также не могу объявить класс FuelTank, как только я получаю эту ошибку:

Fatal error: Cannot redeclare class FuelTank

Может кто-нибудь помочь мне понять, как правильно реализовать интерфейс выше и что здесь происходит?

+0

Вы не можете создать интерфейс как класс. Это $ car-> setFuelTank (новый FuelTank); неправильно. – Deepak

ответ

1

Вы должны переименовать интерфейс FuelTank в FuelTankInterface и объявить класс FuelTank, который реализует FuelTankInterface. Интерфейс не может быть создан.

+0

Что делать, если интерфейс определен для меня и не может быть изменен? В любом случае, этот интерфейс может быть реализован? – harryg

+0

Создайте класс FuelTankClass, который реализует FuelTank. Именование не очень приятно. Зачем нужно назвать интерфейс FuelTank и другой интерфейс CarInterface. Лучше быть последовательным ... – Tom

+0

Ну да, но с учетом интерфейса определяет параметр 'setFuelTank' как объект' FuelTank', я не могу изменить имя класса. – harryg

Смежные вопросы