Jérôme CUTRONA jerome.cutrona@univ-reims.fr PHP5 objet "avancé" Jérôme CUTRONA jerome.cutrona@univ-reims.fr 03:07:13 Programmation Web 2018-2019.

Slides:



Advertisements
Présentations similaires
PHP5 its a kind of magic. Chargement automatique function __autoload( $nom_classe ) { require_once('obj/'.$nom_classe.'.class.php'); } si on exécute le.
Advertisements

11:37:32 Programmation Web PHP5 objet "avancé" Jérôme CUTRONA
PHP Interface base de données
1 IFT 6800 Atelier en Technologies dinformation Le langage de programmation Java chapitre 3 : Classes et Objects.
Cours du 5 novembre.
PHP5 objet "avancé" Jérôme CUTRONA 09:56:48 Programmation Web
Bases de données Singleton pour la connexion
Introduction à la Programmation Orientée Objet H.GATI.
C++ Les fonctions. Présentation Utilité : Dès qu'un programme dépasse la centaine de lignes de code, il est pratique de pouvoir le décomposer en plusieurs.
Windows NT/2000/XP Enjeux et contraintes techniques Huitième partie Le langage C# (1/2) C. Casteyde Document diffusé sous licence GNU FDL.
Les profils du SEDA confection de profil avec Agape.
1 Programmation en C++ C++ de base ● Programme C++ ● Variables, objets, types ● Fonctions ● Namespace ● Tests ● Boucles ● Pointeurs, références.
1 Programmation en C++ C++ de base ● Programme C++ ● Variables, objets, types ● Types et opérations fondamentales ● Tests ● Boucles ● Pointeurs, références.
1 Programmation en C++ Cycle de vie ● La vie d'un objet ● Destructeur ● Gestion de mémoire dynamique.
1 Programmation en C++ IO en C++/SL ● Standard Library ● Types, objets pour IO ● L'entrée de clavier ● Sortie à l'écran ● Fichiers.
DIAGRAMME DE DEPLOIEMENT Exposé de: MBALLA MEKONGO Michèle MBOUNA FEUZE William SIEYADJEU Alex Lionel CHOPGWE Leonard NDUMATE Landry TIDJON Lionel.
Cours 08 SYSTÈME DE FICHIERS
Procédures Framework LDAP
UE2 - M22 Licence acoustique
Cross-Plateform Cours JavaScript
Chapitre 5 Les Modificateurs d’accès,les packages et les interfaces.
Environnement de développement des BD
LES TABLEAUX EN JAVA.
Session 1 6 mars 2017 Plateforme ICONICS Justine Guégan
Pas de variable globale
Les notions de classe et d'objet
Détection des erreurs.
Algorithmique demander jeu du pendu.
Ajouter le code dans une page html
Initiation aux bases de données et à la programmation événementielle
Présentation python : Épisode 3
JAVA et POO : Notion d'héritage
Javadoc et débogueur Semaine 03 Version A16.
PHP Création et manipulation d'images
Bases de programmation en Python
Principes de programmation (suite)
Polymorphisme : règles
Tableaux à plusieurs dimensions en langage C
Asynchronous Javascript And Xml
Algorithmique & Langage C
Semaine #4 INF130 par Frédérick Henri.
Bonnes pratiques Orienté Objet et Java
Programmation en C++ Classes
Programmation en C++ C++ de base
Cours N°10: Algorithmiques Tableaux - Matrices
Programmation Orientée Objet C# El Akel Bouchra ISMONTIC Tanger 2013/2014.
Chapter 12: Structures de données
Programmation Orientée Objet
Programmation Android Bases De Données, SQL-lite
Introduction à Internet
Développement d’applications interactives
PHP Création et manipulation d'images
Les classes et les objets
HÉRITAGE IFT A03.
Langages de programmation TP11
JDepend - Analyse de la qualité du code Java -
Programmation Orientée Objet MMI 2ème année – S3
Schéma de conception Factory Method Exemple
Reconnaissance de formes: lettres/chiffres
Opérateurs et fonctions arithmétiques Opérateurs de relation Opérateurs logiques Cours 02.
PROGRAMMATION ET ENSEIGNEMENT
Le langage C# : Partie 1.
INTERFACE ET POLYMORPHISME
Arbre binaire.
Retour sur les interfaces
Jérôme CUTRONA PHP objet Jérôme CUTRONA 08:30:34 Programmation Web
Python Nicolas THIBAULT
Bases de données Singleton pour la connexion
© Robert Godin. Tous droits réservés.
Type Tableau Partie 1 : Vecteurs
Transcription de la présentation:

Jérôme CUTRONA jerome.cutrona@univ-reims.fr PHP5 objet "avancé" Jérôme CUTRONA jerome.cutrona@univ-reims.fr 03:07:13 Programmation Web 2018-2019

Auto-chargement de classes 03:07:13 Programmation Web 2018-2019

Auto-chargement de classes Déclenché si une classe n'est pas encore définie au moment de son utilisation Dernière chance pour inclure automagiquement une définition de classe Besoin d’une règle claire entre le nom de classe et le nom du fichier contenant sa définition function __autoload($class_name) { require_once $class_name . '.class.php'; } $a = new Cercle() ;  require_once 'Cercle.class.php'; Obsolète depuis PHP 7.2 03:07:13 Programmation Web 2018-2019

Auto-chargement de classes spl_autoload_register Permet d’enregistrer une fonction dans la pile d’autochargement bool spl_autoload_register ( [ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] ) Exemple : spl_autoload_register( function ($class) {    include "src/{$class}.class.php"; } ); 03:07:13 Programmation Web 2018-2019

Méthodes magiques 03:07:13 Programmation Web 2018-2019

Méthodes "magiques" Ensemble de méthodes commençant par '__' __construct, __destruct __toString __clone __get, __set __isset, __unset __call __callStatic (PHP 5.3) __invoke() __sleep, __wakeup __set_state() 03:07:13 Programmation Web 2018-2019

Constructeur / destructeur 03:07:13 Programmation Web 2018-2019

__construct, __destruct Constructeur de l'objet Appelé lors de l'utilisation de new $c = new Point(10, -12) ; __destruct Destructeur de l'objet Appelé lorsque la dernière référence sur un objet est perdue $c = new Point(10, -12) ; $c = null ; 03:07:13 Programmation Web 2018-2019

__toString Permet de décrire le comportement de la classe lorsqu'une instance est convertie en chaîne Avant PHP 5.2, __toString n'est appelée que lors d'une combinaison directe avec echo ou print $a = new Affichable('Bonjour'); echo $a ; 03:07:13 Programmation Web 2018-2019

Conversion en chaîne 03:07:13 Programmation Web 2018-2019

__toString class Affichable { // en PHP 5.1.2 public $_d; public function __construct($d) { $this->_d = $d ; } public function __toString() { return $this->_d ; } } $a = new Affichable('Bonjour'); echo $a ; echo "Mon objet affichable :" . $a . "\n" ; echo "Mon objet affichable :$a\n" ; Bonjour Mon objet affichable :Object id #1 Mon objet affichable :Object id #1 03:07:13 Programmation Web 2018-2019

Copie d’objets 03:07:13 Programmation Web 2018-2019

__clone : principe Permet de décrire le comportement de la classe lorsqu'une instance est clonée $objet2 = clone $objet1 ; Clonage par défaut : copie des propriétés Nécessaire si : une propriété est un objet devant être dupliqué compteur d'instances d'une classe Ne peut PAS être appelée directement Intervient après la copie superficielle (=) Ne concerne que l'objet cloné (identiques) 03:07:13 Programmation Web 2018-2019

Copie superficielle object(Z)#1 (2) { ["_a:protected"]=> object(A)#2 (0) { } ["_b:protected"]=> object(B)#3 (0) { } } object(Z)#4 (2) { class A { } class B { } class Z { protected $_a ; protected $_b ; public function __construct() { $this->_a = new A() ; $this->_b = new B() ; } } $z1 = new Z() ; var_dump($z1) ; $z2 = clone $z1 ; var_dump($z2) ; 03:07:14 Programmation Web 2018-2019

Copie superficielle class A { } class B { } class Z { protected $_a ; protected $_b ; public function __construct() { $this->_a = new A() ; $this->_b = new B() ; } } $z1 = new Z() ; $z2 = clone $z1 ; Clonage de l'objet Z : duplication de l'objet par copie superficielle des attributs (simple =) Z A $_a $z1 $_b B Z $_a $z2 $_b 03:07:14 Programmation Web 2018-2019

__clone object(Z)#1 (2) { ["_a:protected"]=> object(A)#2 (0) { } ["_b:protected"]=> object(B)#3 (0) { } } object(Z)#4 (2) { ["_a:protected"]=> object(A)#5 (0) { } class A { } class B { } class Z { protected $_a ; protected $_b ; public function __construct() { $this->_a = new A() ; $this->_b = new B() ; } public function __clone() { $this->_a = clone $this->_a ; } } $z1 = new Z() ; var_dump($z1) ; $z2 = clone $z1 ; var_dump($z2) ; 03:07:14 Programmation Web 2018-2019

__clone class A { } class B { } class Z { protected $_a ; protected $_b ; public function __construct() { $this->_a = new A() ; $this->_b = new B() ; } public function __clone() { $this->_a = clone $this->_a ; } } $z1 = new Z() ; $z2 = clone $z1 ; Clonage de l'objet Z : duplication de l'objet par copie superficielle des attributs (simple =) Z A $_a $z1 $_b B Z $_a $z2 A $_b 03:07:14 Programmation Web 2018-2019

Surcharge d’attributs et de méthodes 03:07:14 Programmation Web 2018-2019

Surcharge en PHP Attributs : Possibilité de décrire le comportement d’une classe lorsqu’un attribut inaccessible tente d’être : lu : $x = $obj->attr modifié : $obj->attr = $x testé : if (isset($obj->attr)) … supprimé : unset($obj->attr) Méthodes : Possibilité de décrire le comportement d’une classe lorsqu’une méthode de classe ou d’instance tente d’être lancée 03:07:14 Programmation Web 2018-2019

Accesseurs / réaffecteurs 03:07:14 Programmation Web 2018-2019

__get, __set Permet de surcharger l'accès à des données membres inaccessibles d'une classe en lecture (__get) et en écriture (__set) Ne sont déclenchées que si la propriété demandée n'est pas accessible (private, protected ou inexistante) Les méthodes ne doivent PAS être static Les méthodes surchargées doivent être public Permet de donner un accès simplifié à des propriétés non accessibles directement Permet éventuellement d'effectuer des contrôles 03:07:14 Programmation Web 2018-2019

__get, __set class Point { private $_coord ; public function __construct($x, $y) { if (!is_numeric($x) || !is_numeric($y)) { throw new Exception( "Paramètres non numériques ($x, $y)") ; } $this->_coord['x'] = $x ; $this->_coord['y'] = $y ; … $p = new Point(1, 12) ; 03:07:14 Programmation Web 2018-2019

__get public function __get($prop) { if (!array_key_exists($prop, $this->_coord)) { throw new Exception( "Accès à une propriété inconnue ($prop)") ; } return $this->coord[$prop] ; … echo "p: ({$p->x}, {$p->y})\n" ; echo "p: ({$p->z}, {$p->t})\n" ; p: (1, 12) Fatal error: Uncaught exception 'Exception' with message 'Accès à une propriété inconnue (z)' in surcharge.php:19 Stack trace: #0 surcharge.php(37): Point->__get('z') #1 {main} thrown in surcharge.php on line 19 03:07:14 Programmation Web 2018-2019

__set public function __set($prop, $val) { if (!is_numeric($val)) { throw new Exception( "Valeur non numérique ($val)") ; } if (!array_key_exists($prop, $this->_coord)) { "Accès à une propriété inconnue ($prop)") ; $this->_coord[$prop] = $val ; $p->x = -12 ; echo "p: ({$p->x}, {$p->y})\n" ; p: (-12, 12) 03:07:14 Programmation Web 2018-2019

__isset, __unset Permet de surcharger l'accès à des données membres inaccessibles d'une classe par isset()(__isset) et par unset()(__unset) Ne sont déclenchées que si la propriété demandée n'est pas accessible (private, protected ou inexistante) Les méthodes ne doivent PAS être static Les méthodes surchargées doivent être public Permet de donner un accès simplifié à des propriétés non accessibles directement Permet éventuellement d'effectuer des contrôles 03:07:14 Programmation Web 2018-2019

Méthodes 03:07:14 Programmation Web 2018-2019

__call Permet de surcharger l'accès à des méthodes non accessibles d'une classe N'est déclenchée que si la méthode demandée n'est pas accessible (private, protected ou inexistante) Ne doit PAS être static Doit être public Permet de donner un accès simplifié à des méthodes non accessibles directement 03:07:14 Programmation Web 2018-2019

__call class Moteur { public function demarrer() { echo "Vroummm\n" ; } public function arreter() { echo "...\n" ; } } class Voiture { private $_moteur ; public function __construct() { $this->_moteur = new Moteur() ; } public function __call($method, $params) { if (!method_exists($this->_moteur, $method)) throw new Exception( "Méthode inconnue ($method)") ; call_user_func_array(array($this->_moteur, $method), $params) ; } } 03:07:14 Programmation Web 2018-2019

__call $v = new Voiture() ; $v->demarrer() ; $v->arreter() ; $v->avancer() ; Vroummm ... Fatal error: Uncaught exception 'Exception' with message 'Méthode inconnue (avancer)' in surcharge.php:61 Stack trace: #0 [internal function]: Voiture->__call('avancer', Array) #1 surcharge.php(70): Voiture->avancer() #2 {main} thrown in surcharge.php on line 61 03:07:14 Programmation Web 2018-2019

__callStatic (PHP 5.3) Permet de surcharger l'accès à des méthodes static non accessibles d'une classe N'est déclenchée que si la méthode demandée n'est pas accessible (private, protected ou inexistante) Doit être static Doit être public Permet de donner un accès simplifié à des méthodes non accessibles directement 03:07:14 Programmation Web 2018-2019

__callStatic (PHP 5.3) class Moteur { public static function demarrer() { echo "Vroummm\n" ; } public static function arreter() { echo "...\n" ; } } class Voiture { public static function __callStatic($method, $params){ if (!method_exists("Moteur", $method)) throw new Exception( "Méthode statique inconnue ($method)") ; call_user_func_array(array("Moteur", $method), $params) ; } } 03:07:14 Programmation Web 2018-2019

__callStatic (PHP 5.3) Voiture::demarrer() ; Voiture::arreter() ; Voiture::avancer() ; Vroummm ... Fatal error: Uncaught exception 'Exception' with message 'Accès à une méthode statique inconnue (avancer)' in callStatic.php on line 8 Call Stack: 1. {main}() callStatic.php:0 2. Voiture::avancer() callStatic.php:17 3. Voiture::__callStatic() callStatic.php:0 03:07:14 Programmation Web 2018-2019

Objet fonction 03:07:14 Programmation Web 2018-2019

__invoke Description du comportement d’un classe lorsqu’une instance est utilisée comme une fonction $t = new Traceur('log.txt') ; $t('Début') ; 03:07:14 Programmation Web 2018-2019

__invoke class Traceur { private $_nomFichier = null ; private $_ressource = null ; public function __construct($fichier) { $this->_nomFichier = $fichier ; $this->_ouvrirFichier() ; $this->ecrire('Fin construction') ; } public function __destruct() { $this->ecrire('Prêt pour la destruction') ; fclose($this->_ressource) ; private function _ouvrirFichier() { $this->_ressource = fopen($this->_nomFichier, 'a') ; public function ecrire($texte) { $ligne = strftime('%c') . ' : ' . $texte . "\n" ; fwrite($this->_ressource, $ligne) ; … 03:07:14 Programmation Web 2018-2019

__invoke Tue Oct 11 00:04:14 2011 : Fin construction … public function __invoke($texte) { $this->ecrire($texte) ; } } $t = new Traceur('log.txt') ; $t('Début') ; sleep(2) ; $t('Suite') ; sleep(3) ; $t('Terminé !') ; readfile('log.txt') ; Tue Oct 11 00:04:14 2011 : Fin construction Tue Oct 11 00:04:14 2011 : Début Tue Oct 11 00:04:16 2011 : Suite Tue Oct 11 00:04:19 2011 : Terminé ! 03:07:14 Programmation Web 2018-2019

Linéarisation d’objets 03:07:14 Programmation Web 2018-2019

Linéarisation d’objets Stockage d’une variable dans une forme « dormante » entre deux scripts La variable est réduite à une chaîne de caractères contenant ses caractéristiques La dé-linéarisation permet de retrouver la variable restaurée dans sa forme utilisable Les objets peuvent être (dé-)linéarisés Les attributs de classe posent problème Les attributs de type « ressource » posent problème 03:07:14 Programmation Web 2018-2019

Ne peut pas être linéarisé ! __sleep, __wakeup Type ressource : Ne peut pas être linéarisé ! class Traceur { private $_nomFichier = null ; private $_ressource = null ; public function __construct($fichier) { $this->_nomFichier = $fichier ; $this->_ouvrirFichier() ; $this->ecrire('Fin construction') ; } public function __destruct() { $this->ecrire('Prêt pour la destruction') ; fclose($this->_ressource) ; private function _ouvrirFichier() { $this->_ressource = fopen($this->_nomFichier, 'a') ; public function ecrire($texte) { $ligne = strftime('%c') . ' : ' . $texte . "\n" ; fwrite($this->_ressource, $ligne) ; … 03:07:14 Programmation Web 2018-2019

__sleep, __wakeup Tue Oct 11 00:06:52 2011 : Fin construction Tue Oct 11 00:06:53 2011 : Début Tue Oct 11 00:06:55 2011 : Suite Tue Oct 11 00:06:58 2011 : Terminé ! Tue Oct 11 00:06:58 2011 : Prêt pour la destruction Tue Oct 11 00:07:10 2011 : Debout là-dedans ! Tue Oct 11 00:07:10 2011 : Début Tue Oct 11 00:07:12 2011 : Suite Tue Oct 11 00:07:15 2011 : Terminé ! … public function __sleep() { return array('_nomFichier') ; } public function __wakeup() { $this->_ouvrirFichier() ; $this->ecrire('Debout là-dedans !') ; } if (isset($_SESSION['TRACEUR'])) { $t = $_SESSION['TRACEUR'] ; else { $t = new Traceur('log.txt') ; $t('Début') ; sleep(2) ; $t('Suite') ; sleep(3) ; $t('Terminé !') ; $_SESSION['TRACEUR'] = $t ; readfile('log.txt') ; 03:07:14 Programmation Web 2018-2019

Abstraction de classes 03:07:14 Programmation Web 2018-2019

Abstraction de classes Classes et méthodes abstraites Impossibilité de créer une instance d’une classe abstraite Toute classe contenant une méthode abstraite doit être définie abstraite Méthode abstraite : pas d'implémentation Implémentation de toutes les méthodes abstraites d'une classe dans la classe dérivée Méthodes abstraites protégées ou publiques 03:07:14 Programmation Web 2018-2019

Abstraction de classes : exemple abstract class Abstraite { abstract protected function nom() ; function affiche() { echo "Mon nom est '{$this->nom()}'" ; } class Concrete extends Abstraite { protected function nom() { return "Concrete" ; $a = new Abstraite() ; $c = new Concrete() ; $c->affiche() ; Classe abstraite Méthode abstraite protégée Concrétisation de la classe abstraite Implémentation de la méthode abstraite Instanciation de la classe abstraite Fatal error: Cannot instantiate abstract class Abstraite in dummy.php on line 72 Instanciation de la classe concrète Mon nom est 'Concrete' 03:07:14 Programmation Web 2018-2019

Typage des paramètres PHP >5 03:07:14 Programmation Web 2018-2019

Typage des paramètres PHP >5 Les paramètres des fonctions et méthodes peuvent être typés Les types sont alors forcément des types définis par l'utilisateur ou des tableaux (PHP 5.1) function puissance(Entier $n, Entier $p) { … } 03:07:14 Programmation Web 2018-2019

Typage des paramètres PHP >5 class Entier { public $_v ; public function __construct($v) { $this->_v = $v ; } public function egal(self $a) { return intval($this->_v == $a->_v) ; } } $E1 = new Entier(10) ; $E2 = new Entier(20) ; echo $E1->egal($E2) ; echo $E1->egal(12) ; Argument 1 passed to Entier::egal() must be an instance of Entier, integer given, … 03:07:14 Programmation Web 2018-2019

Typage des paramètres / valeurs de retour PHP >7 03:07:14 Programmation Web 2018-2019

PHP 4 Valeur de retour function moyenne($a,$b) { … } Arguments { … } Arguments function moyenne( $a, $b) Fonctionnement identique pour les méthodes Typage faible de PHP : Aucune information Typage faible de PHP : Aucune information Typage faible de PHP : Aucune information 03:07:14 Programmation Web 2018-2019

PHP 7 Valeur de retour function moyenne($a,$b) : int { … } Arguments { … } Arguments function moyenne( int $a, int $b) Fonctionnement identique pour les méthodes Possible de typer paramètre et valeur de retour Typage possible Typage possible Typage possible 03:07:14 Programmation Web 2018-2019

Typage des paramètres/retours PHP >5 Type Description Version PHP minimum Nom de la Classe/interface Le paramètre doit être une instanceof de la classe ou interface donnée. PHP 5.0.0 self Le paramètre doit être une instanceof de la même classe qui a défini la méthode. Ceci ne peut être utilisé que sur les méthodes des classes et des instances. array Le paramètre doit être un array. PHP 5.1.0 callable Le paramètre doit être un callable valide. PHP 5.4.0 bool Le paramètre doit être un boolean. PHP 7.0.0 float Le paramètre doit être un nombre flottant (float). int Le paramètre doit être un integer. string Le paramètre doit être une string. iterable Le paramètre doit être soit un array ou une instanceof Traversable. PHP 7.1.0 object Le paramètre doit être un object. PHP 7.2.0 03:07:14 Programmation Web 2018-2019

Interfaces 03:07:14 Programmation Web 2018-2019

Interfaces Permet de spécifier quelles méthodes doivent être implémentées par une classe Les méthodes doivent être identiques : au niveau du nom au niveau du nombre de paramètres au niveau de la nature de paramètres Une classe peut implémenter plusieurs interfaces Une classe peu implémenter une interface à n'importe quel niveau de la hiérarchie 03:07:14 Programmation Web 2018-2019

Classe implémentant l'interface Interfaces : exemple Interface interface Comparable { public function compare(self $a) ; } class Entier implements Comparable { public $_v ; public function __construct($v) { $this->_v = $v ; public function compare(self $a) { return intval($this->_v == $a->_v) ; Méthode de l'interface Classe implémentant l'interface Méthode de l'interface 03:07:14 Programmation Web 2018-2019

Parcours d’objets 03:07:14 Programmation Web 2018-2019

Parcours d’objets Parcours des attributs visibles avec foreach class Point { private $_x = 0 ; private $_y = 0 ; protected $_dim = 2 ; public $nom = "un point" ; public function parcours() { foreach ($this as $prop => $val) echo "$prop: $val\n" ; } } $p = new Point() ; foreach ($p as $prop => $val) echo "$prop: $val\n" ; $p->parcours() ; nom : un point _x: 0 _y: 0 _dim : 2 nom : un point 03:07:14 Programmation Web 2018-2019

Mot clé final 03:07:14 Programmation Web 2018-2019

Mot clé final (méthode) Rend impossible la surcharge d’une méthode par les classes filles class Simple { final public function affiche() { echo "Je suis Simple" ; } } class Etendue extends Simple { public function affiche() { parent::affiche() ; echo " mais aussi Etendue" ; Cannot override final method Simple::affiche() 03:07:14 Programmation Web 2018-2019

Mot clé final (classe) La classe ne peut plus être étendue final class Simple { public function affiche() { echo "Je suis Simple" ; } } class Etendue extends Simple { parent::affiche() ; echo " mais aussi Etendue" ; Class Etendue may not inherit from final class (Simple) 03:07:14 Programmation Web 2018-2019

Espaces de noms namespace 03:07:14 Programmation Web 2018-2019

Espaces de noms But : Syntaxe associée : namespace monespace; Éviter les collisions de noms pour les classes, interfaces, fonctions et constantes Pouvoir créer des alias des espaces de noms afin d’en simplifier l’accès Syntaxe associée : namespace monespace; Utilisation hiérarchique : namespace projet; namespace projet\interface; namespace projet\interface\html; 03:07:14 Programmation Web 2018-2019

Déclaration d’espaces de noms <?php namespace Projet\MySQL; class Connexion { /* ... */ } namespace Projet\LDAP; 03:07:14 Programmation Web 2018-2019

Déclaration d’espaces de noms <?php namespace Projet\MySQL { class Connexion { /* ... */ } } namespace Projet\LDAP { 03:07:14 Programmation Web 2018-2019

Utilisation des espaces de noms <?php require_once 'mysql.php' ; require_once 'ldap.php' ; $mysql = new Projet\MySQL\Connexion() ; $ldap = new Projet\LDAP\Connexion() ; 03:07:14 Programmation Web 2018-2019

Utilisation des espaces de noms <?php require_once 'mysql.php' ; require_once 'ldap.php' ; use Projet\MySQL ; $mysql = new MySQL\Connexion() ; $ldap = new Projet\LDAP\Connexion() ; 03:07:14 Programmation Web 2018-2019

Utilisation des espaces de noms <?php require_once 'mysql.php' ; require_once 'ldap.php' ; use Projet\MySQL as BD ; $mysql = new BD\Connexion() ; $ldap = new Projet\LDAP\Connexion() ; 03:07:14 Programmation Web 2018-2019

Utilisation des espaces de noms <?php require_once 'mysql.php' ; require_once 'ldap.php' ; class Connexion { /* ... */ } use Projet\MySQL ; $mysql = new MySQL\Connexion() ; $ldap = new Projet\LDAP\Connexion() ; $ftp = new Connexion() ; 03:07:14 Programmation Web 2018-2019

Espace de noms global <?php namespace Projet ; class Exception extends \Exception {} $pe = new Exception() ; $e = new \Exception() ; 03:07:14 Programmation Web 2018-2019