Le logo de PHP 5  PHP 5 Cours et exercices  2e Edition La couverture du livre PHP 5

Jean ENGELS       Editions Eyrolles

Chapitre 9: La programmation objet

Exercice 1

Écrivez une classe représentant une ville. Elle doit avoir les propriétés nom et département et une méthode affichant « la ville X est dans le département Y ». Créez des objets ville, affectez leurs propriétés, et utilisez la méthode d’affichage.

<?php
class ville
{
public $nom;
public $depart;
public function getinfo()
{
$texte="La ville de $this->nom est dans le département : $this-
>depart <br />";
return $texte;
}
}
//Création d'objets
$ville1 = new ville();
$ville1->nom="Nantes";
$ville1->depart="Loire Atlantique";
$ville2 = new ville();
$ville2->nom="Lyon";
$ville2->depart="Rhône";
echo $ville1->getinfo();
echo $ville2->getinfo();
?>
	
Le résultat affiché est :
La ville de Nantes est dans le département : Loire Atlantique
La ville de Lyon est dans le département : Rhône
Voir le résultat

Exercice 2

Modifiez la classe précédente en la dotant d’un constructeur. Réalisez les mêmes opérations de création d’objets et d’affichage.

<?php
class ville
{
private $nom;
private $depart;
public function __construct($nom,$depart)
{
$this->nom=$nom;
$this->depart=$depart;
}
public function getinfo()
{
$texte="La ville de $this->nom est dans le département : $this-
>depart 
"; return $texte; } } //Création d'objets $ville1 = new ville("Nantes","Loire Atlantique"); $ville2 = new ville("Lyon","Rhône"); echo $ville1->getinfo(); echo $ville2->getinfo(); ?>
Le résultat affiché est :
La ville de Nantes est dans le département : Loire Atlantique
La ville de Lyon est dans le département : Rhône
On constate encore une fois que l’utilisation d’un constructeur facilite la création d’objet et l’affectation de ses propriétés. Une deuxième possibilité consiste à isoler le code de création de la classe ville de l’exercice 2 dans un fichier séparé, de l’inclure dans le code de l’exercice 3 et d’étendre la classe ville à l’aide du mot-clé extends puis de lui ajouter le constructeur.
Voir le résultat

Exercice 3

Créez une classe représentant une personne. Elle doit avoir les propriétés nom, prénom et adresse, ainsi qu’un constructeur et un destructeur. Une méthode getpersonne() doit retourner les coordonnées complètes de la personne. Une méthode setadresse() doit permettre de modifier l’adresse de la personne. Créez des objets personne, et utilisez l’ensemble des méthodes.

<?php
class personne
{
private $nom;
private $prénom;
private $adresse;
//Constructeur
public function __construct($nom,$prénom,$adresse)
{
$this->nom=$nom;
$this->prénom=$prénom;
$this->adresse=$adresse;
}
//Destructeur
public function __destruct()
{
echo "<script type=\"text/javascript\">alert('La personne nommée $this->prénom $this->nom \\nest supprimée de vos contacts')</script>";
}
//
public function getpersonne()
{
$texte=" $this->prénom $this->nom <br /> $this->adresse <br />";
return $texte;
}
//
public function setadresse($adresse)
{
$this->adresse=$adresse;
}
}
//Création d'objets
$client = new personne("Geelsen","Jan"," 145 Rue du Maine Nantes");
echo $client->getpersonne();
//Modification de l'adresse
$client->setadresse("23 Avenue Foch Lyon");
//Suppression explicite du client, donc appel du destructeur
unset($client);
//Fin du script
echo "Fin du script";
?>
	
Notez l’ordre d’apparition de la boite d’alerte créée par le destructeur après l’appel de la fonction unset() et de l’affichage de la fin du script.
Voir le résultat

Exercice 4

Créez une classe nommée form représentant un formulaire HTML. Le constructeur doit créer le code d’en-tête du formulaire en utilisant les éléments <form> et <fieldset>. Une méthode settext() doit permettre d’ajouter une zone de texte. Une méthode setsubmit() doit permettre d’ajouter un bouton d’envoi. Les paramètres de ces méthodes doivent correspondre aux attributs des éléments HTML correspondants. La méthode getform() doit retourner tout le code HTML de création du formulaire. Créez des objets form, et ajoutez-y deux zones de texte et un bouton d’envoi. Testez l’affichage obtenu. Le fichier contenant la définition de la classe form (ch9exo4.php) est indépendant ce qui permet son inclusion dans d’autres scripts en vue de l’utilisation de la classe ou de son extension.

<?php
class form
{
protected $code;
protected $codeinit;
protected $codetext;
protected $codesubmit;
public function __construct($action,$titre,$methode="post")
{
$this->codeinit="<form action=\"$action\" method=\"$methode\">";
$this->codeinit.="<fieldset><legend><b>$titre</b></legend>";
//$this->action = $action;
//$this->methode=$methode;
}
//********************************************
public function settext($name,$libelle,$methode="post")
{
$this->codetext.="<b>$libelle</b><input type=\"text\" name=\"$name\" /><br /><br />";
}
//************************************************
public function setsubmit($name="envoi",$value="Envoyer")
{
$this->codesubmit="<input type=\"submit\" name=\"$name\" value=\"Envoyer\"/><br />";
}
//**************************
public function getform()
{
$this->code="";
$this->code.=$this->codeinit;
$this->code.=$this->codetext;
$this->code.=$this->codesubmit;
$this->code.="</fieldset></form>";
echo $this->code;
}
}
?>
Le fichier ch9exo4b.php inclus le fichier précédent et creé un objet de type form.
<?php
include('ch9exo4.php');
//***************************
$myform = new form("traitement.php","Accès au site","post");
$myform->settext("nom","Votre nom :  ");
$myform->settext("code","Votre code : ");
$myform->setsubmit();
$myform->getform();
?>
	
Voir le résultat

Exercice 5

Créez une sous-classe nommée form2 en dérivant la classe form de l’exercice 4. Cette nouvelle classe doit permettre de créer des formulaires ayant en plus des boutons radio et des cases à cocher. Elle doit donc avoir les méthodes supplémentaires qui correspondent à ces créations. Créez des objets, et testez le résultat.

<?php
include('ch9exo4.php');
class form2 extends form
{
protected $coderadio;
protected $codecase;
public function __construct($action,$titre,$methode="post")
{
parent::__construct($action,$titre,$methode="post");
}
//********************************************
public function setradio($name,$libelle,$value)
{
$this->coderadio.="<b>$libelle</b><input type=\"radio\" name=\"$name\" value=\"$value\"/><br />";
}
//************************************************
public function setcase($name,$libelle,$value)
{
$this->codecase.="<b>$libelle</b><input type=\"checkbox\" name=\"$name\" value=\"$value\" /><br />";
}
//**************************
public function getform()
{
$this->code="";
$this->code.=$this->codeinit;
$this->code.=$this->codetext;
$this->code.=$this->coderadio;
$this->code.=$this->codecase;
$this->code.=$this->codesubmit;
$this->code.="</fieldset></form>";
echo $this->code;
}
}
//***************************
$myform = new form2("traitementb.php","Coordonnées et sports préférés","post");
$myform->settext("nom","Votre nom :  ");
$myform->settext("code","Votre code : ");
$myform->setradio("sexe"," Homme ","homme");
$myform->setradio("sexe"," Femme ","femme");
$myform->setcase("loisir"," Tennis ","tennis");
$myform->setcase("loisir"," Equitation ","équitaion");
$myform->setcase("loisir"," Football ","football");
$myform->setsubmit();
$myform->getform();
?>
	
Voir le résultat

Exercice 6

Créez un objet à partir de la classe form2 de l’exercice 5, puis créez-en un clone. Modifiez certaines caractéristiques de cet objet, et affichez les deux formulaires obtenus.

<?php
include('ch9exo4.php');
class form2 extends form
{
protected $coderadio;
protected $codecase;
public function __construct($action,$titre,$methode="post")
{
parent::__construct($action,$titre,$methode="post");
}
//********************************************
public function setradio($name,$libelle,$value)
{
$this->coderadio.="<b>$libelle</b><input type=\"radio\" name=\"$name\" value=\"$value\"/><br />";
}
//************************************************
public function setcase($name,$libelle,$value)
{
$this->codecase.="<b>$libelle</b><input type=\"checkbox\" name=\"$name\" value=\"$value\" /><br />";
}
//**************************
public function getform()
{
$this->code="";
$this->code.=$this->codeinit;
$this->code.=$this->codetext;
$this->code.=$this->coderadio;
$this->code.=$this->codecase;
$this->code.=$this->codesubmit;
$this->code.="</fieldset></form>";
echo $this->code;
}
}
//***************************
$myform = new form2("traitementb.php","Donnez vos
informations","post");
$myform->settext("nom","Votre nom :  ");
$myform->settext("code","Votre code : ");
$myform->setsubmit();
$myform->getform();
$myclone = clone $myform;
$myclone->settext("truc","Votre truc : ");
$myclone->getform();
?>

	
Voir le résultat

Exercice 7

Créez une classe abstraite représentant une personne. Elle déclare les propriétés nom et prénom et un constructeur. Créez une classe client dérivée de la classe personne en y ajoutant la propriété adresse et une méthode setcoord() qui affiche les coordonnées complètes de la personne. Créez une classe électeur dérivée de la même classe abstraite, et ajoutez-y deux propriétés bureau_de_vote et vote, ainsi qu’une méthode avoter(), qui enregistre si une personne a voté dans la propriété vote. Les propriétés nom et prenom qui sont déclarées private dans la classe abstraite (repères 1 et 2) sont redéfinies comme public dans la classe electeur (repères 3 et 4) car sinon nous ne pourrions pas les lire lors du contrôle du vote( repères 5 et 6) car la classe electeur ne possède pas de méthode getinfo().

<?php
//Classe personne
abstract class personne
{
private $nom;//1
private $prenom;//2
abstract protected function __construct() ;
}
//Classe client
class client extends personne
{
private $adresse;
public function __construct($nom,$prenom,$adresse)
{
$this->nom=$nom;
$this->prenom=$prenom;
$this->adresse=$adresse;
}
public function getcoord()
{
$info="Le client $this->prenom $this->nom habite $this->adresse <br />";
return $info;
}
}
//Classe electeur
class electeur extends personne //
{
public $nom;//3
public $prenom;//4
public $bureau_de_vote;
public $vote;
function __construct($nom,$prenom,$bureau_de_vote)
{
$this->nom=$nom;
$this->prenom=$prenom;
$this->bureau_de_vote=$bureau_de_vote;
}
public function avoter()
{
$this->vote=TRUE;
}
}
//Création d'objets
$client1 = new client("Delmas","Jacquou","Bordeaux");
echo "<h4>", $client1->getcoord()," </h4>";
$electeur1 = new electeur("Tinitin","Milan","Brussel 5");
//L'électeur vote
$electeur1->avoter();
//Controle du vote
if($electeur1->vote)
{echo "L'électeur $electeur1->prenom $electeur1->nom inscrit au
bureau $electeur1->bureau_de_vote a voté <br />";}//5
else
{echo "L'électeur $electeur1->prenom $electeur1->nom inscrit au
bureau $electeur1->bureau_de_vote peut encore voter <br />";}//6
?>

	
Voir le résultat

Exercice 8

Exercice 8 Créez deux namespaces nommés Firme::Client et Firme::Commercial possédant chacun des classes Personne. Chacune d'elles doit avoir des propriétés pour enregistrer les coordonnées de la personne et son code, un constructeur, des méthodes set() et get() pour pouvoir modifier et afficher les propriétés. Créez ensuite des objets représentant deux clients et un commercial.
Création du namespace Firme\Client fichier chap9exo8.php
NB1: la notation est celle de 5.3 antislash \ entre Firme et Client

<?php
namespace Firme\Client;
class Personne 
{ 
	public $nom;
	public $prenom;
	public $adresse;
	public $ville;
	public $code;

	public function __construct($nom,$prenom,$adresse,$ville,$code)
	{
		$this->nom=$nom;
		$this->prenom=$prenom;
		$this->adresse=$adresse;
		$this->ville=$ville;
		$this->code=$code;
	}
    public function set($prop, $val)
	  {
        echo "Affectation de la valeur $val à la propriété $prop <br /> ";
        $this->$prop = $val;
    }
    public function get($prop)
	  {
        return $this->$prop;
    }	
}
?>
Création du namespace Firme\Commercial fichier chap9exo8a.php
<?php
namespace Firme\Commercial;
class Personne 
{ 
	public $nom;
	public $prenom;
	public $adresse;
	public $ville;
	public $code;

	public function __construct($nom,$prenom,$adresse,$ville,$code)
	{
		$this->nom=$nom;
		$this->prenom=$prenom;
		$this->adresse=$adresse;
		$this->ville=$ville;
		$this->code=$code;
	}
    public function set($prop, $val)
	  {
        echo "Affectation de la valeur $val à la propriété $prop 
"; $this->$prop = $val; } public function get($prop) { return $this->$prop; } } ?>
Utilisation des namespaces. fichier chap9exo8b.php
NB : remarquez que les premiers paramètres des méthodes set() et get() sont des chaînes donc entre guillemets.
<?php
require 'chap9exo8.php';
require 'chap9exo8a.php';
echo "<h2>Objets Client</h2>";
use Firme\Client;
$client1 = new Client\Personne("Engels","Jean"," Rue Compoint","75018 Paris",12345);
echo $client1->get("nom"),"  ",$client1->get("prenom"),"<br />";
//ou encore plus simpement, car les propriétés sont déclarées public
echo $client1->nom,"  ",$client1->prenom,"<br />";
$client1->set("code",45678);
echo "Nouveau code : ",$client1->code,"<br />";
$client2 = new Client\Personne("Jacket","Gene"," Rue Gargas","84018 Apt",54367);
echo $client2->get("nom"),"  ",$client2->get("prenom"),"<br />";
//ou encore plus simplement, car les propriétés sont déclarées public
echo $client2->nom,"  ",$client2->prenom,"<br />";
$client2->set("code",12876);
echo "Nouveau code : ",$client2->code,"<br />";
echo "<h2>Objet Commercial</h2>";
use Firme\Commercial;
$comm = new Commercial\Personne("Attin","Bar"," Rue Foch","75016 Paris",98765);
echo $comm->get("nom"),"  ",$comm->get("prenom"),"<br />";
//ou encore plus simpement, car les propriétés sont déclarées public
echo $comm->nom,"  ",$comm->prenom,"<br />";
$comm->set("code",76543);
echo "Nouveau code : ",$comm->code,"<br />";
?>

	
Ce serveur n'utilise pas encore PHP 5.3: testez sur Wampserver en local.

Exercice 9

Intégrez les méthodes magiques connues à au moins une des classes de l'exercice 8 après avoir déclaré la propriété code comme protected.
Création du namespace Firme\Client fichier chap9exo9.php

<?php
namespace Firme\Client;
class Personne 
{ 
	protected $nom;
	public $prenom;
	public $adresse;
	public $ville;
	protected $code;

	public function __construct($nom,$prenom,$adresse,$ville,$code)
	{
		$this->nom=$nom;
		$this->prenom=$prenom;
		$this->adresse=$adresse;
		$this->ville=$ville;
		$this->code=$code;
	}
    public function __set($prop, $val)
	{
        echo "Affectation de la valeur $val à la propriété $prop <br /> ";
        $this->$prop = $val;
    }
    public function __get($prop)
	{
        return $this->$prop;
    }	
}
?>

Création du namespace Firme\Commercial fichier chap9exo9a.php
<?php
namespace Firme\Commercial;
class Personne 
{ 
	public $nom;
	public $prenom;
	public $adresse;
	public $ville;
	protected $code;

	public function __construct($nom,$prenom,$adresse,$ville,$code)
	{
		$this->nom=$nom;
		$this->prenom=$prenom;
		$this->adresse=$adresse;
		$this->ville=$ville;
		$this->code=$code;
	}
    public function __set($prop, $val)
	{
        echo "Affectation de la valeur $val à la propriété $prop <br /> ";
        $this->$prop = $val;
    }
    public function __get($prop)
	{
        return $this->$prop;
    }	
}
?>

Utilisation des namespaces fichier chap9exo9b.php
<?php
require 'chap9exo9.php';
require 'chap9exo9a.php';

echo "<h2>Objets Client</h2>";
use Firme\Client;
$client1 = new Client\Personne("Engels","Jean"," Rue Compoint","75018 Paris",12345);
echo $client1->nom,"  ",$client1->prenom,"<br />";
$client1->code=45678;
echo "Nouveau code : ",$client1->code,"<br />";
$client2 = new Client\Personne("Jacket","Gene"," Rue Gargas","84018 Apt",54367);
echo $client2->nom,"  ",$client2->prenom,"<br />";
$client2->code=12876;
echo "Nouveau code : ",$client2->code,"<br />";
echo "<h2>Objet Commercial</h2>";
use Firme\Commercial;
$comm = new Commercial\Personne("Attin","Bar"," Rue Foch","75016 Paris",98765);
echo $comm->nom,"  ",$comm->prenom,"<br />";
$comm->code=76543;
echo "Nouveau code : ",$comm->code,"<br />";
?>
Ce serveur n'utilise pas encore PHP 5.3: testez sur Wampserver en local.