<?php
 // === Interface Controle d'accès d'une Entreprise ===
 interface ContEntreprise
 { // -- Les méthodes --
   public function setCont($id,$type,$date);
   public function getCont($id);
 }
 // === Interface pour getteur et setter d'une personne ===
 interface SetGetPersonne
 { // -- Les méthodes --
   public function setVar($id,$nom,$prenom);
   public function getVar($id);   
 }
 // === Classe GestCont de gestion des contrôles ===
 class GestCont
 { // -- Les propriétés --
   protected $TabCont = array();
   // Méthodes de l'interface ContEntreprise
   public function setCont($id,$type,$date) {
     $id   = trim($id)              ;     
     $type = strtoupper(trim($type));     
     $date = trim($date)            ; 
     $this->TabCont[]=array('id'=>$id,'type'=>$type,'date'=>$date);
   }
   public function getCont($id) {
     unset($listeR);
     foreach($this->TabCont as $etiquette=>$unControl){
       if ($unControl['id']==$id) {$listeR[]=$unControl;}
     }     
     return $listeR;
   }
   public function AfficheC($id) {
    $listeDesControles=$this->getCont($id);
    echo "Liste des acess : ".PHP_EOL;
    foreach($listeDesControles as $num => $unControl) {
      echo "   ".$unControl['id']." - ".$unControl['type']." - ".$unControl['date'].PHP_EOL;
    }
   }
 }
 // === Classe Personnel ===
 class Personnel extends GestCont implements ContEntreprise,SetGetPersonne
 { // -- Les propriétés --
   protected $TabVars = array();
   // Méthodes de l'interface SetGetPersonnes
   public function setVar($id,$nom,$prenom) {
     $id     = intval(trim($id))        ;     
     $nom    = strtoupper(trim($nom))   ;
     $prenom = strtoupper(trim($prenom));
     $this->TabVars[$id]=array('nom'=>$nom,'prenom'=>$prenom);
   }
   public function getVar($id) {return $this->TabVars[$id];}
   // Les méthodes de l'interface ContEntreprise sont héritées
   // Méthodes de la classe
   public function AfficheP($id) {
     $une_personne=$this->getVar($id);
     echo $id." : ".$une_personne['nom']." - ".$une_personne['prenom'].PHP_EOL;
   } 
 }
 // === Classe Livraison ===
 class Livraison extends GestCont implements ContEntreprise{}
 
 // === Programme ===
 // Création d'un salarié
 $UnSalarie = new Personnel() ;
 $UnSalarie->setVar(324152,"martin","pierre");
 // Affectation des contrôles d'accès
 $UnSalarie->setCont(324152,"E","12/11/2015-09:43:00");
 $UnSalarie->setCont(324152,"S","12/11/2015-18:30:00");
 $UnSalarie->setCont(324152,"E","13/11/2015-08:30:00");
 $UnSalarie->setCont(324152,"S","13/11/2015-17:45:18");
 // Création d'une livraison
 $UneLivraison = new Livraison() ;
 // Affectation  contrôles d'accès
 $UneLivraison->setCont("CopieExpress","E","12/11/2015-09:43:00");
 $UneLivraison->setCont("CopieExpress","S","12/11/2015-09:45:00");
 // Affichage salarié
 echo "--- Salarié ---".PHP_EOL;
 $UnSalarie->AfficheP(324152) ;//Méthode la Classe Personnel
 $UnSalarie->AfficheC(324152) ;//Méthode la Classe Personnel
 // Affichage livraison
 echo "--- Livraison ---".PHP_EOL;
 $UneLivraison->AfficheC("CopieExpress") ;//Méthode la Classe Livraison
?>