Reputation: 447
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
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