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.

Avertissement

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.

Attention

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.

Attention

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.

Attention

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.