Suite Cours PHP

download Suite Cours PHP

of 66

Transcript of Suite Cours PHP

  • 8/16/2019 Suite Cours PHP

    1/66

    Hatem Sandid

    Complément de Cours PHP

  • 8/16/2019 Suite Cours PHP

    2/66

    php form - on sumbit stay on

    same page 

    • We can use the PHP_SELF variable instead of

    “form-action.php”. The code becomes: 

  • 8/16/2019 Suite Cours PHP

    3/66

    php form - on sumbit stay on

    same page if(isset($_POST['submit']))

    {

    // Enter the Code you want to execute after the

    form has been submitted// Dispaly Success or failure Message if any

    }

    else {// Display the Form and the Submit Button

    }

  • 8/16/2019 Suite Cours PHP

    4/66

    Manipulation de donnéesLes bases de données permettent d'emmagasiner et de retrouver de manière simple et efficace de très grandes quantités

    d'informations de tous types : numérique, texte, multimédia...Pour accéder à une base de données, il faut généralement disposer d'un code d'accès, de l'adresse IP du serveur et du nom de la

    base de données sur le serveur. Une dernière information nous indique le type de la BDD qui nous servira pour lancer nos

    requêtes (MySQL, PostgreSQL, Oracle...).

    La plupart des APIs fonctionnent sur un principe procédural, orienté objet ou bien les deux. Nous utiliserons de préférence la POO

    pour la flexibilité qu'elle nous offre.

     Je vais partir du principe que vous connaissez les bases de données relationnelles et le langage SQL. L'accès à une BDD peut se

    faire soit au moyen d'une API spécialisée pour votre BDD (MySQL, PostgreSQL, Oracle...), soit à travers une API générique

    (aussi appelée couche d'abstraction). Puisque les couches d'abstraction laissent d’avantage de liberté et de flexibilité queles APIs, il n'y a aucun avantage à utiliser une API spécifique. En revanche, le plus gros avantage d'utiliser une telle couche

    d'abstraction est de donner le choix du SGBD avec un minimum de modifications sur le code de l'application PHP.

    Je vous propose donc d'utiliser PHP Data Objects (alias PDO), qui est la couche d'abstraction fournie en standard dans PHP.

    Extensions PHP nécessaires : php_pdo + php_pdo_mysql (cette deuxième extension correspond à votre SGBD, dans mon cas

    MySQL).

    L'avantage principal de PDO est l'extrême simplicité de changement de SGBD : il suffit de changer un paramètre lors de

    l'instanciation de PDO, le reste du code est inchangé. Cela permet par exemple de coder une application et de la vendre à

    n'importe quel client, quel que soit son SGBD de prédilection, sans surcharge de travail. Par conséquent, il n'est pas

    nécessaire d'apprendre le fonctionnement de chaque API spécifique, PDO est suffisant. Vos développements prennent donc

    moins de temps.

  • 8/16/2019 Suite Cours PHP

    5/66

    Accès aux données

    L'accès à une base de données est soumis à diverses étapes :

    • Ouverture de la connexion au serveur ; 

    • Choix de la BDD sur le serveur (cela se fait parfois au moment de l'ouverture de laconnexion) ;

    • Préparation de requêtes (facultatif, dépend de l'API utilisée) ; 

    • Exécution de requêtes et récupération des résultats. 

    L'envoi de requêtes implique souvent le parcours des résultats, et dans certains cas lapréparation préalable des requêtes (c'est le cas de PDO).

    La connexion au serveur et la sélection de la BDD se font lors de l'instanciation del'objet PDO :

    $db = new PDO('mysql:host=localhost;dbname=developpez', 'utilisateur',

    'motdepasse');Pour envoyer une requête, il y a plusieurs solutions. La plus sécurisée est de passer par

    des requêtes préparées ( prepared statements) :

    $db = new PDO('mysql:host=localhost;dbname=developpez', 'utilisateur','motdepasse');

  • 8/16/2019 Suite Cours PHP

    6/66

    $select_users = $db->prepare('SELECT id, name FROM user');

    $select_user = $db->prepare('SELECT id, name FROM user WHERE user_id = ?');

    $insert_user = $db->prepare('INSERT INTO user (name, password) VALUES (?, ?)');

    //récupère tous les utilisateurs (aucun puisque la table est vide)

    $select_users->execute();

    $users = $select_users->fetchAll();

    $insert_user->execute(array('BrYs', '4321'));

    $insert_user->execute(array('mathieu', '4321'));

    $insert_user->execute(array('Yogui', '4321'));

    $select_users->execute(); //récupère tous les utilisateurs (les 3)

    $users = $select_users->fetchAll();

    $select_user->execute(array(1)); //récupère l'utilisateur numéro 1

    $user_1 = $select_user->fetchAll();

    $select_user->execute(array(2)); //récupère l'utilisateur numéro 2

    $user_2 = $select_user->fetchAll();

    $select_user->execute(array(3)); //récupère l'utilisateur numéro 3

    $user_3 = $select_user->fetchAll();

  • 8/16/2019 Suite Cours PHP

    7/66

    Comme nous pouvons le voir, une requête se prépare une seule fois pour l'ensemble du script. Chaque exécution

    de la requête se fait alors par la méthode execute(), et la récupération des résultats par la méthode fetchAll().

    Bien sûr, il est possible d'envoyer des requêtes directement depuis l'objet $db, mais alors il n'y a aucune forme de

    sécurisation des données puisque la méthode quote() n'est pas disponible pour tous les pilotes de BDD. Un code

    qui envoie des requêtes non préparées n'est donc pas portable.

    Il y a deux avantages majeurs à préparer les requêtes :

    • Chaque exécution est plus rapide en requête préparée qu'en envoyant la totalité de la requête à chaque fois ;  

    • Les paramètres sont transmis à la requête sous forme binaire, ce qui évite tout risque d'injection SQL.  

    Les paramètres peuvent être transmis à la requête préparée soit dans l'ordre, soit sous forme nommée. Les

    paramètres nommés peuvent être envoyés dans n'importe quel ordre :

  • 8/16/2019 Suite Cours PHP

    8/66

    $insert_1 = $db->prepare(

    'INSERT INTO user (name, password) VALUES (?, ?)');

    $insert_2 = $db->prepare(

    Cours de PHP 5 par Guillaume Rossolini (Tutoriels Web / SEO / PHP) (Blog)

    - 103 -

    Copyright © 2008 - Guillaume Rossolini. Aucune reproduction, même partielle, ne peut être faite de cesite et de l'ensemble de son contenu :

    textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300

    000 E de dommages et intérêts.

    http://g-rossolini.developpez.com/tutoriels/php/cours/

    'INSERT INTO user (name, password) VALUES (:name, :password)');

    $insert_1->execute(array('BrYs', '4321'));

    $insert_2->execute(array(

    ':password' => '4321',':name' => 'BrYs'

    ));

  • 8/16/2019 Suite Cours PHP

    9/66

    Les sessions(1)

    Principe Est un mécanisme permettant de mettre en relation les différentes requêtes

    du même client sur une période de temps donnée.

    Les sessions permettent de conserver des informations relatives à unutilisateur lors de son parcours sur un site web

    Des données spécifiques à un visiteur pourront être transmises de page enpage afin d'adapter personnellement les réponses d'une application PHP

    Chaque visiteur en se connectant à un site reçoit un numérod'identification dénommé identifiant de session (SID)

    La fonction session_start() se charge de générer automatiquement cetidentifiant unique de session et de créer un répertoire. Elle doit être placéeau début de chaque page afin de démarrer ou de continuer une session.

     

  • 8/16/2019 Suite Cours PHP

    10/66

    Les sessions(2)

    Principe Un répertoire est créé sur le serveur à l'emplacement désigné par le

    fichier de configuration php.ini, afin de recueillir les données de lanouvelle session.

    [Session]session.save_path= C:\PHP\sessiondata

    ; Rép session = \sess_7edf48ca359ee24dbc5b3f6ed2557e90

    Le fichier php.ini peut également préciser un nom de session parl'option session.name ou sa durée de vie par session.gc_maxlifetime

    La session en cours peut être détruite par la fonctionsession_destroy(). Cette commande supprime toutes les informationsrelatives à l'utilisateur.

    session_destroy(); 

  • 8/16/2019 Suite Cours PHP

    11/66

    Les sessions(3)

    Le traitement des variables de session  Les variables de session sont chargées dans une session par

    l'intermédiaire de la fonction session_register()

    Une fois la variable enregistrée, elle estaccessible à travers le tableau associatif

    $_SESSION["nom_variable"]

  • 8/16/2019 Suite Cours PHP

    12/66

    Les sessions(4)

    • Le traitement des variables de session

    Le transport des informations entre les documents est réalisé par l'entremise

     – soit d'un cookie

     – soit d'une requête HTTP

    • Cette dernière solution est la plus fiable puisque les cookies peuvent ne pas êtreacceptés par le client ou celui-ci pourrait les détruire en cours de session.

    • Il suffit de concaténer l'identifiant de session à l'adresse URL de la page ciblepour que cette dernière puisse accéder aux informations conservées par lasession.

    echo '

    lien‘ 

  • 8/16/2019 Suite Cours PHP

    13/66

    Les sessions(5)

    • Le traitement des variables de session 

     – Par défaut, PHP tente de passer par les cookies pour sauvegarderl'identifiant de session dans le cas où le client les accepterait. Ilest possible d’éviter  cela, il suffit de désactiver l'option deconfiguration session.use_cookies dans le fichier php.ini.

    [Session]

    session.use_cookies 0; //désactive la gestion des sessions par cookie

  • 8/16/2019 Suite Cours PHP

    14/66

    Les sessions(6)

    Nom :

    Prénom :

    eMail :

  • 8/16/2019 Suite Cours PHP

    15/66

    Les sessions(7)

  • 8/16/2019 Suite Cours PHP

    16/66

    Les sessions(8)

  • 8/16/2019 Suite Cours PHP

    17/66

    Les sessions (9)

    • Les fonctions de sessions 

    session_start() -- Initialise les données de session

    session_id() -- Affecte et/ou retourne l'identifiant de session courante

    session_name() -- Affecte et/ou retourne le nom de la session courante

    session_register() -- Enregistre une variable dans la session courante

    session_destroy() -- Détruit toutes les données enregistrées d'une session

    session_is_registered() -- Indique si une variable a été enregistrée dans la session ou pas

    session_unregister() -- Supprime une variable dans la session courante

    session_unset() -- Détruit toutes les variables de session

    session_cache_expire() -- Retourne la date d'expiration du cache de la session

    session_save_path() -- Affecte et/ou retourne le chemin de sauvegarde de la session courante

    session_decode() -- Décode les données de session à partir d'une chaîne

    session_encode() -- Encode les données de session dans une chaîne

  • 8/16/2019 Suite Cours PHP

    18/66

    Les en-têtes HTTP (1)

    • Principe – Les entêtes sont des informations envoyées lors de chaque échange par le

    protocole HTTP entre un navigateur et un serveur

    • Informations sur les données à envoyer dans le cas d'unerequête

     – Permettent aussi d'effectuer des actions sur le navigateur comme letransfert de cookies ou bien une redirection vers une autre page

    • Ce sont les premières informations envoyées aunavigateur (pour une réponse) ou au serveur (dans le casd'une requête),

     – elles se présentent sous la forme: en-tête: valeur 

     – la syntaxe doit être rigoureusement respectée

    • aucun espace ne doit figurer entre le nom de l'en-tête et lesdeux points (:). Un espace doit par contre figurer aprèscelui-ci

  • 8/16/2019 Suite Cours PHP

    19/66

    Les en-têtes HTTP (2)

    Principe PHP fournit une fonction permettant d'envoyer des en-tête HTTP

    manuellement du serveur au navigateur

    booléen header(chaîne en-tête HTTP)

    La fonction header() doit être utilisée avant tout envoi de donnéesHTML au navigateur

    Exemples Rediriger le navigateur vers une nouvelle page:

    Pour envoyer au navigateur une image créé à la volée 

    http://www.ensm-douai.fr/http://www.ensm-douai.fr/http://www.ensm-douai.fr/http://www.ensm-douai.fr/http://www.ensm-douai.fr/http://www.ensm-douai.fr/http://www.ensm-douai.fr/http://www.ensm-douai.fr/

  • 8/16/2019 Suite Cours PHP

    20/66

    Les en-têtes HTTP (3)

    • Récupérer les en-têtes de la requête  – Alors que la fonction header() permet d'envoyer des en-têtes HTTP

    au navigateur, PHP fournit une seconde fonction permettant derécupérer dans un tableau l'ensemble des en-têtes HTTP envoyéespar le navigateur

    Tableau getallheaders();• Le tableau retourné par la fonction contient les en-têtes indexés

    par leur nom

    • Exemple : un script permettant par exemple de récupérer des en-têtes particuliers.

  • 8/16/2019 Suite Cours PHP

    21/66

    Mail (1)

    La fonction mail envoie un message électronique.

    Syntaxe :

    mail($recipient, $subject, $message[, $headers,$params]);

    Exemple :

    $message = "Bonjour, ceci est mon message.’’; 

    $objet ="Bonjour"

    mail(‘’[email protected]’’, $objet, $message); 

    Cette fonction ne marche que si un programme demessagerie électronique (appelé « mailer ») estpréalablement installé sur le serveur.

  • 8/16/2019 Suite Cours PHP

    22/66

    Mail (2)

    Exemple plus complet :

  • 8/16/2019 Suite Cours PHP

    23/66

    Principes de sécurité (1) Veiller à limiter au strict nécessaire les droits et

    permissions de l'utilisateur :il vaut mieux l'entendre se plaindre de son manque de liberté plutôt que de constater les dégâts causés par une

    trop grande libéralité (principe universel)

    ne jamais faire confiance aux données transmises parl'utilisateur (encore moins à l'internaute !)

    SQL Injection

    Javascript injection 

    Toujours tester l'existence / la validité d'un fichier / codeà inclure : et s'il n'était pas celui que vous croyiez ?

    Regarder régulièrement les fichiers journaux (logs)

    Mettre des “alarmes” dans votre code, aux endroitsstratégiques (authentification), envoyées par mail oustockées dans une base de données

  • 8/16/2019 Suite Cours PHP

    24/66

    Principes de sécurité (2) un contrôle des données côté client est bien pratique, mais

    illusoire : quoi de plus simple que de désactiver Javascript ?Seul un contrôle côté serveur peut prétendre être efficace.

    préférer, quand cela est possible, la méthode POST à laméthode GET : les variables dans l'url, ça fait mauvais genre

    ne pas confondre complexité et sécurité : si votre système desécurité vous échappe, considérez que vous n'êtes pas ensécurité. De toute façon, vous n'êtes jamais en sécurité.

    s'efforcer de tenir à jour système serveur et interpréteur PHPavec les dernières versions stables : quand la catastropheaura eu lieu, ce sera ça de moins à vous reprocher...

  • 8/16/2019 Suite Cours PHP

    25/66

    Principes de sécurité (3)

    Masquer PHPConfigurer le serveur web pour qu'il utilise plusieurs extensions de fichiers avec PHPVous pouvez utiliser des informations déroutantes comme ceci :

     Masquer PHP avec un autre langage

    # Faire que le code PHP ressemble à un autre langage

    AddType application/x-httpd-php .asp .py .pl

     Masquer PHP avec des types inconnus

    # Faire que le code PHP ressemble à un autre langage qui n'existe pas

    AddType application/x-httpd-php .bop .foo .133t

    cachez-le sous forme de html.

    Cela a un léger impact négatif sur les performances générales, cartous les fichiers HTML seront aussi analysés et traités par le moteur

    PHP :

    Utiliser le type html pour les extensions PHP

    # Faire que le code PHP ressemble à du html

    AddType application/x-httpd-php .htm .html

  • 8/16/2019 Suite Cours PHP

    26/66

    Programmation Orientée Objet

    en PHP

  • 8/16/2019 Suite Cours PHP

    27/66

    Déclarer une classe en PHP

    • Une classe est un modèle de données – famille d'objets, ou encore moule à objets

     – tous les objets d’une même classe partagent lesmêmes attributs et les mêmes méthodes

    • le mot clé class permet de déclarer une classed'objet.

    class voiture

    {//code de la classe

    }

  • 8/16/2019 Suite Cours PHP

    28/66

    déclarer des attributs

    (ou propriétés)

    class voiture

    {

    public $marque = "trabant";

    }

    • public, protected, private sont supportés

    • L’un des trois est obligatoire ou le mot clé var ( 

    public)• Affectation et même déclaration facultatives!!

  • 8/16/2019 Suite Cours PHP

    29/66

    déclarer des méthodes

    (ou propriétés)

    class voiture

    {

    function freiner($force_de_freinage)

    {//code qui freine

    }

    }public, protected, private sont supportés

    Implicitement « public »

  • 8/16/2019 Suite Cours PHP

    30/66

    déclarer des constantes

    • class voiture

    • {

    •  const ROUES_MOTRICES = 2;

    • }

    • Locale à la classe

    • convention classique : spécifier les

    constantes en majuscules dans le code pourmieux les identifier

  • 8/16/2019 Suite Cours PHP

    31/66

    Instanciation

    • class voiture

    • {

    •  const ROUES_MOTRICES = 2;

    •  public $marque;

    •  function freiner($force_de_freinage)

    •  {•   //code qui freine

    •  }

    • }

    • $MaVoiture = new voiture();

    • Les parenthèses sont optionnelles si le constructeur ne nécessite pasde paramètre

    • En PHP5 toute classe doit être déclarée avant d'être utilisée – Non obligatoire en PHP4

  • 8/16/2019 Suite Cours PHP

    32/66

    Accéder à un attribut

    • class voiture

    • {

     public $marque = "trabant";• }

    • $MaVoiture = new voiture();

    • echo $MaVoiture->marque;• // affiche trabant

  • 8/16/2019 Suite Cours PHP

    33/66

    Accéder à une méthode

    • class voiture

    • {

    •  function klaxonner(){return "tut tut!!";

    •  }

    • }

    • $MaVoiture = new voiture();

    • echo $MaVoiture->klaxonner();

    • // affiche "tut tut!"

  • 8/16/2019 Suite Cours PHP

    34/66

    Accèder à une constante

    • class voiture

    • {

    •  const ROUES = 2;

    •  public $marque;

    •   function freiner($force_de_freinage)•   {

    •   //code qui freine

    •   }

    }• $MaVoiture = new voiture();

    • echo "ma voiture a ".$MaVoiture::ROUES." roues ";

    • // affiche "ma voiture a 2 roues"

  • 8/16/2019 Suite Cours PHP

    35/66

    référence à l'objet en cours

    • class voiture

    • {

    •   public $vitesse = 0;

    •   function avance( $temps)

    •   {

    •   echo "avance de ".$temps*$this->vitesse." km en ".$temps." h";•   }

    • }

    • $MaVoiture = new voiture();

    • $MaVoiture->vitesse = 100; //la vitesse est de 100km/h

    •$MaVoiture->avance(2); // affiche "avance de 200 km en 2h"

  • 8/16/2019 Suite Cours PHP

    36/66

    accès statiques

    •appel direct via la classe, pas d’instanciaton

    • utilisant de l’accesseur :: 

    • La référence à l’objet courant $this est alors interdite 

    class voiture

    {

    public $roues = 4;

    function statique()

    {

    return 4;

    }

    function dynamique()

    {

    return $this->roues;

    }}

    echo voiture::$roues; // affiche un message d’erreur 

    echo voiture::statique(); // affiche 4

    echo voiture::dynamique(); // affiche un message d'erreur

  • 8/16/2019 Suite Cours PHP

    37/66

    Accès statique explicite

    • Via le mot clé static

    • Pour les attributs public private ou protected devient facultatif (public par défaut)

    class voiture

    {

    static $roues = 4static function statique(){

    echo 4;

    }

    }

    echo voiture::$roues; // affiche 4

    echo voiture::statique(); // affiche 4

    $v = new voiture();

    echo $v->roues; // affiche un message d'erreurecho $v->statique(); //affiche 4 et est sensé afficher un message d'erreur de niveau

    E_STRICT

  • 8/16/2019 Suite Cours PHP

    38/66

    Accès à la classe courante

    • class voiture

    • {

    •   static $roues = 4;

    •  function static()

    •   {•   return self::$roues;

    •   }

    • }

    • echo voiture::static(); // CORRECT affiche 4

    • $v = new voiture();

    • echo $v->dynamique()."
    "; //INCORRECT mais affiche4 et est sensé afficher un message d'erreur de niveauE_STRICT

  • 8/16/2019 Suite Cours PHP

    39/66

    Exception

  • 8/16/2019 Suite Cours PHP

    40/66

    L’héritage en POO 

    • permet de regrouper des partiescommunes dans une classe dite mère

    • Toute classe dérivant de cette classe mère

    est appelée classe fille• Une classe fille possède les attributs et

    méthodes de la classe mère ainsi que des

    attributs et des méthodes qui lui sontpropres

    • Pas d’héritage multiple en PHP5 

  • 8/16/2019 Suite Cours PHP

    41/66

    Héritage en PHP5

    •class vehicule

    • {

    •   public $marque = "";

    •   function avance()

    •   {

    •   //code qui fait avancer le véhicule

    •   }

    •   function freine()

    •   {

    •   //code qui fait freiner le vehicule

    •   }

    • }

    • class voiture extends vehicule

    {•   function klaxonne()

    •   {

    •   //code qui fait klaxonner la voiture

    •   }

    •   // la classe voiture possède un attribut marque, une méthode freine et une méthode avance parhéritage

    • }

  • 8/16/2019 Suite Cours PHP

    42/66

    Redéfinition de méthode

    • Les méthodes hérités peuvent être réécrites dans la classe fille

    class voiture extends vehicule

    {

    public $marque= « peugeot »;

    function klaxonne()

    { //code qui fait klaxonner la voiture

    }

    function avance()

    {

    //code qui fait avancer la voiture

    }function freine()

    {

    //code qui fait freiner la voiture}

    }

  • 8/16/2019 Suite Cours PHP

    43/66

    Héritage strict

    • Les méthodes de la classe fille doivent avoir desprototypes compatibles avec ceux de la classemère –  Les classes filles doivent pouvoir se manipuler comme

    la classe dont elles héritent –  Il est possible d'ajouter des paramètres

    supplémentaires, à condition qu'ils soient facultatifs

     –  Il est aussi possible de rendre facultatifs desparamètres en leur donnant une valeur par défaut

    • Seuls les constructeurs ne sont pas soumis à cetterègles.

  • 8/16/2019 Suite Cours PHP

    44/66

    Accéder à la classe parente

    • class vehicule

    • {

    •   $roues = 4;

    •   function affiche()

    •   {

    •   return "a ".$this->roues." roues";

    •   }

    • }

    • class voiture extends vehicule

    • {

    •   function affiche()

    •   {•   echo "cette voiture ".parent::affiche();

    •   }

    • }

    • $v = new voiture();

    • $v->affiche(); //affiche cette voiture a 4 roues

  • 8/16/2019 Suite Cours PHP

    45/66

    Contrôle d’accès 

    • public: une méthode ou attribut publiqueest accessible depuis toute votreapplication

    • private: une méthode ou attribut privéen’est accessible que depuis l’intérieur de laclasse

    Protected: une méthode ou attributpublique est accessible depuis l’intérieur dela classe, et depuis toutes les classesdérivés

  • 8/16/2019 Suite Cours PHP

    46/66

    Contrôle d’accès héritage 

    • Les accès aux attributs et méthodes sontredéfinissables dans les classes filles pourvu que ladirective soit identique ou plus large –  Une méthode protégée peut être redéfinie comme protégée

    ou publique dans une classe fille. –  Une méthode publique ne peut être que publique dans un

    classe fille.

     –  Si une méthode privée est redéfinie dans une classe fille,PHP considèrera qu'il a deux méthodes de même nom

    simultanément dans la classe fille.• Si c'est une méthode de la classe mère qui y fait appel, elle accèdera

    à la méthode privée initiale.

    • Si c'est une méthode de la classe fille qui y fait appel, elle accèdera àla nouvelle implémentation.

  • 8/16/2019 Suite Cours PHP

    47/66

    Classe abstraite

    • début d'implémentation d'une classe• Non instanciable

    • Toute classe contenant au moins une méthode abstraitedoit être déclarée abstraite

    Seule la signature d’une méthode abstraite est déclarée(pas d’implémentation) 

    • Les classes dérivées doivent implémentées toutes lesméthodes abstraites

    • Les classes dérivées ne sont pas obligées d’implémenter

    les méthodes déjà implémentées dans la classe parent, etpeuvent posséder leurs propres méthodes

  • 8/16/2019 Suite Cours PHP

    48/66

    Classe abstraite

    • abstract class vehicule

    • {

    •  abstract function avancer();

    •  function tourner($sens)

    •  {

    •   echo "tourne à ".$sens."
    ";

    •   }

    • }

    •  

  • 8/16/2019 Suite Cours PHP

    49/66

    Héritage d’une classe abstraite 

    •  class voiture extends vehicule{

    function avancer()

    {echo "go!
    ";

    }

    function klaxonner()

    {echo "tut tut!
    ";

    }

    }

  • 8/16/2019 Suite Cours PHP

    50/66

    interface

    • API (Application Programming Interface) qui spécifiequelles méthodes et variables une classe peutimplémenter, sans avoir à définir comment ces méthodesseront gérées

    Non instanciable• Seule les signatures des méthodes d’une interface sont

    déclarées (pas d’implémentation) 

    • Toutes les méthodes de l'interface doivent êtreimplémentées

    • Les classes peuvent implémenter plus d'une interface enséparant chaque interface par une virgule

  • 8/16/2019 Suite Cours PHP

    51/66

    interface

    • interface peutAvancer

    • {public function avancer();public function freiner();

    • }

    • interface peutTourner

    • {

    public function tourneGauche();public function tourneDroite();

    • }

  • 8/16/2019 Suite Cours PHP

    52/66

    Implémentation d’une interface • class voiture implements peutAvancer, peutTourner

    • {public function avance(){

    echo "on avance";}public function freine(){

    echo "on freine";}public function tourneGauche(){

    echo "on tourne à gauche";}public function tourneDroite()

    { echo "on tourne à droite";}function klaxonner(){

    echo "tut tut!
    ";}

    •}

  • 8/16/2019 Suite Cours PHP

    53/66

    Abstract VS interface

    • Aucun code n’est présent dans une

    interface

     –  Une interface est donc une classe abstraite qui

    ne contiendrait que des méthodes abstraites

     –  Une classe ne peut dériver que d’une classe

    abstraite mais peut implémenter plusieurs

    interfaces

  • 8/16/2019 Suite Cours PHP

    54/66

    Classe finale

    • Ces classes et méthodes ne pourront jamais être héritées

    class voiture extends vehicule

    {final function avancer(){echo "on avance";

    }

    }

    final class voiture extends vehicule

    {

    public function avancer(){

    echo "on avance";}

    }

  • 8/16/2019 Suite Cours PHP

    55/66

    déréférencement des méthodes

    • class pneu• {

    •   public $marque = "michelin";

    • }

    • class voiture

    • {•   function Pneu()

    •   {

    •   return new pneu();

    •   }

    }• $MaVoiture = new voiture();

    • echo "je roule avec des pneus ".$MaVoiture->Pneu()->$marque;

    • // affiche "je roule avec des pneus michelin"

  • 8/16/2019 Suite Cours PHP

    56/66

    affectation en PHP4

    • par défaut les objets étaient passés par copieclass voiture

    {public $marque = "trabant";

    }$MaVoiture = new voiture();

    $MaVoiture2 = $MaVoiture;

    $MaVoiture2->marque = 'ferrari';

    echo $MaVoiture->marque; // affiche "trabant"

    • $MaVoiture et $MaVoiture2 sont des objets distincts.

    Affectation par référence en

  • 8/16/2019 Suite Cours PHP

    57/66

    Affectation par référence en

    PHP4• On pouvait toutefois forcer l'affectation par référence grâce à

    l'opérateur &.

    class voiture

    {public $marque = "trabant";

    }

    $MaVoiture = new voiture();

    $MaVoiture2 = &$MaVoiture;

    $MaVoiture2->marque = 'ferrari';

    echo $MaVoiture->marque; // affiche "ferrari"

    • pour q'une fonction puisse modifier un objet il fallait doncobligatoirment lui passe l'objet par référence :-/

  • 8/16/2019 Suite Cours PHP

    58/66

    Affectation en PHP5

    • par défaut l'affectation est désormais faite pasréférence pour les objets (l'opérateur & estmaintenant implicite)

    •   class voiture{

    public $marque = "trabant";}$MaVoiture = new voiture();

    $MaVoiture2 = $MaVoiture;$MaVoiture2->marque = 'ferrari';echo $MaVoiture->marque; // affiche "ferrari"

  • 8/16/2019 Suite Cours PHP

    59/66

    clonage en PHP5

    • c'est le mot-clé clone qui permet d'effectuer unecopie distinct d’un objet 

    class voiture

    {

    public $marque = "trabant";}

    $MaVoiture = new voiture();

    $MaVoiture2 = clone $MaVoiture;

    $MaVoiture2->marque = 'ferrari';echo $MaVoiture->marque; // affiche "trabant"

  • 8/16/2019 Suite Cours PHP

    60/66

    égalité

    • l'égalité de deux objets (tous les attributs

    sont égaux) se teste par ==

    • l'identité de deux objets (les deux variables

    référencent le même objet) se teste par ===

    Appartenance d’un objet à une

  • 8/16/2019 Suite Cours PHP

    61/66

    Appartenance d un objet à une

    classe• class voiture{}• $MaVoiture = new voiture();

    • if($MaVoiture instanceof voiture)

    • {

    •  echo "cet objet est une voiture";

    • }

    • Else

    {•  echo "cet objet n'est pas une voiture";

    • }

  • 8/16/2019 Suite Cours PHP

    62/66

    obtenir la classe d’un objet 

    • class voiture{}

    • $MaVoiture = new voiture();

    • echo "cet objet est une " . get_class($MaVoiture);

    • // affiche "cet objet est une voiture"

    Obtenir la classe parente d’un

  • 8/16/2019 Suite Cours PHP

    63/66

    Obtenir la classe parente d un

    objet

    • class vehicule{}

    • class voiture extends vehicule{}

    • $MaVoiture = new voiture();

    • echo get_class_parent($MaVoiture);

    • // affiche "vehicule"

    echo get_class_parent('voiture');• // affiche "vehicule"

  • 8/16/2019 Suite Cours PHP

    64/66

    Réflexion

    • PHP 5 introduit API de réflexion complète qui

    permet de faire du reverse-engineering sur les

    classes, les interfaces, les fonctions et les

    méthodes tout comme les extensions. L'API deréflexion permet également d'obtenir les

    commentaires de la documentation pour les

    fonctions, les classes et les méthodes.

    http://fr2.php.net/manual/fr/book.reflection.php

  • 8/16/2019 Suite Cours PHP

    65/66

    PHP 5.3

    • Extension SPL (Standard PHP Library)

    intégrée en natif

     –  http://www.php.net/~helly/php/ext/spl/

    • Les namespaces sont supportés \ commecaractère séparateur

     –  http://fr.php.net/manual/fr/language.names

    paces.rationale.php

     –  http://jcrozier.developpez.com/tutoriels/web

    /php/espaces-noms--mots-cles-autoloading/ 

    http://fr.php.net/manual/fr/language.namespaces.rationale.phphttp://fr.php.net/manual/fr/language.namespaces.rationale.phphttp://fr.php.net/manual/fr/language.namespaces.rationale.phphttp://fr.php.net/manual/fr/language.namespaces.rationale.phphttp://fr.php.net/manual/fr/language.namespaces.rationale.phphttp://fr.php.net/manual/fr/language.namespaces.rationale.phphttp://fr.php.net/manual/fr/language.namespaces.rationale.php

  • 8/16/2019 Suite Cours PHP

    66/66

    Fonctions Anonymes ou lambdas

    • Comme en javascript (« à la jQuery »)• Affectation à une variable

    $hello = funtcion(){echo 'hello world'}

    • Appel

    $hello();

    call_user_func($hello);

    • Passé en argument d'une fonction

    Function foo(Closure $func){$func();}foo($hello);http://blog.pascal-martin.fr/post/php-5.3-1-closures-et-lambdas

    http://blog.pascal-martin.fr/post/php-5.3-2-closures-et-lambdas

    http://www.slideshare.net/fabpot/playing-with-php-53