Peter
Peter

Reputation: 447

Unexpected behaviour using namespaces and dependency injection in PHP

I'm new using namespaces and dependency injection in PHP. I have a simple code:

Body class

<?php namespace Libraries\Models;

class Body {

  private $brand;

  public function __construct()
  {

  }

  public function getBrand()
  {
    return $this->brand;
  }

  public function setBrand($brand)
  {
    $this->brand = $brand;
  }
}

Engine class

<?php namespace Libraries\Models;

class Engine {

  private $brand = '';
  private $hp = '';

  public function __construct()
  {

  }

  public function getBrand()
  {
    return $this->brand;
  }

  public function setBrand($brand)
  {
    $this->brand = $brand;
  }

  public function getHp()
  {
    return $this->hp;
  }

  public function setHp($hp)
  {
    $this->hp = $hp;
  }
}

Car class

<?php namespace Libraries\Models;

class Car {

  private $engine;
  private $body;

  public function __construct(Engine $engine, Body $body)
  {
    $this->engine = $engine;
    $this->body = $body;
  }
}

As you see, just a Car which may have different Bodies and Engines. Well, I use this code to test how it works:

test.php

<?php
require 'models/Car.php';
require 'models/Engine.php';
require 'models/Body.php';

$engine = new Libraries\Models\Engine();
$body = new Libraries\Models\Body();

$engine->setBrand('Renault');
$engine->setHp(750);
$body->setBrand('RedBull');
$redbull = new Libraries\Models\Car($engine, $body);

$engine->setBrand('Ferrari');
$engine->setHp(800);
$body->setBrand('Ferrari');
$ferrari = new Libraries\Models\Car($engine, $body);

echo '<pre>', print_r($redbull), '</pre>';
echo '<pre>', print_r($ferrari), '</pre>';

The result is that the $redbull and the $ferrari Cars, both have the same Body and Engine and this is not what I expected.

Libraries\Models\Car Object
(
    [engine:Libraries\Models\Car:private] => Libraries\Models\Engine Object
        (
            [brand:Libraries\Models\Engine:private] => Ferrari
            [hp:Libraries\Models\Engine:private] => 800
        )

    [body:Libraries\Models\Car:private] => Libraries\Models\Body Object
        (
            [brand:Libraries\Models\Body:private] => Ferrari
        )

)

Libraries\Models\Car Object
(
    [engine:Libraries\Models\Car:private] => Libraries\Models\Engine Object
        (
            [brand:Libraries\Models\Engine:private] => Ferrari
            [hp:Libraries\Models\Engine:private] => 800
        )

    [body:Libraries\Models\Car:private] => Libraries\Models\Body Object
        (
            [brand:Libraries\Models\Body:private] => Ferrari
        )

)

Do I have to create new Body and Engine for each Car I want to create?

Thanks!

Upvotes: 0

Views: 109

Answers (1)

user1344381
user1344381

Reputation: 56

it is not a namespace problem

You have to construct a second time your engine object and body object

$engine = new Libraries\Models\Engine();
$body = new Libraries\Models\Body();

$engine->setBrand('Renault');
$engine->setHp(750);
$body->setBrand('RedBull');
$redbull = new Libraries\Models\Car($engine, $body);

$engine = new Libraries\Models\Engine();
$body = new Libraries\Models\Body();

$engine->setBrand('Ferrari');
$engine->setHp(800);
$body->setBrand('Ferrari');
$ferrari = new Libraries\Models\Car($engine, $body);

Upvotes: 1

Related Questions