07-06-2015, 10:35 AM
Il n'y a pas besoin de instanceof selon moi.
Puisqu'une Marque n'a pas de comportement elle a aucun intérêt à être dans une interface.
Puisqu'une Marque n'a pas de comportement elle a aucun intérêt à être dans une interface.
<?php
namespace Voiture;
interface Voiture
{
public function jeVeuxConnaitreTaCouleurEtTaMarque(Acheteur $acheteur);
}
interface Acheteur
{
public function acheter(Voiture $voiture);
public function laMarqueEtLaCouleurDeLaVoitureSont(
Marque $marque,
Couleur $couleur,
Voiture $voiture
);
}
final class Marque
{
private $pattern = '/^[A-Z][a-z]*$/';
/**
* @params string
*/
public function __construct($value)
{
if (is_string($value) === false) {
throw new \RuntimeException('Marque should be construct from a string');
}
if (strlen($value) === 0) {
throw new \RuntimeException('Marque length should be greater than 0');
}
if (preg_match($this->pattern, $value) !== 1) {
throw new \RuntimeException('Marque should match the pattern ' . $this->pattern);
}
$this->value = $value;
}
public function equals(Couleur $couleur)
{
return $this->value === $couleur->value;
}
}
final class Couleur
{
private $pattern = '/^[a-z]*$/';
/**
* @params string
*/
public function __construct($value)
{
if (is_string($value) === false) {
throw new \RuntimeException('Couleur should be construct from a string');
}
if (strlen($value) === 0) {
throw new \RuntimeException('Couleur length should be greater than 0');
}
if (preg_match($this->pattern, $value) !== 1) {
throw new \RuntimeException('Couleur should match the pattern ' . $this->pattern);
}
$this->value = $value;
}
public function equals(Couleur $couleur)
{
return $this->value === $couleur->value;
}
}
namespace Application;
class F50 implements \Voiture\Voiture
{
private $couleur;
private $marque;
public function __construct(\Voiture\Couleur $couleur)
{
$this->couleur = $couleur;
$this->marque = new \Voiture\Marque('Ferrari');
}
public function jeVeuxConnaitreTaCouleurEtTaMarque(\Voiture\Acheteur $voiture)
{
$voiture->laMarqueEtLaCouleurDeLaVoitureSont($this->marque, $this->couleur, $this);
return $this;
}
}
class Irma implements \Voiture\Acheteur
{
private $voitureCouleur;
private $voitureMarque;
public function acheter(\Voiture\Voiture $voiture)
{
$irma = new Irma();
$voiture->jeVeuxConnaitreTaCouleurEtTaMarque($irma);
if (
$irma->voitureCouleur == new \Voiture\Couleur('rouge')
&& $irma->voitureMarque == new \Voiture\Marque('Ferrari')
) {
echo "J'achète\n";
}
return $this;
}
public function laMarqueEtLaCouleurDeLaVoitureSont(
\Voiture\Marque $marque,
\Voiture\Couleur $couleur,
\Voiture\Voiture $voiture
) {
$this->voitureMarque = $marque;
$this->voitureCouleur = $couleur;
return $this;
}
}
$f50 = new F50(new \Voiture\Couleur('rouge'));
$irma = new Irma();
$irma->acheter($f50);