Les objets : définitions Structure de données associant des attributs et des méthodes qui décrivent le comportement de l'objet. Héritage de la conception objet (UML). Définie dans une classe. Un objet est une instance de classe. Ex : Voiture est une classe. Punto est un objet instance de cette classe. 1 Les objets : UML Véhicule modele:string * construit 1 Constructeur nom:string string:print() Lien d'héritage : Une Voiture est un Véhicule. Voiture est un descendant de Véhicule (spécialisation). Véhicule est le parent de Voiture (généralisation). Voiture nbplaces : int Moteur cylindree : int int:getnbplaces() string : demarrer() int:getcylindree() 2 1
Les objets : Encapsulation Un objet ne montre pas toutes ces propriétés (attributs et méthodes), c'est l'encapsulation : Private : accessible uniquement dans la classe. Public : accessible par tous (var de php4). Protected : accessible uniquement par les descendants. 3 Les objets : Les messages Les classes communiquent entre elles par des messages : - Appel de méthodes avec paramètre et retour éventuel d'information. Constructeur nom:string Afficher() Véhicule modele:string modele string:afficher() 4 2
Les objets : déclaration de classe class nomclasse { // déclaration des attributs private $prop1; private $prop2; // définition du constructeur function construct ($prop1,$prop2) { $this prop1=$prop1; $this prop2=$prop2; // définition des méthodes function method1($arg1,$arg2 ) { 5 Les objets : méthodes Accesseurs: donnent accès aux propriétés function getprop1() { return $this prop1; Mutateurs: modifient les propriétés function setprop1($val1) { $this prop1=$val1; 6 3
Les objets : exemple // fichier vehicule.class.php class Vehicule { private $modele; // les attributs peuvent être déclarés dynamiquement. function construct($modele) { $this->modele=$modele; function getmodele() { return $this->modele; function setmodele($modele) { $this->modele=$modele; function print() { echo $this modele."<br/>"; 7 Les objets : utilisation On parle d'instanciation de la classe <?php require("vehicule.class.php"); $voiture=new vehicule("punto"); echo $voiture getmodele(); $voiture->setmodele("bravo"); $voiture->print();?> 8 4
Les objets : remarques Un objet peut être stocké dans une variable de session si il est déclaré avant son utilisation En php4, les méthodes et attributs des objets sont tous public, donc accessibles partout ou l'objet est utilisé. 9 Les objets : héritage Vehicule modele:string string:print() Voiture nbplace : string int:getnbplace() <?php class Voiture extends Vehicule { private $nbplace; function construct($modele,$nbplaces) { parent:: construct($modele); $this nbplaces = $nbplaces; fucntion print() { parent::print(); echo "Nombre de places assises ".$this getnbplaces(); function getnbplaces() { return $this->nbplaces;?> 10 5
Les objets : Polymorphisme d'héritage Une méthode peut être redéfinie lors de la spécialisation : c'est la redéfinition. Les deux classes peuvent avoir des méthodes de même nom, de même signature et de comportement différent. L'appel à ces méthodes est identique. C'est le polymorphisme. On appel la méthode sans se soucier du type de l'objet. 11 Les objets : Polymorphisme ad hoc On peut étendre cette propriété à des classes non parentes class Voiture { private $marque; private $modele; function construct($marque, $modele) { $this->marque=$marque; $this->modele=$modele; function print() { echo $this->marque." ".$this->modele; class Animal { private $espece; private $poids; function construct($espece, $poids) { $this->espece=$espece; $this->poids=$poids; function print() { echo $this->espece." ".$this->poids; $tableau : array($chat,$chien,$voit1,$lapin,$voit2); foreach ($tableau as $truc) $truc print(); 12 6
Les objets : Polymorphisme paramétrique Deux méthodes de même nom définies dans la même classe, avec une signature différente. C'est la surcharge. Lors de l'appel elles sont différenciées par les paramètres et la bonne méthode est appelée. Interdit en php 13 Les objets : Classe abstraite Classe uniquement définie pour être étendue. Elle est non instanciable. Factorise du code. Déclare des méthodes abstraites (sans code) qui devrons être définies dans les classes filles abstract class MaClasse { private $nom; function print() { echo $nom; abstract mamethode($monattrib); 14 7
Les objets : méthodes statiques Méthodes appelées sans instanciation (new) maclasse::mamethodstatic(); Exemple class Voiture { static function liste_attributs() { return array("marque","modele"); print_r($voiture::liste_attributs()); Ne contient pas de $this parce que les attributs, ne sont pas accédées lors de l'appel de méthodes statiques. 15 Les objets : classe finale Classes ou méthodes qui ne peuvent être étendues final class maclasse { class maclass { final function connect() { 16 8
Les objets : Interface Décrivent les classes sans instancier les méthodes. Définis les pré-requis à l'instanciation des classes qui les implémentent. Contient les prototypes des méthodes. Définis un contrat à remplir. 17 Les objets : Interface interface DAO { function get($id); function update($obj); function delete($id); function insert($obj); 18 9
Les objets : Interface class DAOArticle implements DAO { function get($id) { function update($obj) { function delete($id) { function insert($obj) { Si la classe n'implémente pas au minimum ces 4 fonction => erreur php. 19 Les objets : Interface N'assure pas de contrôle des types de variable passées en argument des méthodes Simule l'héritage multiple en assurant que la classe fille disposera bien au moins de toutes les méthodes de ses "classes mères". 20 10
Les objets : Interface class DAOArticle extends Element implements DAO { function construct($id,$title,$content,$auteur){ Element +id: integer +title: string DAO parrent:: construct($id,$title); $this content = $content; $this auteur = $auteur; DAOArticle +content: text +auteur: string function insert($obj) { function update($obj) { function get($id) { function delete($id) { 21 Les objets : sérialisation serialize() transforme un objet en chaine. permet de l'enregistrer dans un fichier ou une base de données. unserialize() appelé après la déclaration de la classe reconstruit l'objet. Opération effectuée automatiquement quand un objet est stocké dans la session. Il faut donc déclarer la classe avant session_start(). Problème si session automatique dans php.ini 22 11
TP 7 Element +pos_x: int +pos_y: int +date_creation: date +date_modification: date +display() Article +titre: string +chapeau: string +texte: string Photo +titre: string +fichier: string +commentaire: string Lien +titre: string +href: string +target: string Implémenter ce diagramme en PHP à l'aide de classes 23 TP 8 Ecrire une classe DAOElement charger d'instancier la classe Element à partir des données de la base de donnée : - Créer une table Element(pos_x,pos_y,date_creation,date_modification) - Créer la classe DAOElement selon la classe UML DAOElement +db: resource +connect() +find() +insert() +update() +delete() +findall() 24 12
3 - Design pattern Décrivent un ensemble de solution standard de conception d'architecture logiciels répondant à une préoblématique donnée. Le design pattern le plus utilisé pour le web est MVC 25 3 - MVC Modèle - Vue - Contrôleur. Décompose la conception en 3 parties : Les modèles décrivent les classes et méthodes d'accès aux données. Les vues se chargent de la présentation de ces données. Les contrôleurs manipulent les premières pour alimenter en contenu les secondes. 26 13
3 - MVC - Vue article.tpl.php <div class="article"> <h1><?php echo $article titre;?></h1> <h2><?php echo $article soustitre;?></h2> <p> <b><?php echo $article chapeau;?></b> </p> <p> <?php echo $article contenu;?> </p> </div> 27 3 - MVC - Modèle article.obj.php Class Article extends Element implements DAO { private $id; private $titre; private $soustitre; private $chapeau; private $contenu; function construct($id,$titre,$soustitre$chapeau,$contenu) { $this id=$id; $this titre=$titre; 28 14
3 - MVC - Modèle function insert() { $article=array{"id"=>$this id, "titre"=>$this->titre ; DB::insert("Article,"$article); 29 3 - MVC - Contrôleur Article.ctrl.php require("article.obj.php"); function addarticle($post) { $article=new Article('',$post["titre"], $post["soustitre"], $post["chapeau"], $post["contenu"]); $article insert(); function viewarticle($id) { $article=article::get($id); include("article.tpl.php"); 30 15