Une définition de classe basique commence par le mot-clé class, suivi par le nom de la classe. Suit une paire d'accolades contenant la définition des propriétés et des méthodes.
Le nom de la classe peut être quelconque à condition que ce ne soit pas un mot réservé en PHP. Un nom de classe valide commence par une lettre ou un underscore, suivit de nombres ou de lettres ou d'underscores. Si on devait l'exprimer sous forme d'expression régulière, il s'agirait de [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*.
Une classe peut contenir ses propres constants, variables (appelées "propriétés"), et fonctions (appelées "méthodes").
Exemple #1 Définition typique d'une classe
<?php
class SimpleClass
{
// déclaration des propriétés
public $var = 'a default value';
// déclaration des méthodes
public function displayVar() {
echo $this->var;
}
}
?>
Une pseudo-variable $this est disponible lorsqu'une méthode est appelée depuis un contexte objet. $this est une référence à l'objet appelé (habituellement, l'objet auquel la méthode appartient, mais ce peut être un autre objet si la méthode est appelée de manière statique depuis le contexte d'un autre objet).
Exemple #2 Quelques exemples de la pseudo-variable $this
<?php
class A
{
function toto()
{
if (isset($this)) {
echo '$this est définie (';
echo get_class($this);
echo ")\n";
} else {
echo "\$this n'est pas définie.\n";
}
}
}
class B
{
function titi()
{
// Note: la ligne suivante émet une erreur si E_STRICT est activé.
A::toto();
}
}
$a = new A();
$a->toto();
// Note: la ligne suivante émet une erreur si E_STRICT est activé.
A::toto();
$b = new B();
$b->titi();
// Note: la ligne suivante émet une erreur si E_STRICT est activé.
B::titi();
?>
L'exemple ci-dessus va afficher :
$this est définie (A) $this n'est pas définie. $this est définie (B) $this n'est pas définie.
Pour créer une instance d'une classe, un nouvel objet doit être créé et assigné à une variable. Un objet doit toujours être assigné lors de la création d'un nouvel objet à moins qu'il ait un constructeur défini qui lance une exception en cas d'erreur. Les classes doivent être définies avant l'instanciation (dans certains cas, c'est impératif).
Exemple #3 Création d'une instance
<?php
$instance = new SimpleClass();
// Ceci peut également être réalisé avec une variable :
$className = 'Foo';
$instance = new $className(); // Foo()
?>
Dans le contexte de la classe, il est possible de créer un nouvel objet avec new self et new parent.
Lors de l'assignation d'une instance déjà créée d'une classe à une variable, la nouvelle variable accédera à la même instance de l'objet assigné. Ce comportement est le même que lors du passage d'une instance à une fonction. Une copie d'un objet déjà créé peut être effectuée par clonage.
Exemple #4 Assignation d'un objet
<?php
$instance = new SimpleClass();
$assigned = $instance;
$reference =& $instance;
$instance->var = '$assigned aura cette valeur';
$instance = null; // $instance et $reference deviennent null
var_dump($instance);
var_dump($reference);
var_dump($assigned);
?>
L'exemple ci-dessus va afficher :
NULL NULL object(SimpleClass)#1 (1) { ["var"]=> string(30) "$assigned aura cette valeur" }
Une classe peut hériter des méthodes et des membres d'une autre classe en utilisant le mot-clé extends dans la déclaration. Il n'est pas possible d'étendre de multiples classes : une classe peut uniquement hériter d'une seule classe de base.
Les méthodes et membres hérités peuvent être surchargés en les redéclarant avec le même nom que dans la classe parente. Cependant, si la classe parente a défini la méthode comme final, alors celle-ci ne sera pas surchargeable. Il est possible d'accéder à une méthode ou un membre statique avec l'opérateur parent::
Lors de la surcharge de méthodes, la signature devrait rester la même sinon PHP génèrera une erreur de niveau E_STRICT. Ceci ne s'applique pas au constructeur, qui accepte la surcharge avec des paramètres différents.
Exemple #5 Héritage d'une classe simple
<?php
class ExtendClass extends SimpleClass
{
// Redéfinition de la méthode parent
function displayVar()
{
echo "Classe étendue\n";
parent::displayVar();
}
}
$extended = new ExtendClass();
$extended->displayVar();
?>
L'exemple ci-dessus va afficher :
Classe étendue une valeur par défaut