Les classes : class
Une classe est une collection de variables et de fonctions qui fonctionnent avec ces variables. Les variables sont d�finies par l'�l�ment var et les fonctions par function. Une classe est d�finie en utilisant la syntaxe suivante :
<?php
class Panier {
// El�ments de notre panier
var $items;
// Ajout de $num articles de type $artnr au panier
function add_item($artnr, $num) {
$this->items[$artnr] += $num;
}
// Suppression de $num articles du type $artnr du panier
function remove_item($artnr, $num) {
if ($this->items[$artnr] > $num) {
$this->items[$artnr] -= $num;
return true;
} elseif ($this->items[$artnr] == $num) {
unset($this->items[$artnr]);
return true;
} else {
return false;
}
}
}
?>
L'exemple ci-dessus d�finit la classe Panier qui est compos�e d'un tableau associatif contenant les articles du panier et de deux fonctions, une pour ajouter et une pour enlever des �l�ments au panier.
Vous NE POUVEZ PAS couper la d�finition d'une classe en plusieurs fichiers. De la m�me fa�on, vous NE POUVEZ PAS couper la d�finition d'une classe en de multiples blocs, � moins que la coupure ne soit � l'int�rieur de la d�claration d'une m�thode. Ce qui suit ne fonctionnera pas :
<?php
class test {
?>
<?php
function test() {
print 'OK';
}
}
?>
N�anmoins, ce qui suit est autoris� :
<?php
class test {
function test() {
?>
<?php
print 'OK';
}
}
?>
Les notes suivantes ne sont valables que pour PHP 4.
Le nom stdClass est utilis� en interne par Zend et ne doit pas �tre utilis�. Vous ne pouvez pas nommer une classe stdClass en PHP.
Les noms de fonctions __sleep et __wakeup sont magiques en PHP. Vous ne pouvez pas utiliser ces noms de fonctions dans vos classes, � moins que vous ne souhaitiez utiliser la magie qui y est associ�e.
PHP se r�serve l'usage de tous les noms de fonctions commen�ant par __, pour sa propre magie. Il est vivement recommand� de ne pas utiliser des noms de fonctions commen�ant par __, � moins que vous ne souhaitiez utiliser la magie qui y est associ�e.
En PHP 4, seuls les initialiseurs constants pour les variables var sont autoris�s. Utilisez les constructeurs pour les initialisations variables, ou utilisant des expressions.
<?php
/* Aucune de ces syntaxes ne fonctionnera en PHP 4 */
class Panier {
var $date_du_jour = date("d/m/Y");
var $name = $firstname;
var $owner = 'Fred ' . 'Jones';
var $items = array("DVD", "T�l�","Magn�toscope");
}
/* Voici comment cela doit se faire d�sormais. */
class Panier {
var $date_du_jour;
var $name;
var $owner;
var $items;
function Panier() {
$this->date_du_jour = date("d/m/Y");
$this->name = $GLOBALS['firstname'];
/* etc. */
}
}
?>
Les classes forment un type de variable. Pour cr�er une variable du type d�sir�, vous devez utiliser l'op�rateur new.
<?php
$cart = new Panier;
$cart->add_item("10", 1);
$another_cart = new Panier;
$another_cart->add_item("0815", 3);
?>
L'instruction ci-dessus cr�e l'objet $cart et $another_cart de la classe Panier. La fonction add_idem() de l'objet $cart est appel�e afin d'ajouter l'article num�ro 10 dans $cart. Trois articles num�ro 0815 sont ajout�s au panier $another_cart.
$cart et $another_cart disposent des fonctions add_item(), remove_item() et de la variable items. Ce sont des fonctions et variables distinctes. Vous pouvez vous repr�senter les objets comme des dossiers sur votre disque dur. Vous pouvez avoir deux fichiers lisez-moi.txt sur votre disque dur, tant qu'ils ne sont pas dans le m�me r�pertoire. De m�me que vous devez alors taper le chemin complet jusqu'au fichier, vous devez sp�cifier le nom complet de la m�thode avant de l'employer : en termes PHP, le dossier racine est l'espace de nom global, et le s�parateur de dossier est ->. Par exemple, les noms $cart->items et $another_cart->items repr�sentent deux variables distinctes. Notez que le nom de la variable est alors $cart->items, et non pas $cart->$items : il n'y a qu'un seul signe $ dans un nom de variable.
<?php
// correct, le signe $ est unique
$cart->items = array("10" => 1);
// incorrect, car $cart->$items devient $cart->""
$cart->$items = array("10" => 1);
// correct, mais risque de ne pas se comporter comme pr�vu
// $cart->$myvar devient $cart->items
$myvar = 'items';
$cart->$myvar = array("10" => 1);
?>
� l'int�rieur d'une d�finition de classe, vous ne savez pas le nom de la variable � partir duquel l'objet sera accessible dans le script. On ne peut pr�voir que l'objet cr�� sera affect� � la variable $cart, $another_cart ou quelque chose d'autres. Donc, vous ne pouvez pas utiliser la syntaxe $cart->items. Mais pour pouvoir acc�der aux m�thodes et membres d'un objet, vous pouvez utiliser la variable sp�ciale $this, qui peut s'interpr�ter comme "moi-m�me", ou bien "l'objet courant". Par exemple, '$this->items[$artnr] += $num' peut se lire comme 'ajouter $num au compteur $artnr de mon propre tableau de compteur' ou bien 'ajouter $num au compteur $artnr du tableau de compteurs de l'objet courant'.
Note: La pseudo-variable $this n'est pas toujours d�finie si la m�thode dans laquelle elle est pr�sente est appel�e statiquement. Cependant, ceci n'est pas une r�gle stricte : $this est d�finie si une m�thode est appel�e statiquement depuis un autre objet. Dans ce cas, la valeur de $this vaut l'objet appel�. Ce comportement est illustr� dans l'exemple ci-dessous :
<?php
class A
{
function foo()
{
if (isset($this)) {
echo '$this est d�fini (';
echo get_class($this);
echo ")\n";
} else {
echo "\$this n'est pas d�fini.\n";
}
}
}
class B
{
function bar()
{
A::foo();
}
}
$a = new A();
$a->foo();
A::foo();
$b = new B();
$b->bar();
B::bar();
?>L'exemple ci-dessus va afficher :
$this est d�fini (a) $this n'est pas d�fini. $this est d�fini (b) $this n'est pas d�fini.
Note: Il y a des fonctions tr�s pratiques pour g�rer les classes et objets. Vous pouvez �tudier le chapitre sur les fonctions de classes et objets.