<?php
 // -- Classe Directeur --
 class Directeur
 { // propriétés
   public $nom ;
   // Constructeur
   function __construct($n) {$this->nom=$n;}
   // Méthodes
   public function AffAssistant(Assistant $unA) {
     echo "Assistant : ".$unA->nom.PHP_EOL;
   }
   public function ChiffreAffaire(array $res) {
     echo "-- Chiffres d'affaire --".PHP_EOL;
     foreach($res as $a => $val) {
       $valF=number_format($val,2,","," ")." €";
       echo "$a : $valF".PHP_EOL               ;
     }
   }
   public function AffEquipe(Iterator $E) {
     echo "-- Equipe des ingénieurs --".PHP_EOL;
     foreach($E->P as $num => $valeur) {$NumI=$num+1;
       echo "Ingénieur ".$NumI." : ".$valeur.PHP_EOL;
     }
   }
   public function AffPrev(callable $fonction,array $tab) {
     call_user_func($fonction,$tab);
   }
 }
 // -- Classe Assistant --
 class Assistant {
  public $nom ;
  function __construct($n) {$this->nom=$n;}
 }
 // -- Classe Equipe --
 class Equipe implements Iterator
 { // -- Les propriétés --
   public $P = array();
   // -- Constructeur --
   function __construct($T){$this->P=$T;}
   public function rewind(){reset($this->P);}
   public function current(){$R=current($this->P);return $R;}
   public function key(){$R=key($this->P);return $R;}
   public function next(){$R=next($this->P);return $R;}
   public function valid(){$clef=key($this->P);
     $R=(($clef!==NULL) && ($clef!==FALSE));
     return $R;
   }
 }
 // === Fonction utilisateur ===
 // -- Projection du chiffre d'affaire --
 function projection($resC) {
    echo "-- Projections --".PHP_EOL;
    foreach($resC as $a => $val) {
      $valF=number_format($val*2,2,","," ")." €";
      $as=$a+2                                  ;
      echo "$as : $valF".PHP_EOL                ;
    }
 }
 // === Programme ===
 $equipe      = array("dupont","martin","durand")   ;
 $ResAnnuels  = array(2014=>12345.76,2015=>21340.88);
 $UnDirecteur = new Directeur("Bigboss")            ;
 $UnAssistant = new Assistant("Pignon")             ;
 $UneEquipe   = new Equipe($equipe)                 ;

 $UnDirecteur->AffAssistant($UnAssistant)       ;
 $UnDirecteur->AffEquipe($UneEquipe)            ;
 $UnDirecteur->ChiffreAffaire($ResAnnuels)      ;
 $UnDirecteur->AffPrev('projection',$ResAnnuels);
?>
