SlideShare une entreprise Scribd logo
PROGRAMMATION
ORIENTÉE OBJET EN PHP
KRISTEN LE LIBOUX
JUILLET 2013
Introduction
Notions abordées
Classes, objets
Héritage
Polymorphisme
Méthodes magiques
Interfaces
3
Motivation
RAM
données
Processeur
traitements
Les deux composants essentiels d’une machine
4
Motivation
Il en découle deux styles de programmation
RAM
données
Processeur
traitements
Impérative
Se concentre sur les traitements
Orientée objets (POO)
Se concentre sur les données
(concepts)
5
Programmation impérative
require_once("config.php");
require_once("common.php");
$link = mysqli_connect($server, $user, $pass, $db);
$req = mysqli_query($link, "select * from products");
displayHeader("Page d'accueil");
while( $row = mysqli_fetch_assoc($req) )
{
echo "<li>";
echo " <h4>".$row["name"]."</h4>";
echo " <p class="desc">".$row["desc"]."</h4>";
echo "</li>";
}
displayFooter();
6
Inconvénients
Correct, fait le job, mais...
• Difficile à suivre et à lire
• Impossible de collaborer
avec un intégrateur ou un designer
• Maintenabilité décroit à mesure que le code croit
• Ajouter une fonctionnalité, c’est souvent hacker
7
Programmation orientée objets
Notion centrale : la classe
• Une classe = un concept utilisé dans un projet
Exemple : utilisateur, base de données, produit, etc.
• On détermine des services associés à chaque classe :
méthodes
• Comporte des données : attributs
8
Avantages
• Modularité
• Encapsulation
• Héritage
• Polymorphisme
(slides suivants)
9
Modularité
DataBase
select()
connect()
insert()
Mail
send()
prepare()
addAttachment()
etc... etc...
10
Séparation des données et des services par entité logique.
Encapsulation
Appartement
Adresse
Ville
Nb de pièces
Utilisateur
Mot de passe
Nom
Mail
etc... Propriétaire
11
Propriétaire est une donnée de type Utilisateur
associée à un Appartement
Héritage
personnage
dessiner()
nom
deplacer()
etc...
joueur
score
ennemi
force
joueur est personnage
ennemi est personnage
12
Polymorphisme
Personnage
dessiner()
nom
deplacer()
etc...
Joueur
score
Ennemi
force
dessiner()
13
Service dessiner() :
générique pour un Ennemi, spécifique pour un Joueur
Vocabulaire
Classe
Un nouveau type de données,
comportant des attributs et des méthodes
Attribut
Une donnée propre à une classe
Méthode
Une fonction propre à une classe
Joueur
score
dessiner()
14
Vocabulaire
Instancier une classe
Allouer la mémoire nécessaire pour une classe
Objet
Une instance de classe
Joueur
score
dessiner()
$pierre = new Joueur;
$paul = new Joueur;
$pierre->score = 10;
$paul->dessiner();
15
Vocabulaire
classe = type
Types en PHP :
•Avant : NULL, bool, int, float, string, array.
•Maintenant : Mail, Produit, Utilisateur,Voiture...
objet = instance en mémoire
En première approx. : objet = variable de type classe
Mais deux variables peuvent en fait pointer sur le
même objet.
16
Caractéristiques
class User {
public $firstName = "Unknown";
public $lastName = "";
public function getDisplayName() {
return $this->firstName
." ".$this->lastName;
}
public function printDisplayName() {
echo $this->getDisplayName();
}
}
$pers1 = new User();
$pers1->firstName = "Paul";
$pers1->lastName = "Dupont";
$pers1->printDisplayName();
Exemple 1
Accès aux membres
$pers1->lastName = "Dupont";
$pers1->printDisplayName();
Membre = méthode ou attribut
Opérateur -> pour accéder aux membres d’un objet
19
$this
echo $this->getDisplayName();
Une variable spéciale qui fait référence à l’instance
courante.
Toujours disponible dans les méthodes, sauf pour les
méthodes statiques (voir plus loin).
20
Instanciation
$pers1 = new User();
Crée en mémoire une variable $pers1
de type User :
• Alloue la mémoire nécessaire
• Initialise les attributs
21
class User {
public $firstName = "Unknown";
public $lastName = "";
public function getDisplayName() {
return $this->firstName
." ".$this->lastName;
}
public function printDisplayName() {
echo $this->getDisplayName();
}
}
class Admin extends User {
public $password = "";
public function getDisplayName() {
return $this->firstName . " (admin)";
}
}
Exemple 2
22
Héritage
class Admin extends User
Les classes héritées :
• Bénéficient des membres de leurs parents
• Peuvent définir de nouveaux membres
• Peuvent redéfinir des membres (polymorphisme)
23
class User {
public $firstName = "Unknown";
public $lastName = "";
public function getDisplayName() { ... }
public function printDisplayName() { ... }
}
class Admin extends User {
public $password = "";
public function getDisplayName() { ... }
}
$me = new Admin();
$other = new User();
echo "Message de ";
$me->printDisplayName();
echo " à ";
$other->printDisplayName();
Message de Unknown (admin) à Unknown
Exemple 2b
Polymorphisme
Appel de méthode parente
• Utilisation de l’opérateur :: de résolution de
portée, avec le mot-clé parent
class Admin : extends User {
public function getDisplayName() {
return parent::getDisplayName() . " (admin)";
}
}
25
class FormHelper {
public $method = "post";
private $fields = array();
public function addField($name, $type, $label) {
$this->fields[] = array($name, $type, $label);
}
public function getHTML() {
$html = '<form method="'.$this->method.'">';
foreach( $this->fields as $f ) {
...
}
$html.= '</form>';
return $html;
}
}
$f = new FormHelper();
$f->addField("name", "text", "Nom");
echo $f->getHTML();
Exemple 3
Visibilité
Un membre doit être déclaré soit :
• public
• protected
• private
visible par tous, donc de l’extérieur
visible par la classe et les héritiers
visible uniquement par la classe
27
Classes et méthodes finales
• Les classes finales ne peuvent pas avoir d’héritier.
• Les méthodes finales ne peuvent pas être redéfinies
par les héritiers.
class User {
final public function check($name, $pass) { ... }
}
final class GlobalChecker { ... }
28
Membres statiques
Une classe peut avoir des membres statiques,
accessibles sans instancier la classe :
• Attributs : propres à la classe et non à l’objet
• Méthodes : $this interdit, ne peuvent accéder
qu’aux membres statiques
Appel par l’opérateur de résolution de portée ::
et non ->
29
class User {
static public function getCount() {
...
mysqli_query("SELECT COUNT(*) FROM t_usr");
...
return $nb;
}
}
$count = User::getCount();
echo "Il y a $count utilisateurs inscrits !";
Exemple
class About {
static private $version = "2.0.1";
static public function getVersion() {
return self::$version;
}
}
echo "Version courante : ". About::getVersion();
Exemple
Constantes de classe
• Non modifiables, pas de préfixe $
• Toujours publiques
• Accès interne par self:: , externe par Circle::
• Valeurs littérales et types simples uniquement
class Circle extends Shape {
const PI = 3.1415;
public $x, $y, $r;
public function getPerimeter() {
return 2. * self::PI * $r
}
}
32
Typage explicite
En anglais : type hinting
Permet d’imposer la classe d’un paramètre de fonction
ou de méthode : à utiliser abondamment
• Auto-documente le code, limite les erreurs
• NULL interdit au moment de l’appel,
sauf si on l’indique comme valeur par défaut
• On peut typer les objets par leur classe, les interfaces
(voir plus loin), les tableaux (avec array), mais pas les
types simples (int, float, bool, string)
33
class User {
protected $id;
public function getId() { ... }
...
}
class Ad {
protected $owner;
public function setOwner(User $user) {
$this->owner = $user;
}
...
}
function canEdit(Ad $ad, User $usr)
{
return $usr->getId()
=== $ann->getOwner()->getId();
}
Exemple typage explicite
Méthodes magiques
Définition
• Méthodes particulières dont le nom est imposé
• Optionnellement définies par le développeur
• Nom commence par __
• Invoquées automatiquement par PHP, dans certains
contextes, lorsqu’elles sont définies.
36
Principales méthodes magiques
__construct()
__destruct()
__get()
__isset()
__set()
__unset()
__call()
__callStatic()
__toString()
__clone()
37
__destruct()
• Appelé lors de la
destruction de l’objet
• Sert à nettoyer
• Pas de paramètres
Constructeur et destructeur
__construct()
• Appelé lors de la
création de l’objet
• Sert à initialiser l’objet
• Peut avoir des
paramètres :
dans ce cas, il faut
fournir des valeurs au
moment du « new »
38
__get($name)
• Obtenir une valeur
Attributs inaccessibles
ou non définis
__isset($name)
• Tester si un attribut
existe (avec isset)
__set($name, $value)
• Affecter une valeur
__unset($name)
• Appel de unset sur
l’attribut
39
Méthodes inaccessibles
ou non définies
__call($name, array $arg)
• Appel d’une méthode sur un objet avec ->
__callStatic($name, array $arg)
• Appel d’une méthode statiquement avec ::
40
Exempleclass MyReadOnlyClass
{
protected $data = array();
public function __construct( array $data ) {
$this->data = $data;
}
public function __get( $attr ) {
if( isset( $this->data[$attr] ) )
return $this->data[$attr];
trigger_error("Attribut non défini", E_USER_ERROR);
}
public function __set( $attr, $value ) {
trigger_error("Lecture seule", E_USER_ERROR);
}
public function __isset( $attr ) {
return isset( $this->data[$attr] );
}
public function __unset( $attr ) {
trigger_error("Lecture seule", E_USER_ERROR);
}
}
Utilisation
$obj = new MyReadOnlyClass(
array("login" => "ldupont", "level" => "user")
);
echo $obj->login; // (__get) affiche «ldupont»
echo isset($obj->login)?1:0; // (__isset) affiche «1»
echo isset($obj->password)?1:0; // (__isset) affiche «0»
echo $obj->password; // (__get) erreur: non défini
$obj->level = "admin"; // (__set) erreur: lecture seule
42
Copie d’objets
$pers2 = $pers1;
Ne crée pas en mémoire un nouvel objet
• Crée une nouvelle référence vers le même objet
• $pers2 est un alias de $pers1
Ainsi :
$pers2->firstName = "Durand";
echo $pers1->firstName; // Durand
43
Clonage
$pers2 = clone $pers1;
Crée une nouvelle instance qui vivra indépendamment
• Les attributs de $pers1 sont copiés dans $pers2
(au sens de l’opérateur =)
• La mémoire est allouée de nouveau
• Si la méthode magique __clone() est définie, elle sera
appelée sur l’objet cloné juste après la copie
44
Exemple
class MyClass
{
public static $nbInstances = 0;
protected $object;
public function __construct() {
$this->instance = ++self::$instances;
$this->object = new myOtherClass();
}
public function __clone() {
$this->instance = ++self::$instances;
$this->object = clone $this->object;
}
}
class Person
{
public $nom = "Pierre Durand";
public function __toString() {
return $this->nom;
}
}
$pers = new Person;
echo $pers; // Pierre Durand
Conversion en string
__toString()
• Méthode
magique appelée
dans tous les
contextes
où l’objet doit
être converti en
chaîne de
caractères
46
Interfaces & classes abstraites
Interfaces
Un « modèle » de classe qui spécifie simplement les
méthodes publiques à implémenter, sans le faire
interface Affichable {
public function affiche();
}
class Person implements Affichable {
public $nom;
public function affiche() {
echo $this->nom;
}
}
48
On spécifie ici qu’un objet pourra être
qualifié d’«affichable» dès lors qu’il
possèdera une méthode «affiche»
Interfaces
Particularités :
• Une même classe peut implémenter plusieurs
interfaces
• Peuvent hériter les unes des autres
• Peuvent définir des constantes
interface AA extends A {
...
}
class C implements AA, B, D {
...
}
49
Classe abstraite
Classe dont une méthode au moins est abstraite,
c’est-à-dire non implémentée.
Doit être héritée, ne peut être instanciée.
50
Exemple
abstract class BinaryOperator {
protected $x = 0, $y = 0;
abstract public function compute();
public function displayResult() {
echo $this->compute();
}
}
class Addition extends BinaryOperator {
public function compute() {
return $this->x + $this->y;
}
}
$ope1 = new Addition(); // ok
$ope2 = new BinaryOperator(); // erreur !
Exemple synthétique
Boîtes d’encombrement 2D
Soit une forme géométrique en 2D, on appelle boîte
d’encombrement un rectangle (idéalement minimal) qui la
contient. Ici un rectangle est défini par 2 coins opposés
(c’est-à-dire que les côtés sont parallèles aux axes).
53
Boîtes d’encombrement 2D
Définir deux interfaces :
• iShape : une forme 2D (point, droite, rectangle, etc)
• iBoundingBox : une boite d’encombrement 2D
54
computeBoundingBox($shapes)
getBoundingBox()
iShape
mergeWith($bbox)
getCoords()
isEmpty()
iBoundingBox
equals($bbox, $tol)
55
On souligne les
méthodes statiques.
Boîtes d’encombrement 2D
Implémenter computeBoundingBox :
• définir une classe abstraite Shape (implements iShape)
• implémenter Shape::computeBoundingBox
56
Boîtes d’encombrement 2D
Implémenter des formes :
• Rectangle (à la fois Shape et BoundingBox)
• Point
• Cercle
• Triangle
57
Boîtes d’encombrement 2D
$pt = new Point(0, 0);
$rect = new Rectangle(20, 10, 50, -20);
$tri = new Triangle(50, -20, 70, 0, 40, 30);
$circ = new Circle(80, 20, 50);
$shapes = array( $pt, $rect, $tri, $circ );
$bbox = Shape::computeBoundingBox( $shapes );
check( $bbox, array(0, 70, 130, -30) );
$shapes = array();
$bbox = Shape::computeBoundingBox( $shapes );
echo $bbox->isEmpty() ? "ok" : "erreur";
Tester :
58
Corrigé
59
https://github.com/kleliboux/code-samples
Fonctions utiles
Opérateur instanceof
x instanceof y est true si :
• x est un objet de classe y
(y compris par héritage)
• x est un objet dont la classe implémente l’interface y
(y compris par héritage)
Remarque : y peut être un nom littéral ou une variable
de type string
61
interface iA { }
class A implements iA { }
class AB extends A { }
class B {}
$ab = new AB();
$str = "AB";
// tout imprime TRUE sauf le 2ème
var_dump( $ab instanceof AB );
var_dump( $ab instanceof B );
var_dump( $ab instanceof iA );
var_dump( $ab instanceof A );
var_dump( $ab instanceof $str );
Exemple
62
Tests d’existence
Tester l’existence d’une classe :
bool class_exists ( string $class_name )
Tester l’existence d’une méthode
(indépendamment de sa visibilité) :
bool method_exists ( mixed $object ,
string $method_name )
63
Tests d’« appelabilité »
bool is_callable ( callable $name )
• Le paramètre est soit :
Une chaîne (vérifie l’appelabilité d’une fonction)
Un tableau array( objet, chaine ) ou ( chaine, chaine )
(vérifie l’appelabilité d’une méthode)
• Ce genre de paramètre s’appelle «callback» ou
«callable» dans la doc PHP
64
Exemplefunction f() {}
class A {
public function fpub() {}
protected function fprot() {}
static public function fstat() {}
}
class B extends A {
public function b() {
var_dump( is_callable( array($this, "fprot") ) );
}
}
$b = new B();
var_dump( is_callable ( "f" ) ); // true
var_dump( is_callable ( array("A", "fstat" ) ) ); // true
var_dump( is_callable ( array("A", "fpub" ) ) ); // true!
var_dump( is_callable ( array($b, "fpub" ) ) ); // true
var_dump( is_callable ( array($b, "fprot" ) ) ); // false
$b->b(); // true
Exécution de callback
mixed call_user_func ( callable $callback
[, mixed $parameter
[, mixed $... ]] )
• Le premier paramètre est un callback
• Les suivants sont les paramètres du callback
• Le callback sera appelé, s’il existe.
• Variante :
mixed call_user_func_array (
callable $callback, array $params )
66
Exemple
class ActionManager {
public function Load($id) { ... }
public function Save($id) { ... }
public function Delete($id) { ... }
public function Run($id) { ... }
}
$mgr = new ActionManager();
$act = $_GET["action"];
$id = intval( $_GET["id"] );
if( method_exists(array($mgr, $act)) ) {
call_user_func(array($mgr, $act), $id);
}
else {
throw new ErrorException("Action inexistante");
}
Remerciements
68
Cette présentation est partiellement issue de la
traduction de celle de Jason Austin, « Object Oriented
Principles in PHP5 » :
http://fr.slideshare.net/jfaustin/object-oriented-php5
Des exemples originaux ont été ajoutés.
MERCI
@NOVLANGUE SUR TWITTER
COMMENTAIRES, DISCUSSIONS, QUESTIONS

Contenu connexe

Tendances

Fascicule de tp atelier développement web
Fascicule de tp atelier développement webFascicule de tp atelier développement web
Fascicule de tp atelier développement web
Houda TOUKABRI
 
Examen principal- php - correction
Examen principal- php - correctionExamen principal- php - correction
Examen principal- php - correction
Ines Ouaz
 
Cours php & Mysql - 2éme partie
Cours php & Mysql - 2éme partieCours php & Mysql - 2éme partie
Cours php & Mysql - 2éme partie
kadzaki
 
Application web php5 html5 css3 bootstrap
Application web php5 html5 css3 bootstrapApplication web php5 html5 css3 bootstrap
Application web php5 html5 css3 bootstrap
Bassem ABCHA
 
Intégration des données avec Talend ETL
Intégration des données avec Talend ETLIntégration des données avec Talend ETL
Intégration des données avec Talend ETL
Lilia Sfaxi
 
Mise en oeuvre des framework de machines et deep learning v1
Mise en oeuvre des framework de machines et deep learning v1 Mise en oeuvre des framework de machines et deep learning v1
Mise en oeuvre des framework de machines et deep learning v1
ENSET, Université Hassan II Casablanca
 
Design Patterns
Design PatternsDesign Patterns
Design Patterns
Koffi Sani
 
SeSQL : un moteur de recherche en Python et PostgreSQL
SeSQL : un moteur de recherche en Python et PostgreSQLSeSQL : un moteur de recherche en Python et PostgreSQL
SeSQL : un moteur de recherche en Python et PostgreSQLParis, France
 
Présentation python
Présentation pythonPrésentation python
Présentation python
Sarah
 
Support de cours ACCESS
Support de cours ACCESSSupport de cours ACCESS
Support de cours ACCESS
Chingongou ­
 
Support NodeJS avec TypeScript Express MongoDB
Support NodeJS avec TypeScript Express MongoDBSupport NodeJS avec TypeScript Express MongoDB
Support NodeJS avec TypeScript Express MongoDB
ENSET, Université Hassan II Casablanca
 
LES JOINTURES
LES JOINTURESLES JOINTURES
LES JOINTURES
danaobrest
 
TP1 Big Data - MapReduce
TP1 Big Data - MapReduceTP1 Big Data - MapReduce
TP1 Big Data - MapReduce
Amal Abid
 
Tp java ee.pptx
Tp java ee.pptxTp java ee.pptx
Tp java ee.pptx
Eric Bourdet
 
Cours JavaScript
Cours JavaScriptCours JavaScript
Cours JavaScript
Olivier Le Goaër
 
Telecharger Exercices corrigés PL/SQL
Telecharger Exercices corrigés PL/SQLTelecharger Exercices corrigés PL/SQL
Telecharger Exercices corrigés PL/SQL
webreaker
 
Java - implémentation des concepts objets
Java - implémentation des concepts objetsJava - implémentation des concepts objets
Java - implémentation des concepts objetsJean David Olekhnovitch
 
Cours java avance débutant facile l'essentiel swing ,events
Cours java avance débutant facile l'essentiel swing ,events Cours java avance débutant facile l'essentiel swing ,events
Cours java avance débutant facile l'essentiel swing ,events
Houssem Hamrouni
 

Tendances (20)

Fascicule de tp atelier développement web
Fascicule de tp atelier développement webFascicule de tp atelier développement web
Fascicule de tp atelier développement web
 
Examen principal- php - correction
Examen principal- php - correctionExamen principal- php - correction
Examen principal- php - correction
 
Cours php & Mysql - 2éme partie
Cours php & Mysql - 2éme partieCours php & Mysql - 2éme partie
Cours php & Mysql - 2éme partie
 
Cours java
Cours javaCours java
Cours java
 
Application web php5 html5 css3 bootstrap
Application web php5 html5 css3 bootstrapApplication web php5 html5 css3 bootstrap
Application web php5 html5 css3 bootstrap
 
Intégration des données avec Talend ETL
Intégration des données avec Talend ETLIntégration des données avec Talend ETL
Intégration des données avec Talend ETL
 
Mise en oeuvre des framework de machines et deep learning v1
Mise en oeuvre des framework de machines et deep learning v1 Mise en oeuvre des framework de machines et deep learning v1
Mise en oeuvre des framework de machines et deep learning v1
 
Design Patterns
Design PatternsDesign Patterns
Design Patterns
 
SeSQL : un moteur de recherche en Python et PostgreSQL
SeSQL : un moteur de recherche en Python et PostgreSQLSeSQL : un moteur de recherche en Python et PostgreSQL
SeSQL : un moteur de recherche en Python et PostgreSQL
 
Présentation python
Présentation pythonPrésentation python
Présentation python
 
Support de cours ACCESS
Support de cours ACCESSSupport de cours ACCESS
Support de cours ACCESS
 
Support NodeJS avec TypeScript Express MongoDB
Support NodeJS avec TypeScript Express MongoDBSupport NodeJS avec TypeScript Express MongoDB
Support NodeJS avec TypeScript Express MongoDB
 
LES JOINTURES
LES JOINTURESLES JOINTURES
LES JOINTURES
 
TP1 Big Data - MapReduce
TP1 Big Data - MapReduceTP1 Big Data - MapReduce
TP1 Big Data - MapReduce
 
Tp java ee.pptx
Tp java ee.pptxTp java ee.pptx
Tp java ee.pptx
 
Cours JavaScript
Cours JavaScriptCours JavaScript
Cours JavaScript
 
Polymorphisme
PolymorphismePolymorphisme
Polymorphisme
 
Telecharger Exercices corrigés PL/SQL
Telecharger Exercices corrigés PL/SQLTelecharger Exercices corrigés PL/SQL
Telecharger Exercices corrigés PL/SQL
 
Java - implémentation des concepts objets
Java - implémentation des concepts objetsJava - implémentation des concepts objets
Java - implémentation des concepts objets
 
Cours java avance débutant facile l'essentiel swing ,events
Cours java avance débutant facile l'essentiel swing ,events Cours java avance débutant facile l'essentiel swing ,events
Cours java avance débutant facile l'essentiel swing ,events
 

En vedette

Un exemple élémentaire d'application MVC en PHP
Un exemple élémentaire d'application MVC en PHPUn exemple élémentaire d'application MVC en PHP
Un exemple élémentaire d'application MVC en PHP
Kristen Le Liboux
 
Php 2 - Approfondissement MySQL, PDO et MVC
Php 2 - Approfondissement MySQL, PDO et MVCPhp 2 - Approfondissement MySQL, PDO et MVC
Php 2 - Approfondissement MySQL, PDO et MVC
Pierre Faure
 
Mini projet individuel php
Mini projet individuel phpMini projet individuel php
Mini projet individuel phpKhadim Mbacké
 
Notions de base de JavaScript
Notions de base de JavaScriptNotions de base de JavaScript
Notions de base de JavaScript
Kristen Le Liboux
 
Bonnes pratiques de developpement en PHP
Bonnes pratiques de developpement en PHPBonnes pratiques de developpement en PHP
Bonnes pratiques de developpement en PHP
Pascal MARTIN
 
Principe de fonctionnement du cryptage RSA
Principe de fonctionnement du cryptage RSAPrincipe de fonctionnement du cryptage RSA
Principe de fonctionnement du cryptage RSA
Kristen Le Liboux
 
PHP MVC
PHP MVCPHP MVC
Formation PHP avancé - Cake PHP
Formation PHP avancé - Cake PHPFormation PHP avancé - Cake PHP
Formation PHP avancé - Cake PHP
kemenaran
 
PHP 1 - Apprendre les bases
PHP 1 - Apprendre les basesPHP 1 - Apprendre les bases
PHP 1 - Apprendre les bases
Pierre Faure
 
PHP MVC Tutorial
PHP MVC TutorialPHP MVC Tutorial
PHP MVC Tutorial
Yang Bruce
 
PHP & MVC
PHP & MVCPHP & MVC
PHP & MVC
Chris Weldon
 
Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...
ENSET, Université Hassan II Casablanca
 
Rapport sécurité
Rapport sécuritéRapport sécurité
Rapport sécurité
Mohammed Zaoui
 
Android fundamentals and communication with Java EE Application
Android fundamentals and communication with Java EE ApplicationAndroid fundamentals and communication with Java EE Application
Android fundamentals and communication with Java EE ApplicationAdil Ourida
 
Plone - Déployer un intranet collaboratif avec intégration d'un annuaire LDAP
Plone - Déployer un intranet collaboratif avec intégration d'un annuaire LDAPPlone - Déployer un intranet collaboratif avec intégration d'un annuaire LDAP
Plone - Déployer un intranet collaboratif avec intégration d'un annuaire LDAP
Paris, France
 
Clases y objetos en php (poo)
Clases y objetos en php (poo)Clases y objetos en php (poo)
Clases y objetos en php (poo)
Jefer Lee Parra
 
Clases en php
Clases en phpClases en php
Clases en php
Jaque Valencia
 
MongoDB and PHP ZendCon 2011
MongoDB and PHP ZendCon 2011MongoDB and PHP ZendCon 2011
MongoDB and PHP ZendCon 2011
Steven Francia
 
PHP et PHP Framework
PHP et PHP FrameworkPHP et PHP Framework
PHP et PHP Framework
Jérémie Campari
 

En vedette (20)

Un exemple élémentaire d'application MVC en PHP
Un exemple élémentaire d'application MVC en PHPUn exemple élémentaire d'application MVC en PHP
Un exemple élémentaire d'application MVC en PHP
 
Php 2 - Approfondissement MySQL, PDO et MVC
Php 2 - Approfondissement MySQL, PDO et MVCPhp 2 - Approfondissement MySQL, PDO et MVC
Php 2 - Approfondissement MySQL, PDO et MVC
 
Mini projet individuel php
Mini projet individuel phpMini projet individuel php
Mini projet individuel php
 
Notions de base de JavaScript
Notions de base de JavaScriptNotions de base de JavaScript
Notions de base de JavaScript
 
Bonnes pratiques de developpement en PHP
Bonnes pratiques de developpement en PHPBonnes pratiques de developpement en PHP
Bonnes pratiques de developpement en PHP
 
Principe de fonctionnement du cryptage RSA
Principe de fonctionnement du cryptage RSAPrincipe de fonctionnement du cryptage RSA
Principe de fonctionnement du cryptage RSA
 
PHP MVC
PHP MVCPHP MVC
PHP MVC
 
Formation PHP avancé - Cake PHP
Formation PHP avancé - Cake PHPFormation PHP avancé - Cake PHP
Formation PHP avancé - Cake PHP
 
PHP 1 - Apprendre les bases
PHP 1 - Apprendre les basesPHP 1 - Apprendre les bases
PHP 1 - Apprendre les bases
 
PHP MVC Tutorial
PHP MVC TutorialPHP MVC Tutorial
PHP MVC Tutorial
 
PHP & MVC
PHP & MVCPHP & MVC
PHP & MVC
 
Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...
 
Rapport sécurité
Rapport sécuritéRapport sécurité
Rapport sécurité
 
Android fundamentals and communication with Java EE Application
Android fundamentals and communication with Java EE ApplicationAndroid fundamentals and communication with Java EE Application
Android fundamentals and communication with Java EE Application
 
OpenDS - Open Source Java LDAP server
OpenDS - Open Source Java LDAP serverOpenDS - Open Source Java LDAP server
OpenDS - Open Source Java LDAP server
 
Plone - Déployer un intranet collaboratif avec intégration d'un annuaire LDAP
Plone - Déployer un intranet collaboratif avec intégration d'un annuaire LDAPPlone - Déployer un intranet collaboratif avec intégration d'un annuaire LDAP
Plone - Déployer un intranet collaboratif avec intégration d'un annuaire LDAP
 
Clases y objetos en php (poo)
Clases y objetos en php (poo)Clases y objetos en php (poo)
Clases y objetos en php (poo)
 
Clases en php
Clases en phpClases en php
Clases en php
 
MongoDB and PHP ZendCon 2011
MongoDB and PHP ZendCon 2011MongoDB and PHP ZendCon 2011
MongoDB and PHP ZendCon 2011
 
PHP et PHP Framework
PHP et PHP FrameworkPHP et PHP Framework
PHP et PHP Framework
 

Similaire à Programmation orientée objet en PHP 5

Exploiter php 5
Exploiter php 5Exploiter php 5
Exploiter php 5
halleck45
 
php2 : formulaire-session-PDO
php2 : formulaire-session-PDOphp2 : formulaire-session-PDO
php2 : formulaire-session-PDO
Abdoulaye Dieng
 
Présentation de DBAL en PHP (Nantes)
Présentation de DBAL en PHP (Nantes)Présentation de DBAL en PHP (Nantes)
Présentation de DBAL en PHP (Nantes)
Mickael Perraud
 
Php1
Php1Php1
Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...
Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...
Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...
Tarik Zakaria Benmerar
 
Trucs et astuces PHP et MySQL
Trucs et astuces PHP et MySQLTrucs et astuces PHP et MySQL
Trucs et astuces PHP et MySQL
Damien Seguy
 
Modèle de domaine riche dans une application métier complexe un exemple pratique
Modèle de domaine riche dans une application métier complexe un exemple pratiqueModèle de domaine riche dans une application métier complexe un exemple pratique
Modèle de domaine riche dans une application métier complexe un exemple pratique
Vladyslav Riabchenko
 
Tutoriel-PHP-Introduction-à-la-POoooooooooooO.pdf
Tutoriel-PHP-Introduction-à-la-POoooooooooooO.pdfTutoriel-PHP-Introduction-à-la-POoooooooooooO.pdf
Tutoriel-PHP-Introduction-à-la-POoooooooooooO.pdf
RihabBENLAMINE
 
Présentation de DBAL en PHP
Présentation de DBAL en PHPPrésentation de DBAL en PHP
Présentation de DBAL en PHP
Mickael Perraud
 
Function oop - bonnes pratiques ms tech days
Function   oop - bonnes pratiques ms tech daysFunction   oop - bonnes pratiques ms tech days
Function oop - bonnes pratiques ms tech daysJean-Pierre Vincent
 
S2-02-PHP-objet.pptx
S2-02-PHP-objet.pptxS2-02-PHP-objet.pptx
S2-02-PHP-objet.pptx
kohay75604
 
Patterns et bonnes pratiques autour de JavaScript
Patterns et bonnes pratiques autour de JavaScriptPatterns et bonnes pratiques autour de JavaScript
Patterns et bonnes pratiques autour de JavaScript
Microsoft Technet France
 
Analyse statique et applications
Analyse statique et applicationsAnalyse statique et applications
Analyse statique et applications
Damien Seguy
 
Introduction à l’orienté objet en Python
Introduction à l’orienté objet en PythonIntroduction à l’orienté objet en Python
Introduction à l’orienté objet en Python
Abdoulaye Dieng
 
DrupalCamp Paris 2013 - Theming
DrupalCamp Paris 2013 - ThemingDrupalCamp Paris 2013 - Theming
DrupalCamp Paris 2013 - Theming
Romain Jarraud
 
Introduction à Python
Introduction à PythonIntroduction à Python
Introduction à Python
Abdoulaye Dieng
 
Les principes de base de PHP
 Les principes de base de PHP  Les principes de base de PHP
Les principes de base de PHP
EL JAOUARI Ahmed
 
Php cours
Php coursPhp cours
Php cours
funinformatique
 

Similaire à Programmation orientée objet en PHP 5 (20)

Exploiter php 5
Exploiter php 5Exploiter php 5
Exploiter php 5
 
php2 : formulaire-session-PDO
php2 : formulaire-session-PDOphp2 : formulaire-session-PDO
php2 : formulaire-session-PDO
 
Présentation de DBAL en PHP (Nantes)
Présentation de DBAL en PHP (Nantes)Présentation de DBAL en PHP (Nantes)
Présentation de DBAL en PHP (Nantes)
 
Php1
Php1Php1
Php1
 
Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...
Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...
Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...
 
Trucs et astuces PHP et MySQL
Trucs et astuces PHP et MySQLTrucs et astuces PHP et MySQL
Trucs et astuces PHP et MySQL
 
Playing With PHP 5.3
Playing With PHP 5.3Playing With PHP 5.3
Playing With PHP 5.3
 
Modèle de domaine riche dans une application métier complexe un exemple pratique
Modèle de domaine riche dans une application métier complexe un exemple pratiqueModèle de domaine riche dans une application métier complexe un exemple pratique
Modèle de domaine riche dans une application métier complexe un exemple pratique
 
Tutoriel-PHP-Introduction-à-la-POoooooooooooO.pdf
Tutoriel-PHP-Introduction-à-la-POoooooooooooO.pdfTutoriel-PHP-Introduction-à-la-POoooooooooooO.pdf
Tutoriel-PHP-Introduction-à-la-POoooooooooooO.pdf
 
test doc
test doctest doc
test doc
 
Présentation de DBAL en PHP
Présentation de DBAL en PHPPrésentation de DBAL en PHP
Présentation de DBAL en PHP
 
Function oop - bonnes pratiques ms tech days
Function   oop - bonnes pratiques ms tech daysFunction   oop - bonnes pratiques ms tech days
Function oop - bonnes pratiques ms tech days
 
S2-02-PHP-objet.pptx
S2-02-PHP-objet.pptxS2-02-PHP-objet.pptx
S2-02-PHP-objet.pptx
 
Patterns et bonnes pratiques autour de JavaScript
Patterns et bonnes pratiques autour de JavaScriptPatterns et bonnes pratiques autour de JavaScript
Patterns et bonnes pratiques autour de JavaScript
 
Analyse statique et applications
Analyse statique et applicationsAnalyse statique et applications
Analyse statique et applications
 
Introduction à l’orienté objet en Python
Introduction à l’orienté objet en PythonIntroduction à l’orienté objet en Python
Introduction à l’orienté objet en Python
 
DrupalCamp Paris 2013 - Theming
DrupalCamp Paris 2013 - ThemingDrupalCamp Paris 2013 - Theming
DrupalCamp Paris 2013 - Theming
 
Introduction à Python
Introduction à PythonIntroduction à Python
Introduction à Python
 
Les principes de base de PHP
 Les principes de base de PHP  Les principes de base de PHP
Les principes de base de PHP
 
Php cours
Php coursPhp cours
Php cours
 

Programmation orientée objet en PHP 5

  • 1. PROGRAMMATION ORIENTÉE OBJET EN PHP KRISTEN LE LIBOUX JUILLET 2013
  • 5. Motivation Il en découle deux styles de programmation RAM données Processeur traitements Impérative Se concentre sur les traitements Orientée objets (POO) Se concentre sur les données (concepts) 5
  • 6. Programmation impérative require_once("config.php"); require_once("common.php"); $link = mysqli_connect($server, $user, $pass, $db); $req = mysqli_query($link, "select * from products"); displayHeader("Page d'accueil"); while( $row = mysqli_fetch_assoc($req) ) { echo "<li>"; echo " <h4>".$row["name"]."</h4>"; echo " <p class="desc">".$row["desc"]."</h4>"; echo "</li>"; } displayFooter(); 6
  • 7. Inconvénients Correct, fait le job, mais... • Difficile à suivre et à lire • Impossible de collaborer avec un intégrateur ou un designer • Maintenabilité décroit à mesure que le code croit • Ajouter une fonctionnalité, c’est souvent hacker 7
  • 8. Programmation orientée objets Notion centrale : la classe • Une classe = un concept utilisé dans un projet Exemple : utilisateur, base de données, produit, etc. • On détermine des services associés à chaque classe : méthodes • Comporte des données : attributs 8
  • 9. Avantages • Modularité • Encapsulation • Héritage • Polymorphisme (slides suivants) 9
  • 11. Encapsulation Appartement Adresse Ville Nb de pièces Utilisateur Mot de passe Nom Mail etc... Propriétaire 11 Propriétaire est une donnée de type Utilisateur associée à un Appartement
  • 14. Vocabulaire Classe Un nouveau type de données, comportant des attributs et des méthodes Attribut Une donnée propre à une classe Méthode Une fonction propre à une classe Joueur score dessiner() 14
  • 15. Vocabulaire Instancier une classe Allouer la mémoire nécessaire pour une classe Objet Une instance de classe Joueur score dessiner() $pierre = new Joueur; $paul = new Joueur; $pierre->score = 10; $paul->dessiner(); 15
  • 16. Vocabulaire classe = type Types en PHP : •Avant : NULL, bool, int, float, string, array. •Maintenant : Mail, Produit, Utilisateur,Voiture... objet = instance en mémoire En première approx. : objet = variable de type classe Mais deux variables peuvent en fait pointer sur le même objet. 16
  • 18. class User { public $firstName = "Unknown"; public $lastName = ""; public function getDisplayName() { return $this->firstName ." ".$this->lastName; } public function printDisplayName() { echo $this->getDisplayName(); } } $pers1 = new User(); $pers1->firstName = "Paul"; $pers1->lastName = "Dupont"; $pers1->printDisplayName(); Exemple 1
  • 19. Accès aux membres $pers1->lastName = "Dupont"; $pers1->printDisplayName(); Membre = méthode ou attribut Opérateur -> pour accéder aux membres d’un objet 19
  • 20. $this echo $this->getDisplayName(); Une variable spéciale qui fait référence à l’instance courante. Toujours disponible dans les méthodes, sauf pour les méthodes statiques (voir plus loin). 20
  • 21. Instanciation $pers1 = new User(); Crée en mémoire une variable $pers1 de type User : • Alloue la mémoire nécessaire • Initialise les attributs 21
  • 22. class User { public $firstName = "Unknown"; public $lastName = ""; public function getDisplayName() { return $this->firstName ." ".$this->lastName; } public function printDisplayName() { echo $this->getDisplayName(); } } class Admin extends User { public $password = ""; public function getDisplayName() { return $this->firstName . " (admin)"; } } Exemple 2 22
  • 23. Héritage class Admin extends User Les classes héritées : • Bénéficient des membres de leurs parents • Peuvent définir de nouveaux membres • Peuvent redéfinir des membres (polymorphisme) 23
  • 24. class User { public $firstName = "Unknown"; public $lastName = ""; public function getDisplayName() { ... } public function printDisplayName() { ... } } class Admin extends User { public $password = ""; public function getDisplayName() { ... } } $me = new Admin(); $other = new User(); echo "Message de "; $me->printDisplayName(); echo " à "; $other->printDisplayName(); Message de Unknown (admin) à Unknown Exemple 2b Polymorphisme
  • 25. Appel de méthode parente • Utilisation de l’opérateur :: de résolution de portée, avec le mot-clé parent class Admin : extends User { public function getDisplayName() { return parent::getDisplayName() . " (admin)"; } } 25
  • 26. class FormHelper { public $method = "post"; private $fields = array(); public function addField($name, $type, $label) { $this->fields[] = array($name, $type, $label); } public function getHTML() { $html = '<form method="'.$this->method.'">'; foreach( $this->fields as $f ) { ... } $html.= '</form>'; return $html; } } $f = new FormHelper(); $f->addField("name", "text", "Nom"); echo $f->getHTML(); Exemple 3
  • 27. Visibilité Un membre doit être déclaré soit : • public • protected • private visible par tous, donc de l’extérieur visible par la classe et les héritiers visible uniquement par la classe 27
  • 28. Classes et méthodes finales • Les classes finales ne peuvent pas avoir d’héritier. • Les méthodes finales ne peuvent pas être redéfinies par les héritiers. class User { final public function check($name, $pass) { ... } } final class GlobalChecker { ... } 28
  • 29. Membres statiques Une classe peut avoir des membres statiques, accessibles sans instancier la classe : • Attributs : propres à la classe et non à l’objet • Méthodes : $this interdit, ne peuvent accéder qu’aux membres statiques Appel par l’opérateur de résolution de portée :: et non -> 29
  • 30. class User { static public function getCount() { ... mysqli_query("SELECT COUNT(*) FROM t_usr"); ... return $nb; } } $count = User::getCount(); echo "Il y a $count utilisateurs inscrits !"; Exemple
  • 31. class About { static private $version = "2.0.1"; static public function getVersion() { return self::$version; } } echo "Version courante : ". About::getVersion(); Exemple
  • 32. Constantes de classe • Non modifiables, pas de préfixe $ • Toujours publiques • Accès interne par self:: , externe par Circle:: • Valeurs littérales et types simples uniquement class Circle extends Shape { const PI = 3.1415; public $x, $y, $r; public function getPerimeter() { return 2. * self::PI * $r } } 32
  • 33. Typage explicite En anglais : type hinting Permet d’imposer la classe d’un paramètre de fonction ou de méthode : à utiliser abondamment • Auto-documente le code, limite les erreurs • NULL interdit au moment de l’appel, sauf si on l’indique comme valeur par défaut • On peut typer les objets par leur classe, les interfaces (voir plus loin), les tableaux (avec array), mais pas les types simples (int, float, bool, string) 33
  • 34. class User { protected $id; public function getId() { ... } ... } class Ad { protected $owner; public function setOwner(User $user) { $this->owner = $user; } ... } function canEdit(Ad $ad, User $usr) { return $usr->getId() === $ann->getOwner()->getId(); } Exemple typage explicite
  • 36. Définition • Méthodes particulières dont le nom est imposé • Optionnellement définies par le développeur • Nom commence par __ • Invoquées automatiquement par PHP, dans certains contextes, lorsqu’elles sont définies. 36
  • 38. __destruct() • Appelé lors de la destruction de l’objet • Sert à nettoyer • Pas de paramètres Constructeur et destructeur __construct() • Appelé lors de la création de l’objet • Sert à initialiser l’objet • Peut avoir des paramètres : dans ce cas, il faut fournir des valeurs au moment du « new » 38
  • 39. __get($name) • Obtenir une valeur Attributs inaccessibles ou non définis __isset($name) • Tester si un attribut existe (avec isset) __set($name, $value) • Affecter une valeur __unset($name) • Appel de unset sur l’attribut 39
  • 40. Méthodes inaccessibles ou non définies __call($name, array $arg) • Appel d’une méthode sur un objet avec -> __callStatic($name, array $arg) • Appel d’une méthode statiquement avec :: 40
  • 41. Exempleclass MyReadOnlyClass { protected $data = array(); public function __construct( array $data ) { $this->data = $data; } public function __get( $attr ) { if( isset( $this->data[$attr] ) ) return $this->data[$attr]; trigger_error("Attribut non défini", E_USER_ERROR); } public function __set( $attr, $value ) { trigger_error("Lecture seule", E_USER_ERROR); } public function __isset( $attr ) { return isset( $this->data[$attr] ); } public function __unset( $attr ) { trigger_error("Lecture seule", E_USER_ERROR); } }
  • 42. Utilisation $obj = new MyReadOnlyClass( array("login" => "ldupont", "level" => "user") ); echo $obj->login; // (__get) affiche «ldupont» echo isset($obj->login)?1:0; // (__isset) affiche «1» echo isset($obj->password)?1:0; // (__isset) affiche «0» echo $obj->password; // (__get) erreur: non défini $obj->level = "admin"; // (__set) erreur: lecture seule 42
  • 43. Copie d’objets $pers2 = $pers1; Ne crée pas en mémoire un nouvel objet • Crée une nouvelle référence vers le même objet • $pers2 est un alias de $pers1 Ainsi : $pers2->firstName = "Durand"; echo $pers1->firstName; // Durand 43
  • 44. Clonage $pers2 = clone $pers1; Crée une nouvelle instance qui vivra indépendamment • Les attributs de $pers1 sont copiés dans $pers2 (au sens de l’opérateur =) • La mémoire est allouée de nouveau • Si la méthode magique __clone() est définie, elle sera appelée sur l’objet cloné juste après la copie 44
  • 45. Exemple class MyClass { public static $nbInstances = 0; protected $object; public function __construct() { $this->instance = ++self::$instances; $this->object = new myOtherClass(); } public function __clone() { $this->instance = ++self::$instances; $this->object = clone $this->object; } }
  • 46. class Person { public $nom = "Pierre Durand"; public function __toString() { return $this->nom; } } $pers = new Person; echo $pers; // Pierre Durand Conversion en string __toString() • Méthode magique appelée dans tous les contextes où l’objet doit être converti en chaîne de caractères 46
  • 47. Interfaces & classes abstraites
  • 48. Interfaces Un « modèle » de classe qui spécifie simplement les méthodes publiques à implémenter, sans le faire interface Affichable { public function affiche(); } class Person implements Affichable { public $nom; public function affiche() { echo $this->nom; } } 48 On spécifie ici qu’un objet pourra être qualifié d’«affichable» dès lors qu’il possèdera une méthode «affiche»
  • 49. Interfaces Particularités : • Une même classe peut implémenter plusieurs interfaces • Peuvent hériter les unes des autres • Peuvent définir des constantes interface AA extends A { ... } class C implements AA, B, D { ... } 49
  • 50. Classe abstraite Classe dont une méthode au moins est abstraite, c’est-à-dire non implémentée. Doit être héritée, ne peut être instanciée. 50
  • 51. Exemple abstract class BinaryOperator { protected $x = 0, $y = 0; abstract public function compute(); public function displayResult() { echo $this->compute(); } } class Addition extends BinaryOperator { public function compute() { return $this->x + $this->y; } } $ope1 = new Addition(); // ok $ope2 = new BinaryOperator(); // erreur !
  • 53. Boîtes d’encombrement 2D Soit une forme géométrique en 2D, on appelle boîte d’encombrement un rectangle (idéalement minimal) qui la contient. Ici un rectangle est défini par 2 coins opposés (c’est-à-dire que les côtés sont parallèles aux axes). 53
  • 54. Boîtes d’encombrement 2D Définir deux interfaces : • iShape : une forme 2D (point, droite, rectangle, etc) • iBoundingBox : une boite d’encombrement 2D 54
  • 56. Boîtes d’encombrement 2D Implémenter computeBoundingBox : • définir une classe abstraite Shape (implements iShape) • implémenter Shape::computeBoundingBox 56
  • 57. Boîtes d’encombrement 2D Implémenter des formes : • Rectangle (à la fois Shape et BoundingBox) • Point • Cercle • Triangle 57
  • 58. Boîtes d’encombrement 2D $pt = new Point(0, 0); $rect = new Rectangle(20, 10, 50, -20); $tri = new Triangle(50, -20, 70, 0, 40, 30); $circ = new Circle(80, 20, 50); $shapes = array( $pt, $rect, $tri, $circ ); $bbox = Shape::computeBoundingBox( $shapes ); check( $bbox, array(0, 70, 130, -30) ); $shapes = array(); $bbox = Shape::computeBoundingBox( $shapes ); echo $bbox->isEmpty() ? "ok" : "erreur"; Tester : 58
  • 61. Opérateur instanceof x instanceof y est true si : • x est un objet de classe y (y compris par héritage) • x est un objet dont la classe implémente l’interface y (y compris par héritage) Remarque : y peut être un nom littéral ou une variable de type string 61
  • 62. interface iA { } class A implements iA { } class AB extends A { } class B {} $ab = new AB(); $str = "AB"; // tout imprime TRUE sauf le 2ème var_dump( $ab instanceof AB ); var_dump( $ab instanceof B ); var_dump( $ab instanceof iA ); var_dump( $ab instanceof A ); var_dump( $ab instanceof $str ); Exemple 62
  • 63. Tests d’existence Tester l’existence d’une classe : bool class_exists ( string $class_name ) Tester l’existence d’une méthode (indépendamment de sa visibilité) : bool method_exists ( mixed $object , string $method_name ) 63
  • 64. Tests d’« appelabilité » bool is_callable ( callable $name ) • Le paramètre est soit : Une chaîne (vérifie l’appelabilité d’une fonction) Un tableau array( objet, chaine ) ou ( chaine, chaine ) (vérifie l’appelabilité d’une méthode) • Ce genre de paramètre s’appelle «callback» ou «callable» dans la doc PHP 64
  • 65. Exemplefunction f() {} class A { public function fpub() {} protected function fprot() {} static public function fstat() {} } class B extends A { public function b() { var_dump( is_callable( array($this, "fprot") ) ); } } $b = new B(); var_dump( is_callable ( "f" ) ); // true var_dump( is_callable ( array("A", "fstat" ) ) ); // true var_dump( is_callable ( array("A", "fpub" ) ) ); // true! var_dump( is_callable ( array($b, "fpub" ) ) ); // true var_dump( is_callable ( array($b, "fprot" ) ) ); // false $b->b(); // true
  • 66. Exécution de callback mixed call_user_func ( callable $callback [, mixed $parameter [, mixed $... ]] ) • Le premier paramètre est un callback • Les suivants sont les paramètres du callback • Le callback sera appelé, s’il existe. • Variante : mixed call_user_func_array ( callable $callback, array $params ) 66
  • 67. Exemple class ActionManager { public function Load($id) { ... } public function Save($id) { ... } public function Delete($id) { ... } public function Run($id) { ... } } $mgr = new ActionManager(); $act = $_GET["action"]; $id = intval( $_GET["id"] ); if( method_exists(array($mgr, $act)) ) { call_user_func(array($mgr, $act), $id); } else { throw new ErrorException("Action inexistante"); }
  • 68. Remerciements 68 Cette présentation est partiellement issue de la traduction de celle de Jason Austin, « Object Oriented Principles in PHP5 » : http://fr.slideshare.net/jfaustin/object-oriented-php5 Des exemples originaux ont été ajoutés.