Un article de Mmmm!!!

PHP Le cote object de la force .

Php est un langage scriptique se voulant etre d'inspiration entre le C , Java, et Perl. Ce langage offre malgres ce "pseudo" héritage C, et perl des possibilités connu des langages dit objet, venant peut etre de Java.
Il est tres difficile en effet de savoir ce que aurait pu etre le fils du trio Monsieur C, Madame Java , et Troisieme laron Perl. Non, ce n'aurait pas ete un etre degenere, qui passe sa vie devant un ecran, se nourrit mal , et cherche le bonheur a travers des bits dans l'espoir de trouver sa candy.( Mais c'est moi ca , désole papa, maman :).

Mais plutot quelqu'un comme PHP.

Mes premier pas vers l'object ( de mes desir :)

Php définit un mot clé permettant de dénifir un object : class Le nom suivant le mot cle class ne doit pas etre un mot cle de la syntaxe php ou une fonction.

Excusez cette énumeration, je pose mes connaissances ainsi. Exemple:
class toto { 
	// Variables de l'objet
	variable $toto;
	[...]
	// Méthodes de l'objet
	// Constructeur
	function toto() {
		}
	[...]
	}
Cependant lorsque vous donnez un nom existant pour php ( nom de fonction ), cela ne marche pas, par exemple :
class dir { 
	[...]
	}
Nous voici avec une classe toto, maintenant comment allons nous faire pour instancier cette object. Hé bien le créateur de php s'est inspirer de java ( ou de C++, ou alors c'est les concepteur de Java qui ont copiés sur le C++ ) et utilise le mot clé new pour cette tache. Donc pour créer une instance de l'objet toto que l'on va mettre dans la variable toto il faut faire :
$toto=new toto();
Php ,d'apres moi distingue la varaible toto de la classe toto par le "$". Cependant php ne distingue pas le nom de la classe toto d'une autre fonction toto.

Test


function toto() {
	echo "function toto";
	}
class toto { 
	function toto() {
		echo "constructeur toto";
		}
	}
Bon voila ce que php nous dit :
Fatal error: toto is already a function or class in testphpobj.php3 on line 5

Cependant ...


function toto() {
	echo "function toto";
	}
class titi { 
	function titi() {
		echo "constructeur titi";
		}
	function toto() {
		echo "methode toto";
		}
	}
He oui , ceci marche sans probleme , Php distingue bien les méthodes d'un object des fonctions. Ce point devait etre précisé pour qu'on y voit plus clair , surtout moi.
J'ai decouvert une chose pour les classes php , vous n'etes pas obligé de déclarer un constructeur.

Des methodes avec des données

Bien, nous avons un object avec une ou plusieurs méthodes, c'est beau , je sais il faut le voir chez soi. Certaine mauvaise langue qui peuvent contradictoirement bien parler le francais, me retorquerons vivement:
Cela a aucun interet, autant faire des fonctions.
A moi de repliquer : Mooonsieur, vous n'etes qu'un procédurier et n'entendez rien à l'Object ainsi qu'a la courtoisie.
La mauvaise langue
Ciel ! Je replique
- Vil camus, sot camard, tête plate, apprenez
Que je m'enorgueillis d'un pareil langage,
Attendu qu'un langage objet est proprement l'indice
D'un langage affable, bon, courtois, spirituel,
Libéral, courageux, tel que je suis, et tel
Qu'il vous est interdit à jamais de vous croire,
Déplorable maraud ! car la face sans gloire
Que va chercher ma main en haut de votre col,
Est aussi dénuée...
Par la tirade complete de la conversation suivez le lien :)
Revenons a notre sujet, bien que je vous invite a visite ce momunent de la culture francaise.
Maintenant ajoutons a notre classe toto, une variable toto , je sais , je ne suis pas tres original.
class toto {
	var $toto; 
	function toto($valeurdetoto) {
		$this->toto=$valeurdetoto;
		}
	}
$toto= new toto("toto");
$titi= new toto("titi");
echo "$toto->toto
"; echo "$titi->toto
";
Nous obtenons:
toto
titi
Vous avez surement remarqué que pour faire appel a une variable d'un classe il faut mettre $this-> lorsque l'on est a l'interieur de l'objet. Que cela soit pour les méthodes et pour les variables.
Pour être clair et pertinent , regardons un petit exemple.
function totonoclass ( ) {
	echo "function totonoclass";
	}
class toto { 
	var $toto;
	function toto($valtoto) {
		$this->toto=$valtoto;
		totonoclass();
		$this->totonoclass();
		}
	function totonoclass ( ) {
		echo "methode totonoclass";
		}
	function testvarlocal($valtoto) {
		$toto=$valtoto;
		}
	}
$toto=new toto("titi");
$toto->testvarlocal("toto");
echo " La variable de l'objet n'est pas change : c'est titi : ".$this->toto;
Le resultat :
function totonoclass
methode totonoclass
La variable de l'objet n'est pas change : c'est titi : titi

On dérive pas du sujet

Bien, nous avons un object, des methodes et des données, mais ceci n'est qu'une partie des avantages de la technologie objet. La question est : Est-ce que l'on peut hériter un autre object php ?
Et la reponse est Oui. ( si vous voulez plus de renseignement sur l'heritage )
Petit essai:
class toto {
	var $toto;
	function toto ($valtoto ) {
		echo "On est dans le constructeur de toto 
\n"; $this->toto=$valtoto; } } class titi extends toto { function titi ($valtiti) { echo "On est dans le constructeur de titi
\n"; $this->toto($valtiti); echo "Est-ce que la variable de l'objet toto est accessible : ".$this->toto; } } $titi=new titi("Oui");
Resultat:
On est dans le constructeur de titi
On est dans le constructeur de toto
Est-ce que la variable de l'objet toto est accessible : Oui
Php a une particularité dans la construction de ces objets, il n'appelle pas automatiquement le constructeur de la classe mere.
For derived classes, the constructor of the parent class is not automatically called when the derived class's constructor is called.
Pour plus d'info sur php object.

Mais est-ce bien virtuel ?

Donc les objets peuvent heriter d'autres objets et apeller les methodes de la classes parentes. Mais comment cela se passe si l'on crée une methode ayant le meme nom qu'une methode de la classe mere, Cela est bien pratique , alors je me questionne et me demande si cela marche en Php. He bien oui , de nouveau une reponse positive : ils ont bien fait les choses me semble -t-il.
Cependant etant donnée que php soit faiblement typé ( un object est de type Object ), est-ce que php considere que toutes les methodes sont virtuelles ou non ? Il m'est difficile d'expliquer simplement le probleme , je prefere vous donner un exemple ; considerons l'exemple suivant:
class toto {
	function toto() {
		} 
	function unemethode() {
		echo "unemethode toto 
\n"; } } class titi extends toto { function titi() { } function unemethode() { echo "unemethode titi
\n"; } } $toto=new toto(); $titi=new titi(); $toto->unemethode(); $titi->unemethode();
Le resultat:
unemethode toto
unemethode titi
Donc ainsi nous avons fait la preuve que les methodes sont virtuelles.

L'object des limitations

Bon, apres vous avoir dit que php etait un langage proposant des facilites objets et que c'etait bien,je ne puis vous cacher les limitations que j'ai découvertes.
  1. Il est impossible de faire un double access aux methodes et variables exemple: $toto->gettoto ()->toto Imposssible :(
  2. Pas de methode prive.
  3. Pas de destructeur
  4. Pas de nessecite de constructeur
  5. Pas d'appel authomatique au constructeur de la classe pere.
  6. Pas d'heritage multiple ( est-ce que c'est un mal :) d'apres la doc officielle (Multiple inheritance is not supported.).
J'ai remarque dans l'exemple ci-dessus que lorsque l'on herite d'une classe , if faut un constructeur ( s'il n'y a pas de constructeur a toto Php Beugle :(.

Exemple d'utilisation


Les exemples et avantages d'utilisation sont multiples:
  1. Pour une base de donnée.
    Php a une API différente pour chaque base de donnee qu'il supporte , par exemple MySql , PostgreSQL . On peut mettre les fonctionnalites base de donnee que l'on souhaite avoir dans un objet. On aura ainsi une maniere unique d'acceder aux base de donnee. En imaginant que vous faites un objet pour acceder a une table, alors cet objet aura toutes les fonctionnalites pour acceder a la base. Si un jour vous souhaitez changer de base de donnee, alors vous n'aurez pas a retoucher les objet correspondant au table , mais seulement l'objet d'access a la base de donnee. Exemple class_bd de Mmmm!!! dans ces sources
    Ceci est possible car php offre des possibilité orienté objet.
  2. Pour la mise en place dans une page HTML. Imaginons un cas pratique. Vos pages dynamique ont toujours la meme tete. Vous y mettez un haut de page, une partie a gauche , une partie a partie, et un base de page. Une solution souple d'apres moi est de faire un objet qui va mettre en page tel qu'il est decrit ci-dessus. Cela est assez semblable au concepte de l'Interface Homme Machine actuel avec les layout Manageur. Evidement l'implementation d'un layout Manager en php/html est plus complexe, mais je pense que l'idee est possible et realisable avec bien sur des restrictions.
    L'objet traitant l'information pour un page donné devra implementer les méthodes , HTMLup, HTMLleft, HTMLright,HTMLbottom soit directement , soit par héritage d'un objet, soit en implementant une methode de la classe mere.
    Quel est l'interet ? L'interet vient de la possibilite de changer la mise en page simplement en changeantuniquementl'objet mettant en page. On pourrais meme imaginer que l'internaute puisse choisir la mise en page qu'il souhaite.
    Ceci est possible car les methodes de Php sont virtuelles.
  3. Etc ...
Le developpement objet nessecite une periode de conception plus importante mais offre une souplesse pour la maintenance du code.

Objectif Liens



Pour tout commentaire, suggestion, et autre recette de cuisine voir bon resto , ecrivez moi.


Merci papageno pour ces corrections nombreuses, et a Etienne GAOUYER pour ces remarques.
L'equipe de Mmmm!!! copyright 2000