Documente Academic
Documente Profesional
Documente Cultură
PHP5 Avanc
& MVC
Pr requis ................................................................................................................................................... 3
Objectif du cours ....................................................................................................................................... 3
Le dveloppement d'applications web, un dveloppement complexe .................................................... 4
Dveloppement web ................................................................................................................................. 5
Modle-Vue-Contrleur (MVC) ................................................................................................................. 6
MVC et PHP : implmentation .................................................................................................................. 8
6.1 Architecture des dossiers.................................................................................................................... 8
6.2 Contrleur : ......................................................................................................................................... 9
6.3 Modle : ............................................................................................................................................ 10
6.4 Vue : .................................................................................................................................................. 10
7 Programmation oriente objet en PHP5 ................................................................................................. 11
7.1 Rappel ............................................................................................................................................... 11
7.2 Classe et instance. ............................................................................................................................. 12
7.3 Copie, Hritage, redfinition et subtilits. ....................................................................................... 14
7.3.1 Copie & rfrence ...................................................................................................................... 14
7.3.2 Hritage ..................................................................................................................................... 15
7.3.3 Surcharge ou redfinition .......................................................................................................... 17
7.3.4 Subtilits .................................................................................................................................... 18
8 Base de donnes via PDO ........................................................................................................................ 23
8.1 Driver et installation ......................................................................................................................... 25
8.2 Connexion et gestion d'erreur de la connexion ............................................................................... 26
8.2.1 Connexion .................................................................................................................................. 26
8.2.2 Erreurs de connexion................................................................................................................. 26
8.3 Requtes et traitements ................................................................................................................... 27
Date d'dition :
20/02/2012
Page :
1 / 44
Date d'dition :
Commentaires
Cration du document
20/02/2012
Date
26/01/2012
Page :
2 / 44
1 Pr requis
- Cours PHP de Jacques Bandet
http://webu2.upmf-grenoble.fr/shs/master/wp-content/uploads/2011/11/04_php.pdf
2 Objectif du cours
L'objectif du cours est de vous donner une mthode de dveloppement web (MVC), et de prsenter des
fonctions avances en PHP5 pour une utilisation 'professionnelle'.
Date d'dition :
20/02/2012
Page :
3 / 44
Le dveloppement d'applications web est complexe, on peut travailler pour des cibles multiples :
Cibles machines (serveur, station client, Smartphone, Tablet )
Cibles browsers (IE 6et+, Chrome, Firefox, Safari, Opra)
Le dveloppement d'applications web est complexe, on doit travailler avec de multiples langages :
Langages cot serveur web [ASP,PHP,Python,Perl ]
Langages cot client [Javascript,Vbscript]
Langages de balisage [HTML, CSS]
Le dveloppement d'applications web est complexe, on doit travailler pour de multiples publics:
Utilisateur dbutant
Utilisateur confirm
Gestionnaire des donnes
Administrateur de l'application
Le dveloppement d'applications web est complexe, car on est soumis des contraintes :
Contraintes de scurits
Contraintes d'intgrit des donnes.
Contraintes lgales
Date d'dition :
20/02/2012
Page :
4 / 44
4 Dveloppement web
Quand on dbute en dveloppement web, on mlange souvent les langages de script, de balisage, de CSS
dans un seul fichier :
20/02/2012
Page :
5 / 44
5 Modle-Vue-Contrleur (MVC)
En dveloppement logiciel, il existe des architectures de dveloppement (architectural pattern) dont le
but est d'isoler le domaine logique de la partie IHM.
Date d'dition :
20/02/2012
Page :
6 / 44
MVC et MVC2 :
Dans une architecture MVC, il peut exister plusieurs vues, plusieurs modles mais aussi plusieurs
contrleurs.
Dans une architecture MVC2, il n'existe plus qu'un seul et unique contrleur rceptionnant toutes les
requtes clientes.
Modularits.
Maintenance.
Gestion multi-dveloppeurs.
L'isolation
Inconvnients :
Complexit de communication entre composants.
Apprentissage notamment dans le cadre d'un Framework.
Date d'dition :
20/02/2012
Page :
7 / 44
Date d'dition :
20/02/2012
Page :
8 / 44
6.2 Contrleur :
Le contrleur reoit les requtes de l'utilisateur et fait l'intermdiaire entre le modle et la vue pour
rpondre aux requtes.
Scnario :
On a une demande de validation de connexion une application avec Login et Password.
On va faire une demande au contrleur pour grer cette connexion.
Le contrleur va appeler le modle de gestion des utilisateurs et retourner une information indiquant si la
personne peut ou ne pas se connecter. Il appelle la vue avec le retour indiqu par le modle pour la
prsentation l'utilisateur.
Page web
Lors de la validation :
http://www.monsite.com/index.php?do=connexion
Page controller.php
On voit bien l'interface avec le modle
et avec la vue.
Il y a bien isolation entre le modle et
la vue.
Date d'dition :
20/02/2012
Page :
9 / 44
6.3
Modle :
Vue :
La vue est un ou plusieurs composants grant la prsentation. Ce peut tre directement des fichiers HTML,
mais aussi des fichiers textes, ou d'autres formats XML, PDF
Le principe MVC est de dissocier les donnes et la prsentation. La vue doit reprsenter un visuel
(graphisme de l'application Web) et les donnes traites par le modle.
On a deux possibilits pour rsoudre ce problme :
Crer des pages HTML avec du PHP.
Si on code avec ce systme, on ne doit jamais utiliser de fonctions PHP pour crer la donne.
Les seules fonctions acceptables sont : echo(); print();
Utiliser un systme de Template.
On verra le systme de Template, plus longuement dans le chapitre 9
Quand on dveloppe pour le web, on utilise souvent du JavaScript ou de l'AJAX. La question est de savoir
ou mettre proprement les appels AJAX ?
Date d'dition :
20/02/2012
Page :
10 / 44
un code rutilisable.
un code modulaire.
un code comprhensible.
Un code conceptuel.
CLASSE OBJET
Date d'dition :
20/02/2012
Page :
11 / 44
La suret de l'application :
public : L'accessibilit la mthode ou l'attribut est possible de toute l'application.
Par dfaut si aucun type d'accs n'est indiqu c'est un accs public.
protected : L'accessibilit la mthode ou l'attribut est possible la classe qui l'a dfini
mais aussi ses classes hrites.
private : L'accessibilit la mthode ou l'attribut est possible uniquement la classe.
Constructeur et Destructeur :
PHP propose un moyen d'initialisation d'un objet au moment de sa cration grce : __construct (){}
Lors de l'instanciation par le mot cl NEW si dans la class la mthode __construct existe, elle va tre
appele.
PHP propose un moyen de supprimer un objet grce __destruct(){}. Cette mthode est
automatiquement appele quand lobjet est dtruit, soit par delete() ou unset(), soit la fin du script.
Un destructeur est pratique pour fermer les ressources ouvertes : fichiers, connexions vers des serveurs de
bases de donnes, etc.
Date d'dition :
20/02/2012
Page :
12 / 44
Exemple
Dfinition de la classe :
Usage de la classe :
.
->
nom_attribut
nom_attribut
Date d'dition :
20/02/2012
Page :
13 / 44
7.3.1
Il faut dfinir la diffrence entre deux objets qui sont identiques et deux objets qui sont les
mmes .
Ex : 2 DVD du mme film dans la mme collection sont identiques mais ne sont pas les mmes.
La classe
Le script
Sortie web :
Date d'dition :
20/02/2012
Page :
14 / 44
7.3.2
Hritage
Paramtre obligatoire
Pre
w
Paramtre optionnel
Fils
x < w condition de crer des
valeurs par dfaut.
z>y
Les mthodes de la classe fils doivent avoir des prototypes compatibles avec ceux de la classe pre.
Il est possible dajouter des paramtres supplmentaires, condition quils soient facultatifs. Il est aussi
possible de rendre facultatifs des paramtres en leur donnant une valeur par dfaut.
Pour rsumer, le nombre de paramtres obligatoires de la mthode fille doit tre infrieur ou gal au
nombre de paramtres possibles de la mthode mre ; le nombre de paramtres possibles de la mthode
fille doit quant lui tre suprieur ou gal au nombre de paramtres possibles de la mthode mre.
Par exemple, une mthode qui a trois paramtres obligatoires sur cinq peut tre remplace par une
mthode qui a un paramtre obligatoire (nombre infrieur) et cinq facultatifs (donc six au total, ce qui est
suprieur aux cinq initiaux).
Seuls les constructeurs ne sont pas soumis cette rgle car la notion de constructeur gnrique na pas
vraiment de sens.
Date d'dition :
20/02/2012
Page :
15 / 44
La sortie web :
Date d'dition :
20/02/2012
Page :
16 / 44
7.3.3
Surcharge ou redfinition
Class Parent
Script :
Date d'dition :
Sortie Web :
20/02/2012
Page :
17 / 44
7.3.4
Subtilits
Attributs ou mthodes
Classe pre
Public
Protected
Private
Classe fils
Public
Protected , public
Private, Protected , public
Attention :
On ne peut pas redfinir une mthode prive. Si on le faisait, on crerait en ralit une nouvelle
mthode. Si vous redfinissez une mthode prive, PHP5 considrera quil a deux mthodes de
mme nom simultanment dans la classe. Si cest une mthode de la classe mre qui y fait appel,
elle accdera la mthode prive initiale. Si inversement cest une mthode de la classe fille qui y
fait appel, elle accdera la nouvelle implmentation.
20/02/2012
Page :
18 / 44
Dclaration interface
A savoir
o Une classe peut implmenter plusieurs interfaces en mme temps.
o Une classe ne peut pas avoir d'hritage multiple classe abstraite ou pas.
o On ne peut pas surcharger une interface ou une mthode abstraite (intrt mme de ces
systmes)
On peut aussi dclarer une classe comme final, mais alors on ne pourra plus hriter d'elle.
L'intrt est l plus limit.
Date d'dition :
20/02/2012
Page :
19 / 44
Fonctions particulires
Fonction de clonage :
On a vu le principe du clonage, on peut crer
manuellement une fonction de clonage qui viendra
s'ajouter au principe natif de PHP5
Fonction d'information
La fonction get_class retourne une chaine donnant le nom de
la classe de l'objet.
Classe d'information
Il existe une classe ReflectionClass("Nom_classe") ayant des mthodes d'information sur la classe.
Ex : Avec la classe bourse
Date d'dition :
20/02/2012
Page :
20 / 44
Date d'dition :
20/02/2012
Page :
21 / 44
Chargement de classe
Comme dans tout langage objet, on doit charger les classes que l'on va utiliser.
L'instruction include() enverra une erreur de type warning si elle ne peut trouver le fichier; ce
comportement est diffrent de require(), qui enverra une erreur de type fatal.
Pour ne pas chaque fois utiliser l'adresse exacte du fichier inclure, on peut utiliser la variable
magique __FILE__.
Date d'dition :
20/02/2012
Page :
22 / 44
Date d'dition :
20/02/2012
Page :
23 / 44
PHP5.1
PDO
Driver
MySQL
Driver
Oracle
Driver
SQL Server
Driver
PostGreSQL
Base de
donnes
MYSQL
Date d'dition :
20/02/2012
Page :
24 / 44
PDO_CUBRID
Cubrid
PDO_DBLIB
PDO_FIREBIRD
Firebird/Interbase 6
PDO_IBM
IBM DB2
PDO_INFORMI
X
PDO_MYSQL
MySQL 3.x/4.x/5.x
PDO_OCI
PDO_ODBC
PDO_PGSQL
PostgreSQL
PDO_SQLITE
SQLite 3 et SQLite 2
PDO_SQLSRV
PDO_4D
4D
20/02/2012
Page :
25 / 44
8.2.1
Connexion
Pour se connecter une base de donnes, il faut tout d'abord crer une instance de la classe PDO.
Le constructeur PDO besoin de 3 paramtres :
123-
A Savoir :
Pour travailler proprement, on cre un script de paramtrage et de connexion.
8.2.2
Erreurs de connexion
20/02/2012
Page :
26 / 44
La classe PDO gre les exceptions et donc lvera automatiquement une exception.
Comme en JAVA, la structure de gestion des exceptions est :
Requtes
Date d'dition :
20/02/2012
Page :
27 / 44
Par Exemple :
8.3.2
Traitements
Permet d'accder aux rsultats squentiellement (on utilise while par exemple).
Dans ces mthodes, il est important de qualifier la faon dont on veut le retour des donnes grce
fetch_style qui contrle comment la prochaine ligne sera retourne l'appelant.
Tableau de l'attribut fetch_style (Il existe d'autres attributs cf doc) :
PDO::FETCH_ASSOC
PDO::FETCH_BOTH
PDO::FETCH_OBJ:
Date d'dition :
20/02/2012
Page :
28 / 44
Script :
Sortie :
Date d'dition :
20/02/2012
Page :
29 / 44
9 Template et Vue
9.1 Principe du Template
Dans le point 6.3 du document, jindique que pour grer la vue de la partie MVC, il existe deux
mthodologies dont lune est le Template de prsentation.
Le dveloppeur pourrait saffranchir de la partie reprsentation, il pourrait dvelopper la partie Modle,
passer le rsultat soit au contrleur soit la vue sans savoir comment les donnes vont tre affiches
(web, PDF, XML )
Le principe dun systme de Template est dans la sparation entre le contenu de linformation et la forme
de sa reprsentation.
Template de prsentation
Avantage
Clart dans le dveloppement
Facilit de dveloppement plusieurs
(dev, graphiste)
Productivit de dveloppement.
Inconvnient
Apprentissage du systme de
Template.
Si pas de gestionnaire de cache,
solution peu ralentir la cration des
pages web.
.tpl
.php
.php
Fichier de
prsentation
Script
Dexpression
rgulire.
Script de
donnes
.htm
Rsultat
de sortie
Date d'dition :
20/02/2012
Page :
30 / 44
9.2.1
Fichier de prsentation
Fichier Template :
Ce fichier comporte la page HTML avec des balises
que lon devra remplacer par les donnes
provenant du rsultat dun script PHP.
On voit bien ici, que lon peut donner cette page
crer un webdesigner. Il ny a pas de
programmation.
9.2.2
Script de donnes
9.2.3
Moteur du Template
Le but est d'analyser le fichier de Template et remplacer les balises par les donnes en provenance du
script de donnes.
On peut utiliser plusieurs mthodes pour arriver ce but :
Crer des tableaux : array(valeur_chercher) , array(valeur_remplacement) et matcher
On peut utiliser des gestionnaires de chaines.
On peut utiliser le remplacement via des fonctions d'expressions rgulires
20/02/2012
Page :
31 / 44
Sortie HTML.
Au final :
Date d'dition :
20/02/2012
Page :
32 / 44
Date d'dition :
20/02/2012
Page :
33 / 44
Script d'usage :
Erreur de syntaxe.
Erreur de comportement.
Erreur de parcours.
Erreur du serveur ...
L'ide importante est de pouvoir reprer l'erreur, l'intercepter et/ou l'enregistrer. On veut un moyen pour
connaitre l'erreur afin d'y remdier (ce n'est pas toujours vident).
Date d'dition :
20/02/2012
Page :
34 / 44
10.1.1 php.ini
Le moteur de PHP sait grer des erreurs mais encore faut-il qu'il soit bien paramtr.
Dans le fichier php.ini, on a une directive indiquant le niveau de remonte des erreurs par PHP.
Tableau niveaux d'erreurs
E_ALL
E_PARSE
E_ERROR
E_STRICT
E_DEPRECATED
Il existe plusieurs niveaux d'erreurs (+10) avec des combinaisons entre eux.
Les combinaisons sont crites simplement :
error_reporting= E_ALL & ~E_PARSE [on reporte les erreurs E_ALL et pas celles remontes par E_PARSE ]
error_reporting= E_ALL | E_STRICT [on reporte les erreurs remontes par E_ALL ou par E_STRICT ]
Si vous ne pouvez pas modifier le fichier.ini, vous pouvez utilisez en dbut de script la fonction :
error_reporting( E_ERROR | E_WARNING | E_PARSE);
La directive d'affichage
La directive display_errors (On/Off) permet d'afficher ou pas les erreurs.
La directive de log
La directive log_errors (On/Off) permet d'indiquer si on peut logger les erreurs.
La directive error_log = "c:/wamp/logs/php_error.log" indique o.
Logger les erreurs pour pouvoir les analyser et trs important notamment lorsqu'une application est en
production car on ne peut pas afficher les erreurs PHP aux utilisateurs.
Date d'dition :
20/02/2012
Page :
35 / 44
Utiliser @ devant une fonction pour qu'elle n'affiche pas d'erreur ou warning condition que vous
griez l'erreur.
Tester les retours des fonctions. Vous pouvez utilisez If/Else mais rend le code illisible.
Utiliser la mthode 'OR'. Intressant pour substituer les If/Else
Dclencher une erreur avec trigger_error(); Trs Propre mais apprentissage.
Ex de script :
La fonction trigger_error () :
bool trigger_error ( string $error_msg [, int $error_type = E_USER_NOTICE ] )
Les erreurs que l'on peut indiquer sont de 3 types :
E_USER_ERROR
E_USER_WARNING
E_USER_NOTICE
= E_ERROR
Le script s'arrte
=E_WARNING Le script continue
=E_NOTICE
Le script continue
20/02/2012
Page :
36 / 44
On peut dduire que la donne de prix rcupre n'est pas bonne, problme de requte, du calcul, de
lecture du fichier...
L'assertion est un moyen rapide et simple de tester des informations.
Astuce :
On peut dans mettre un commentaire dans le message d'assert(), ce qui permet de donner des
indications lors du dveloppement.
On peut aussi crer une fonction permettant de grer l'assertion avec
assert_options(ASSERT_CALLBACK,'nom_fct_gestion_assertion')
Date d'dition :
20/02/2012
Page :
37 / 44
On a vu plus haut l'usage de la leve d'exceptions lors d'une connexion la base de donnes, ce
mcanisme est trs utile, pour le dveloppeur car c'est lui qui dtermine les problmes qu'il veut
remonter.
Les Exceptions permettent la gestion logique de l'application.
Quand vous dveloppez, pensez lever (throw) et attraper (catch) les exceptions, autrement dit c'est au
dveloppeur de savoir ce qu'il estime tre une Exception.
PHP a par dfaut 2 classes pour les exceptions :
Classe Exception
Classe ErrorException extends Exception
Avec ces classes ont a des mthodes pour travailler sur l'exception leve :
getMessage()
getCode ()
getFile()
getLine()
A Savoir :
Le moteur PHP ne lve pas d'exception pour ses erreurs.
Ainsi, si vous faites une erreur de syntaxe E_PARSE n'envoit pas d'exception mais une erreur
classique, c'est le cas pour tout les types d'erreurs PHP.
Date d'dition :
20/02/2012
Page :
38 / 44
10.3.2 Usage
Ex : On imagine une application de calcul de prix TTC partir du HT. On doit avoir un prix suprieur 0 au
niveau du prix HT sinon l'application n'a pas d'usage.
Script test_exception :
Affichage :
Date d'dition :
20/02/2012
Page :
39 / 44
11 Dveloppement et scurit
11.1 Les points cls
Pour une application web, le dveloppeur est en face d'au moins 4 problmatiques :
La scurit est une proccupation du dveloppeur mais ne doit pas tre une obsession.
20/02/2012
Page :
40 / 44
Page securite.php
On rcupre le login et le password et on
construit une requte SQL que l'on va
ensuite passer notre base de donnes.
C'est Normal. Mais imaginons que je suis mal intentionn, et que je veux passer.
Login =theronf'
Password ="vide"
Date d'dition :
20/02/2012
Page :
41 / 44
A Savoir :
Il existe dans php.ini, une variable magic_quotes_gpc qui fixe le mode magic_quotes pour les oprations
GPC (Get/Post/Cookie). Lorsque magic_quotes est activ, tous les caractres ' (guillemets simples), "
(guillemets doubles), \ (antislash) et NUL sont chapps avec un antislash.
Avertissement : Cette fonctionnalit est OBSOLETE depuis PHP 5.3.0.
Date d'dition :
20/02/2012
Page :
42 / 44
Le protocole HTTP est dit "stateless", ou autrement dit sans tat. Pour un serveur, chaque requte qu'il
reoit est indpendante de la prcdente par consquent, il nous faut un mcanisme pour conserver les
donnes de l'utilisateur, pour ce faire on peut utiliser les sessions et/ou les cookies.
Cookies :
Un cookie est gnr et envoye par un serveur HTTP un client http qui le conserve (soit dans sa
mmoire, soit dans un fichier texte), et ce dernier le retourne lors de chaque interrogation du mme
serveur HTTP.
Gnrer un cookie :
Le cookie doit etre la premire chose cre dans une page php.
Lire un cookie :
Session :
La session est un mcanisme qui permet PHP de garder "en mmoire" du ct du serveur un nombre
illimit de valeurs entre plusieurs requtes d'un mme utilisateur. Une session est identifie par un Id
unique.
Crer une session :
Dans chaque page de l'application o on doit utiliser les sessions, il faut
appeler cette fonction qui initialise la session.
20/02/2012
Page :
43 / 44
Lors de l'authentification dans la session, noter une information telle que l'adresse IP rend le vol de
sessions plus compliqu, condition de vrifier l'adresse IP dans le script.
Pour rendre le vol de session, plus compliqu encore lier des donnes de la session avec des
donnes du cookie et vrifier les deux donnes chaque script.
Utiliser des fonctions de cryptage pour des donnes sensibles. [md5(), mcrypt()]
Dans une application, les dveloppeurs ngligent souvent l'analyse des logs de production, c'est une
erreur.
Dans le fichier php.ini, on peut indiquer o sont les logs mais si on ne les analyse pas rgulirement, on se
prive d'informations importantes, mais il faut aussi analyser les logs du serveur web aussi qui donne de
bonnes informations.
Log d'accs Apache (Log automatique):
Date d'dition :
20/02/2012
Page :
44 / 44