Apprendre la POO en php
Apprendre la POO en php
Quelques Prérequis avant de commencer
Apprendre la POO en php
Quelques Prérequis avant de commencer
Apprendre la POO en php
Quelques Prérequis avant de commencer
Apprendre la POO en php
Quelques Prérequis avant de commencer
Apprendre la POO en php
Quelques liens utiles
Apprendre la POO en php
Les objets en PHP sont un nouveaux type de variables
Vous connaissez surement les types suivant :
Les objets en PHP sont un nouveaux type de variables
Vous connaissez surement les types suivant :
Voici un exemple d'utilisation de Date en PHP :
<?php
// Spécifie la timezone à utiliser
date_default_timezone_set('Europe/Paris');
// Voici une date sous forme de chaine de character
$date = "2021-05-05";
// Nous ajoutons 3 mois à cette date
$newDate = date('Y-m-d', strtotime($date . ' +3 months'));
// Nous affichons la nouvelle date en format français
echo date('d/m/Y', strtotime($newDate));Nous pouvons améliorer l’exemple grâce à des fonctions :
<?php
// Voici une date sous forme de chaine de character
$date = "2021-05-05";
// Nous ajoutons 3 mois à cette date
$newDate = addMonths($date, 3)
// Nous affichons la nouvelle date en format français
echo formatDate($newDate, 'd/m/Y');Ou bien nous pouvons utiliser un objet :
<?php
// Création de l'objet "MaDate"
$date = new MyDate('2021-05-05');
// On ajoute 3 mois
$date->addMonths(3);
// On formate la date en français
echo $date->format('d/m/Y');Les objets possèdent de nombreux avantages :
Les objets possèdent de nombreux avantages :
Les objets possèdent de nombreux avantages :
Les objets possèdent de nombreux avantages :
Les objets possèdent de nombreux avantages :
Afin d'utiliser des objets nous devons tout d'abord créer :
Afin d'utiliser des objets nous devons tout d'abord créer :
Une instance se créé avec le mot clef :
Éxemple, création d'instance de MyDate :
<?php
$firstDate = new MaDate('2021-05-10');
$secondDate = new MaDate('2021-05-12');Éxemple, création d'instance de MyDate :
<?php
$firstDate = new MaDate('2021-05-10');
$secondDate = new MaDate('2021-05-12');Création d'une première instance de MyDate le 10 mai 2021
Éxemple, création d'instance de MyDate :
<?php
$firstDate = new MaDate('2021-05-10');
$secondDate = new MaDate('2021-05-12');Création d'une secondes instance de MyDate le 12 mai 2021
Chaque instances est indépendante !
<?php
$firstDate = new MaDate('2021-05-10');
$secondDate = new MaDate('2021-05-12');
echo $firstDate->format('d/m/Y');
echo $secondDate->format('d/m/Y');Affiche : "10/05/2021"
Chaque instances est indépendante !
<?php
$firstDate = new MaDate('2021-05-10');
$secondDate = new MaDate('2021-05-12');
echo $firstDate->format('d/m/Y');
echo $secondDate->format('d/m/Y');Affiche : "12/05/2021"
Afin de pouvoir créer une instance nous utilisons un schéma de construction :
Dans notre éxemple: MyDate
<php
$date = new MyDate('2021-05-20');Nom de la Class
Création de l'instance
Variable qui contiendra l'instance
Dans notre éxemple: MyDate
<php
$date = new MyDate('2021-05-20');On dit ici que :
$date est une instance de la class « MyDate »
Un objet PHP contient des variables interne que l'on appel
Voici un éxemple de propriétés simple avec la class MyDate
<php
$date = new MyDate('2021-05-20');
// Notre objet date contient des propriétés (comprenez variable)
// pour chaque membre de la date :
$date->day // Contient 20
$date->month // Contient 05
$date->year // Contient 2021Tout comme les variables nous pouvons changer leurs valeurs :
<php
$date = new MyDate('2021-05-20');
// On change le jour de notre date
$date->day = 25;
echo $date->format('d/m/Y'); // affiche 25/05/2021Les objets en PHP contiennent aussi des fonctions que l'on appel :
Voici un exemple de méthode sur notre objet MyDate
<php
$date = new MyDate('2021-05-20');
$date->addMonths(3);
echo $date->format('d/m/Y');Voici un exemple de méthode sur notre objet MyDate
<php
$date = new MyDate('2021-05-20');
$date->addMonths(3);
echo $date->format('d/m/Y');On utilise la méthode "addMonth" sur l'instance de MyDate
Voici un exemple de méthode sur notre objet MyDate
<php
$date = new MyDate('2021-05-20');
$date->addMonths(3);
echo $date->format('d/m/Y');On utilise la méthode "format" sur l'instance de MyDate
Pour résumer tout ça ! Un objet c'est :
Afin de bien comprendre comment fonctionne les objets nous allons maintenant créer notre première class
Créons un fichier PHP dans 'src/Personnage.php' et plaçons le code suivant :
<?php
class Personnage
{
public int $vie = 100;
public int $attaque = 20;
}
Maintenant importons et utilisons notre première class dans `public/index.php` :
<?php
require_once '../src/Personnage.php';
$merlin = new Personnage();
var_dump($merlin);
Nous pouvons maintenant afficher le résultat dans notre navigateur :
Rétournons dans `src/Personnage.php` afin de comprendre
<?php
class Personnage
{
public int $vie = 100;
public int $attaque = 20;
}
Ici nous créons un schéma de construction : une class Personnage
Rétournons dans `src/Personnage.php` afin de comprendre
<?php
class Personnage
{
public int $vie = 100;
public int $attaque = 20;
}
ATTENTION !
Les class commencent toutes par une Majuscule et correspondent au nom de notre fichier PHP !
Rétournons dans `src/Personnage.php` afin de comprendre
<?php
class Personnage
{
public int $vie = 100;
public int $attaque = 20;
}
Si notre class s'appel Personnage alors notre fichier PHP doit s'appeler Personnage.php
Rétournons dans `src/Personnage.php` afin de comprendre
<?php
class Personnage
{
public int $vie = 100;
public int $attaque = 20;
}
Ici nous déclarons 2 propriétés : "$vie" et "$attack"
Un propriété possède 4 sections :
<?php
class Personnage
{
public int $vie = 100;
public int $attaque = 20;
}
Valeur par défaut de la propriété
Nom de la propriété
Type de la propriété, ici "int"
La porté de notre propriété (nous en reparlerons un peu plus tard :) )
Maintenant regardons comment utiliser notre personnage :
<?php
require_once '../src/Personnage.php';
$merlin = new Personnage();
var_dump($merlin);
Nous importons le fichier PHP de notre class
Maintenant regardons comment utiliser notre personnage :
<?php
require_once '../src/Personnage.php';
$merlin = new Personnage();
var_dump($merlin);
Création d'une première instance de Personnage : $merlin
Maintenant regardons comment utiliser notre personnage :
<?php
require_once '../src/Personnage.php';
$merlin = new Personnage();
var_dump($merlin);
Nous déboguons notre objet
Nous pouvons maintenant jouer avec notre objet PHP :
<?php
require_once '../src/Personnage.php';
$merlin = new Personnage();
$merlin->vie = 50;
$merlin->attaque = 40;
$arthur = new Personnage();
$arthur->vie = 100;
$arthur->attaque = 30;
var_dump($merlin);
var_dump($arthur);
Voici ce que notre navigateur nous affiche
Il est possible dans une méthode de faire référence à l'instance en cours et d'accéder au propriétés de notre objet en utilisant
Exemple : Une méthode qui régénère notre Personnage
<?php
class Personnage
{
public int $vie = 100;
public int $attaque = 20;
public function regenerer(): void
{
$this->vie = 100;
}
}
Voici comment écrire une méthode !
<?php
class Personnage
{
public int $vie = 100;
public int $attaque = 20;
public function regenerer(): void
{
$this->vie = 100;
}
}
Type de retour de notre méthode. Ici void signifie rien du tout car notre méthode n'as pas d'instruction "return"
Voici comment écrire une méthode !
<?php
class Personnage
{
public int $vie = 100;
public int $attaque = 20;
public function regenerer(): void
{
$this->vie = 100;
}
}
Nom de la méthode
Voici comment écrire une méthode !
<?php
class Personnage
{
public int $vie = 100;
public int $attaque = 20;
public function regenerer(): void
{
$this->vie = 100;
}
}
Porté de la fonction (nous verrons cela un peu plus tard :) )
Voici comment écrire une méthode !
<?php
class Personnage
{
public int $vie = 100;
public int $attaque = 20;
public function regenerer(): void
{
$this->vie = 100;
}
}
Nous pouvons faire référence à l'instance en cour et accéder au propriétés de notre objet en utilisant $this
Utilisons notre méthode "régénérer"
<?php
require_once '../src/Personnage.php';
$merlin = new Personnage();
$merlin->vie = 50;
$merlin->attaque = 40;
$merlin->regenerer();
$arthur = new Personnage();
$arthur->vie = 100;
$arthur->attaque = 30;
var_dump($merlin);
var_dump($arthur);
Tout comme les fonctions, les méthodes peuvent recevoir des paramètres :
<?php
class Personnage
{
public int $vie = 100;
public int $attaque = 20;
public function regenerer(int $vie = 100): void
{
$this->vie = $this->vie + $vie;
}
}
<?php
class Personnage
{
public int $vie = 100;
public int $attaque = 20;
public function regenerer(int $vie = 100): void
{
$this->vie = $this->vie + $vie;
}
}
La valeur par défaut de notre paramètre
<?php
class Personnage
{
public int $vie = 100;
public int $attaque = 20;
public function regenerer(int $vie = 100): void
{
$this->vie = $this->vie + $vie;
}
}
Le nom de notre paramètre
<?php
class Personnage
{
public int $vie = 100;
public int $attaque = 20;
public function regenerer(int $vie = 100): void
{
$this->vie = $this->vie + $vie;
}
}
Le type de notre paramètre
<?php
class Personnage
{
public int $vie = 100;
public int $attaque = 20;
public function regenerer(int $vie = 100): void
{
$this->vie = $this->vie + $vie;
}
}
On assigne la vie de notre objet à la valeur envoyé en paramètre
Utilisons la méthode régénérer avec un paramètre !
<?php
require_once '../src/Personnage.php';
$merlin = new Personnage();
$merlin->vie = 50;
$merlin->attaque = 40;
$merlin->regenerer(20);
$arthur = new Personnage();
$arthur->vie = 100;
$arthur->attaque = 30;
var_dump($merlin);
var_dump($arthur);
Exercice
Écrire une méthode "afficher" qui affiche la vie et l'attaque du personnage et utiliser la méthode dans `index.php`
Créer une class Personnage dans un fichier Personnage.php
Définir 2 propriétés : $vie, et $attaque de type int et assigner une valeur par défaut
Exercice
Créer une fonction "attaquer" qui reçoit un Personnage et enlève la vie du personnage en fonction de son attaque !
Utiliser cette méthode dans `index.php`
Nos objets possèdent une méthode spécial qui nous permet de construire notre instance :
Nous pouvons facilement définir un constructeur sur notre Personnage afin que l'on puisse donner un nom à notre Personnage
Éxemple
<?php
class Personnage
{
...
public string $nom;
public function __construct(string $nom)
{
$this->nom = $nom;
}
...
}
Éxemple
<?php
class Personnage
{
...
public string $nom;
public function __construct(string $nom)
{
$this->nom = $nom;
}
...
}
Nous définissons une nouvelle propriété "$nom"
Éxemple
<?php
class Personnage
{
...
public string $nom;
public function __construct(string $nom)
{
$this->nom = $nom;
}
...
}
Nous créons la méthode constructeur
Éxemple
<?php
class Personnage
{
...
public string $nom;
public function __construct(string $nom)
{
$this->nom = $nom;
}
...
}
Nous ajoutons un paramètre de type string $nom
Éxemple
<?php
class Personnage
{
...
public string $nom;
public function __construct(string $nom)
{
$this->nom = $nom;
}
...
}
Nous assignons la propriété nom de notre objet à la valeur envoyé en paramètre
Utilisons maintenant notre constructeur dans `public/index.php` :
<?php
require_once '../src/Personnage.php';
$merlin = new Personnage('Merlin');
$merlin->vie = 50;
$merlin->attaque = 40;
$arthur = new Personnage('Arthur');
$arthur->vie = 100;
$arthur->attaque = 30;
$arthur->attaquer($merlin);
$merlin->afficher();
echo '<br/>';
$arthur->afficher();
Exercice
Retoucher la méthode "afficher" pour utiliser la propriété nom de notre objet
Solution
<?php
class Personnage
{
...
public function afficher(): void
{
echo $this->nom
. ' a '
. $this->vie
. ' points de vie et '
. $this->attaque
. ' en attaque.';
}
}
Dans un objet nous avons vu que chaque propriétés ou méthodes possèdent une portée c'est ce que nous appelons les
(Modificateurs d'accès en français)
Il en existe 3 !
La propriété ou la méthode est accessible depuis n'importe ou
La propriété ou la méthode est accessible uniquement depuis sa class
La propriété ou la méthode est accessible uniquement depuis sa class ou ses classes hérité
(Nous verrons celui ci un peu plus tard)
Exemple, définissons notre propriété "nom" en private
<?php
class Personnage
{
...
private string $nom;
...
public function afficher(): void
{
echo $this->nom
. ' a '
. $this->vie
. ' points de vie et '
. $this->attaque
. ' en attaque.';
}
}
Exemple, définissons notre propriété "nom" en private
<?php
class Personnage
{
...
private string $nom;
...
public function afficher(): void
{
echo $this->nom
. ' a '
. $this->vie
. ' points de vie et '
. $this->attaque
. ' en attaque.';
}
}
Nous définissons cette propriété comme "privée"
Exemple, définissons notre propriété "nom" en private
<?php
class Personnage
{
...
private string $nom;
...
public function afficher(): void
{
echo $this->nom
. ' a '
. $this->vie
. ' points de vie et '
. $this->attaque
. ' en attaque.';
}
}
Ici, nous pouvons utiliser notre propriété "name" car nous somme à l'intérieur de la classe !
Exemple, définissons notre propriété "nom" en private
<?php
require_once '../src/Personnage.php';
$merlin = new Personnage('Merlin');
$merlin->vie = 50;
$merlin->attaque = 40;
echo $merlin->nom;
$arthur = new Personnage('Arthur');
$arthur->vie = 100;
$arthur->attaque = 30;
$arthur->attaquer($merlin);
$merlin->afficher();
echo '<br/>';
$arthur->afficher();
Mais maintenant nous générons une erreur !!
Il est impossible d'accéder à une propriété "private" depuis l'extérieur de notre classe !
En POO il existe une règle qui définie la porté de nos membres :
Ces régles stipule :
1. Toutes les propriétés doivent être "private" ou "protected"
L'encapsulation permet de
1. Conserver des objets "stable" (évite les bug et les mauvaises utilisations)
2. Fournir un « manuel d'emploie »
3. Rendre notre code « ouvert à l'extension » mais « fermé à la modification » (une fois qu'un objet est codé nous ne reviendrons plus dessus :) )
Afin d'accéder à nos propriétés depuis l'extérieur de notre class nous pouvons mettre en place des
Afin d'accéder à nos propriétés depuis l'extérieur de notre class nous pouvons mettre en place des
Ils portent aussi le nom de
Exemple avec la propriété "nom"
<?php
class Personnage
{
private string $nom;
...
public function getNom(): string
{
return $this->nom;
}
public function setNom(string $nom): void
{
$this->nom = $nom;
}
}
La propriété "nom" reste private !
<?php
class Personnage
{
private string $nom;
...
public function getNom(): string
{
return $this->nom;
}
public function setNom(string $nom): void
{
$this->nom = $nom;
}
}
Nous créons un "Getter" (getNom) qui retourne la valeur de notre propriété nom
<?php
class Personnage
{
private string $nom;
...
public function getNom(): string
{
return $this->nom;
}
public function setNom(string $nom): void
{
$this->nom = $nom;
}
}
Nous créons un "Setter" qui change la valeur de notre propriété "nom"
<?php
class Personnage
{
private string $nom;
...
public function getNom(): string
{
return $this->nom;
}
public function setNom(string $nom): void
{
$this->nom = $nom;
}
}
Il est difficile de voire l’intérêt de l'encapsulation sans avoir beaucoup pratiqué avant.
Il est difficile de voire l’intérêt de l'encapsulation sans avoir beaucoup pratiqué avant.
Même si ce System parait plus compliqué il nous assure que nos objets soit manipulé correctement !
Il est difficile de voire l’intérêt de l'encapsulation sans avoir beaucoup pratiqué avant.
Même si ce System parait plus compliqué il nous assure que nos objets soit manipulé correctement !
C'est aussi grâce à l'encapsulation que notre code devient « réutilisable » et extensible !
Il est difficile de voire l’intérêt de l'encapsulation sans avoir beaucoup pratiqué avant.
Même si ce System parait plus compliqué il nous assure que nos objets soit manipulé correctement !
C'est aussi grâce à l'encapsulation que notre code devient « réutilisable » et extensible !
Nous aurons l'occasion de voir les bienfaits de l'encapsulation un peu plus tard :)
Pour résumer !
Éxercice
Rendre toutes les propriétés de personnage "private" !
Solution
<?php
class Personnage
{
private int $vie = 100;
private int $attaque = 20;
private string $nom;
...
}
Nous n'avons pas besoin d'accesseur pour le moment ! :)
L'héritage est un concept qui nous permet d'étendre le fonctionnement d'un objet sans avoir à retoucher son code !
L'héritage est un concept qui nous permet d'étendre le fonctionnement d'un objet sans avoir à retoucher son code !
Il permet à une class d'être l'enfant d'une autre class
L'héritage est un concept qui nous permet d'étendre le fonctionnement d'un objet sans avoir à retoucher son code !
Il permet à une class d'être l'enfant d'une autre class
Ainsi la classe enfant possède les méthodes et propriétés de la classe parente !
Exemple : Une class Magicien qui possède toutes les propriétés et méthodes de Personnage mais avec moins de vie et plus d'attaque !
Exemple : src/Magician.php
<?php
class Magician extends Personnage
{
}
Exemple : public/index.php
<?php
require_once '../src/Personnage.php';
require_once '../src/Magician.php';
$merlin = new Magician('Merlin');
$arthur = new Personnage('Arthur');
$arthur->attaquer($merlin);
$merlin->afficher();
echo '<br/>';
$arthur->afficher();
<?php
require_once '../src/Personnage.php';
require_once '../src/Magician.php';
$merlin = new Magician('Merlin');
$arthur = new Personnage('Arthur');
$arthur->attaquer($merlin);
$merlin->afficher();
echo '<br/>';
$arthur->afficher();
On inclue notre class Magician
<?php
require_once '../src/Personnage.php';
require_once '../src/Magician.php';
$merlin = new Magician('Merlin');
$arthur = new Personnage('Arthur');
$arthur->attaquer($merlin);
$merlin->afficher();
echo '<br/>';
$arthur->afficher();
On créé un magicien !
<?php
require_once '../src/Personnage.php';
require_once '../src/Magician.php';
$merlin = new Magician('Merlin');
$arthur = new Personnage('Arthur');
$arthur->attaquer($merlin);
$merlin->afficher();
echo '<br/>';
$arthur->afficher();
Notre magicien s'utilise pareil que notre personnage car il hérite de "Personnage" !
Dans la class magicien nous pouvons dès lors spécifié un nouveau comportement !
Nous pouvons aussi redéfinir des comportements !
Exemple : Réécrire la méthode "afficher" dans Magician :
<?php
class Magician extends Personnage
{
public function afficher(): void
{
echo 'Le magicien ';
parent::afficher();
}
}
<?php
class Magician extends Personnage
{
public function afficher(): void
{
echo 'Le magicien ';
parent::afficher();
}
}
Nous redéfinissons la méthode 'afficher'
<?php
class Magician extends Personnage
{
public function afficher(): void
{
echo 'Le magicien ';
parent::afficher();
}
}
Nous rajoutons le mot "Le magicien "
<?php
class Magician extends Personnage
{
public function afficher(): void
{
echo 'Le magicien ';
parent::afficher();
}
}
Nous appelons la méthode de class parent "afficher" (ici, appel la méthode "afficher" de la classe Personnage !)
Redéfinir la méthode "attaquer" afin de faire 20 dégat de plus !!
Exercice
Solution
<?php
class Magician extends Personnage
{
public function afficher(): void
{
echo 'Le magicien ';
parent::afficher();
}
public function attaquer(Personnage $cible): void
{
parent::attaquer($cible);
$cible->vie -= 20;
}
}
Solution
<?php
class Magician extends Personnage
{
public function afficher(): void
{
echo 'Le magicien ';
parent::afficher();
}
public function attaquer(Personnage $cible): void
{
parent::attaquer($cible);
$cible->vie -= 20;
}
}
Gros Exercice !
Créer une class HTMLElement ! qui s'utilise comme ceci :
<?php
require_once 'HTMLElement.php';
$form = new HTMLElement('form');
$div = new HTMLElement('div');
$p = new HTMLElement('p');
?>
<?php echo $form->start(); ?>
<input type="text" />
<?php echo $form->end();
<?php echo $div->start();?>
<?php echo $p->start(); ?>
Coucou
<?php echo $p->end(); ?>
<?php echo $div->end(); ?>Gros Exercice !
Cela doit produire le html suivant
<form>
<input type="text" />
</form>
<div>
<p>
Coucou
</p>
</div>Gros Exercice !
Retoucher la class HTMLElement pour lui donner des attributs
<?php
require_once 'HTMLElement.php';
$div = new HTMLElement('div', ['class' => 'super-class coucou']);
$a = new HTMLElement('a', ['href' => '/mon-lien', 'class' => 'red']);
echo $div->start(); // <div class="super-class coucou">
echo $a->start(); // <a href="/mon-lien" class="red">
echo $a->stop(); // </a>
echo $div->stop(); // </div>
Gros Exercice !
Créer une class « Form » qui permet d'afficher des input et des labels en utilisant la class HTMLElement !
Cette classe devrait pouvoir s'utiliser de tel manière :
<?php
require_once 'HTMLForm.php';
$loginForm = new HTMLForm();
?>
<form method="POST">
<?php echo $loginForm->label('Email :', 'email'); ?>
<?php echo $loginForm->input('email', 'email'); ?>
<?php echo $loginForm->label('Mot de passe :', 'password'); ?>
<?php echo $loginForm->input('password', 'password'); ?>
<?php echo $loginForm->submitButton('Envoyer'); ?>
</form>Gros Exercice !
Cela vas générer le html suivant :
<form method="POST">
<label for="email">Email :</label>
<input type="email" id="email" />
<label for="password">Mot de passe :</label>
<input type="password" id="password" />
<button type="submit">Envoyer</button>
</form>Gros Exercice !
Retoucher la class Form pour contenir un séparateur de block !
<?php
$loginForm = new HTMLForm(new HTMLElement('div'));
?>
<form method="POST">
<?php echo $loginForm->separatorStart(); ?>
<?php echo $loginForm->label('Email :', 'email'; ?>
<?php echo $loginForm->input('email', 'email'); ?>
<?php echo $loginForm->separatorEnd(); ?>
</form>Gros Exercice !
Nous pouvons maintenant créer une méthode "widget" qui contiendra les différents appels !
<?php
$loginForm = new HTMLForm(new HTMLElement('div'));
?>
<?php echo $loginForm->start(); ?>
<?php echo $loginForm->widget('Email :', 'email'); ?>
<?php echo $loginForm->end(); ?>Gros Exercice !
Nous pouvons faire la même chose avec notre "submitButton" et faire une méthode "button" :
<?php
$loginForm = new HTMLForm(new HTMLElement('div'));
?>
<form method="POST">
<?php echo $loginForm->widget('Email :', 'email', 'email'); ?>
<?php echo $loginForm->widget('Mot de passe :', 'password', 'password'); ?>
<?php echo $loginForm->button('Envoyer'); ?>
</form>Gros Exercice !
Nous pouvons même générer la balise form !
<?php
$loginForm = new HTMLForm(new HTMLElement('div'));
?>
<?php echo $loginForm->start('POST'); ?>
<?php echo $loginForm->widget('Email :', 'email', 'email'); ?>
<?php echo $loginForm->widget('Mot de passe :', 'password', 'password'); ?>
<?php echo $loginForm->button('Envoyer'); ?>
<?php echo $loginForm->end(); ?>Gros Exercice !
Nous pouvons aussi retoucher le consructeur pour envoyer de la configuration !
<?php
$loginForm = new HTMLForm(new HTMLElement('div'), 'POST');
?>
<?php echo $loginForm->start(); ?>
<?php echo $loginForm->widget('Email :', 'email', 'email'); ?>
<?php echo $loginForm->widget('Mot de passe :', 'password', 'password'); ?>
<?php echo $loginForm->button('Envoyer'); ?>
<?php echo $loginForm->end(); ?>Gros Exercice !
Nous pouvons même contracter tout notre code avec une seule méthode !
<?php
$loginForm = new HTMLForm(new HTMLElement('div'), 'POST');
?>
<?php echo $loginForm->display([
'widgets' => [
[ 'Email :', 'email', 'email' ],
[ 'Mot de passe :', 'password', 'password']
],
'button' => 'Envoyer'
]); ?>Méthodes et Propriété static
Il est possible de créer des méthodes et des propriétés dite static
Méthodes et Propriété static
Il est possible de créer des méthodes et des propriétés dite static
Ces dernières sont directement rattaché à une class et non à son instance !
Méthodes et Propriété static
Il est possible de créer des méthodes et des propriétés dite static
Ces dernières sont directement rattaché à une class et non à son instance !
Ce sont comme de simple "fonction" mais rangé dans une class
Méthodes et Propriété static
Un exemple de class static serait une class Text avec la possibilité de sauter une ligne !
<?php
class Text
{
static public function lineBreak(): void
{
echo "<br />";
}
}
Méthodes et Propriété static
Afin d'utiliser cette méthode on utilise le nom de class suivie de l'opérateur static !
<?php
require_once '../src/Personnage.php';
require_once '../src/Magician.php';
require_once '../src/Text.php';
$merlin = new Magician('Merlin', 100, 40);
$arthur = new Personnage('Arthur', 100, 10);
$merlin->afficher();
Text::lineBreak();
$arthur->afficher();
Méthodes et Propriété static
Inclusion de la class
<?php
require_once '../src/Personnage.php';
require_once '../src/Magician.php';
require_once '../src/Text.php';
$merlin = new Magician('Merlin', 100, 40);
$arthur = new Personnage('Arthur', 100, 10);
$merlin->afficher();
Text::lineBreak();
$arthur->afficher();
Méthodes et Propriété static
Appel de la méthode static "lineBreak" sur notre Text
<?php
require_once '../src/Personnage.php';
require_once '../src/Magician.php';
require_once '../src/Text.php';
$merlin = new Magician('Merlin', 100, 40);
$arthur = new Personnage('Arthur', 100, 10);
$merlin->afficher();
Text::lineBreak();
$arthur->afficher();
Autoload
Il est possible grâce à le fonction "spl_autoload_register" de "require" des class automatiquement !
Autoload
A chaque instanciation (new) cette function sera appelé !
<?php
spl_autoload_register(function ($class) {
require_once __DIR__ . '/../src/' . $class . '.php';
});
$merlin = new Magician('Merlin', 100, 40);
$arthur = new Personnage('Arthur', 100, 10);
Autoload
Enregistrement d'une fonction d'autoload. Nous recevons le nom de la class en première argument !
<?php
spl_autoload_register(function ($class) {
require_once __DIR__ . '/../src/' . $class . '.php';
});
$merlin = new Magician('Merlin', 100, 40);
$arthur = new Personnage('Arthur', 100, 10);
Autoload
Nous incluons notre fichier de class ! (ici __DIR__ fais référence au chemin du répertoire du fichier en cours)
<?php
spl_autoload_register(function ($class) {
require_once __DIR__ . '/../src/' . $class . '.php';
});
$merlin = new Magician('Merlin', 100, 40);
$arthur = new Personnage('Arthur', 100, 10);
Autoload
Lors de l'instanciation, PHP sera capable de chargé les fichiers de class automatiquement !
<?php
spl_autoload_register(function ($class) {
require_once __DIR__ . '/../src/' . $class . '.php';
});
$merlin = new Magician('Merlin', 100, 40);
$arthur = new Personnage('Arthur', 100, 10);
Les namespace
Dans un vrai projet PHP, nous utilsons des milliers de class !
Les namespace
Dans un vrai projet PHP, nous utilsons des milliers de class !
Afin d’éviter que 2 class soit nommé pareil (le conflit de nommage)
Les namespace
Dans un vrai projet PHP, nous utilsons des milliers de class !
Afin d’éviter que 2 class soit nommé pareil (le conflit de nommage)
PHP met à disposition des namespace !
Les namespace
Dans un vrai projet PHP, nous utilsons des milliers de class !
Afin d’éviter que 2 class soit nommé pareil (le conflit de nommage)
PHP met à disposition des namespace !
Ces derniers permette de ranger nos class dans des espaces de nommage prédéfinie !
Les namespace
Dans un vrai projet PHP, nous utilsons des milliers de class !
Afin d’éviter que 2 class soit nommé pareil (le conflit de nommage)
PHP met à disposition des namespace !
Ces derniers permette de ranger nos class dans des espaces de nommage prédéfinie !
Les namespace
Exercice : Déplaçons notre class Text dans un répertoire Util : `src/Util/Text.php` et ajoutons un namespace
<?php
namespace Util;
class Text
{
static public function lineBreak(): void
{
echo "<br />";
}
}
Les namespace
Indique à PHP que cette class se trouve dans l'espace de nom "Util"
<?php
namespace Util;
class Text
{
static public function lineBreak(): void
{
echo "<br />";
}
}
Les namespace
Les namespace doivent correspondre au répertoire de notre application !
<?php
namespace Util;
class Text
{
static public function lineBreak(): void
{
echo "<br />";
}
}
Les namespace
Utilisons notre class Text en spécifiant le namespace devant le nom de notre class !
<?php
spl_autoload_register(function ($class) {
...
});
$merlin = new Magician('Merlin', 100, 40);
$arthur = new Personnage('Arthur', 100, 10);
$merlin->afficher();
Util\Text::lineBreak();
$arthur->afficher();
Util\Text::lineBreak();Les namespace
Retouchons maintenant notre autoload pour prendre en compte nos namespace
<?php
spl_autoload_register(function ($class) {
$path = str_replace('\\', '/', $class);
require_once __DIR__ . '/../src/' . $path . '.php';
});
Les namespace
Nous remplaçons les \ par des / afin que le chemin de notre class soit correct
<?php
spl_autoload_register(function ($class) {
$path = str_replace('\\', '/', $class);
require_once __DIR__ . '/../src/' . $path . '.php';
});
Les namespace
Nous incluons le fichier de notre class
<?php
spl_autoload_register(function ($class) {
$path = str_replace('\\', '/', $class);
require_once __DIR__ . '/../src/' . $path . '.php';
});
Les namespace
Nous pouvons aussi "use" un namespace (ce qui nous évite d'écrire le namespace complete de la class à chaque fois)
use Util\Text;
$merlin = new Magician('Merlin', 100, 40);
$arthur = new Personnage('Arthur', 100, 10);
$merlin->afficher();
Text::lineBreak();
$arthur->afficher();
Text::lineBreak();Les namespace
En php il éxiste des suites de règles à suivre afin de produire un code « standard »
Ces normes sont les normes PSR
L'une de ces normes stipule que TOUT notre code doit ce situé dans le namespace "App" !