Complément sur les objets en PHP(5)
exemple
function testArgs($i,$j="truc"){
echo "testing testArg($i, $j): ";
echo "num args = ".func_num_args()."
";
print_r($i);
echo " ";
print_r($j);
echo " - > args2 = ".func_get_arg(2);
echo "
";
}
testArgs();
testArgs(1);
testArgs(1,"o");
testArgs(1,"o","t");
Donne :
testing testArg(, truc): num args = 0
truc - > args2 =
testing testArg(1, truc): num args = 1
1 truc - > args2 =
testing testArg(1, o): num args = 2
1 o - > args2 =
testing testArg(1, o): num args = 3
1 o - > args2 = t
Modèle de programmation: passage des paramètres
Les objets : encapsulation
-
On regroupe dans la même entité
des données structurées et les
fonctions qui les manipulent
-
Les données sont généralement appelées attributs et les procédures de traitement sont appelées méthodes
-
Idéalement, pour accéder aux données on passe par les méthodes => notion d interface : isoler l implémentation d un objet à la manière d un type de donnée abstrait
-
Deux modèles coexistent PHP4 (deprecated) et PHP5 (meilleures performances et modèle plus riche)
Exemples
class Voiture
{
private $nb_tour = 5;
private $rayonRoue = 0.2;
public function getSpeed(){
return $this->nb_tour * $this->rayonRoue * 2 * M_PI;
}
}
$v = new Voiture();
echo "vitesse voiture = ".$v->getSpeed(); //affichera :vitesse voiture = 6.28318530718
Modèle à héritage de classe
- Le type d un objet est défini par une classe (description d un objet : attributs et méthodes)
déclaration :
[abstract|final] class Nom [extends ClasseMère]
[implements Interface[, Interface]]
{
//déclaration d un attribut
[public|protected|private] [static] $att [= valeur];
//déclaration d une constante
const NOM = valeur ;
//déclaration d une méthode
[public|protected|private] [abstract|final] [static]
function f(args..)[ { ... } | ;]
}
- La classe est une usine à objets et peut posséder des attributs partagés entre toutes les instances
heritage, implantation
- final : sur la classe empêche l'extension sur une méthode empêche
la redéfinition
- abstract : si il existe au moins une methode abstraite (non
implantée). Une classe abstraite ne peut être instanciée.
- extends : dit de qui on hérite
- implements : liste les interface que l'on doit implanter
- static:
variables ou méthodes de classe
visibilité
- public : utilisable par tous
- protected : limité à la classe et ses héritiers
- private : limité à la classe
Mots clés et variables réservées (méthodes)
Référence à un objet
Gestion de la mémoire et objets
Les modificateurs d accès
-
private : l'attribut (resp. la méthode) n est visible qu à l intérieur de la classe (pas d étanchéité entre instances).
-
protected : l'attribut (resp. la méthode) n est visible qu à l intérieur de la classe et dans les classes dérivées.
-
public : l'attribut (resp. la méthode) appartient à l interface utilisateur de la classe, ce sont les seuls éléments visibles pour un utilisateur (extérieur) de la classe. C'est l'accès par défaut => le mot clé public est optionnel
-
En cas de redéfinition, on ne peut pas restreindre l accessibilité
(exemple
public -> private
)
Réutilisation de code : héritage
- Caractéristique d un langage OO ; mécanisme de réutilisation et de spécialisation
- Héritage simple en PHP (arborescences de classes)
- redéfinition de méthodes dans les classes filles et à travers la fonction magique __call .
- pas de redéfinition des variables
- mise en uvre avec le mot clé extends
- référence à la classe parente avec le mot clé parent (réutilisation)
PHP5, Comparaison d'objets: ==, ===
-
l'opérateur de comparaison == compare les objets de manière "classique" : 2 objets sont égaux s'ils ont les mêmes attributs avec les mêmes valeurs, et s'ils sont des instances de la même classe.
-
L utilisation de l'opérateur d'identité === compare les références :il retourne TRUE si les références sont égales i.e. si elles font référence à un même objet en mémoire centrale.
Clonage
-
Pour copier un objet on utilise le mot-clé clone
$copy = clone $obj;
ou
$copy = clone($obj);
-
ATTENTION : clone effectue une copie
superficielle de toutes les propriétés de l'objet.
Tous les attributs qui sont des références à d'autres variables
demeureront des références.
Si une méthode magique
__clone()
est définie dans la
classe alors la méthode __clone() du nouvel objet sera appelée pour permettre à chaque propriété qui doit l'être d'être modifiée.
Sérialisation
-
C est la possibilité de transformer un objet PHP dans un format structuré ou non
-
Solution simple : transformation en chaîne de caractères à l aide de
la fonction magique __tostring (appelée au moment de la conversion en
chaîne de caractères)
-
Solution préférable on utilise les fonctions serialize() et
unserialize().
- Qui invoquent les fonctions magiques __sleep et __wakeup qui disposent d implantation par défaut.
Sérialisation
-
__sleep : permet de préciser les attributs à sérialiser. La fonction serialize() vérifie si la classe implémente __sleep. Si c'est le cas, elle l'exécute avant toute linéarisation. Elle peut nettoyer l'objet et elle retourne un tableau avec les noms de toutes les variables de l'objet qui doivent être linéarisées.
-
Le but de __sleep est aussi de fermer toutes les connexions aux bases de données que l'objet peut avoir ouverte, de valider les données en attente ou d'effectuer des tâches de nettoyage. Cette fonction est utile pour les très gros objets qui n'ont pas besoin d'être sauvegardés en totalité.
Déserialisation
-
__wakeup(), si définie, est appelée après dé-sérialisation pour
recréer les attributs qui n'ont pas été sérialisés. La fonction
unserialize() vérifie la présence d'une fonction magique __wakeup dans
la définition de la classe. Si elle est présente, cette fonction
permet de reconstruire toutes les ressources que l'objet possède. Le
but de __wakeup est aussi de rétablir toute connexion à une base de
données qui aurait été perdue durant la linéarisation et d'effectuer
les tâches de réinitialisation.
Le chargement automatique
-
PHP permet le chargement automatique de classes à la demande (équivalent des class loader en Java par exemple)
-
L interprète PHP gère une pile de fonctions, dites de chargement automatique qui sont appelées successivement lorsqu une une classe est manipulée par un programme alors que celle-ci n a pas encore été définie
-
une fonction de chargement automatique est une fonction PHP écrite par le développeur d application lui permettant de charger à la demande un fichier contenant la définition d une classe non encore définie. Cette fonction reçoit comme argument le nom de la classe. En éventuel second paramètre fixe les extensions de fichiers à considérer
Le chargement automatique
<
Introspection
-
D autres outils : getFileName, isInternal, isUserDefined, getStartLine, getEndLines, getDocComment,
-
ReflectionProperty : cette classe permet de manipuler un attribut
d une classe. getName, getValue, isPublic, isProtected,
-
RelflectionMethod : cette classe permet de manipuler une méthode d une classe. isPublic, isPrivate, isStatic, isFinal, isAbstract, isConstructor, invoke,