N'utilise jamais le mot-clé global, il est dangereux et assez mal-aimé dans le milieu « professionnel » PHP. Il relève plus d'une bidouille que d'une réelle structure organisée et pensée. Il sert à rendre toutes les données accessibles depuis partout dans le script (et même depuis l'« extérieur »).
D'ailleurs, les mots-clés parent et global n'ont rien en rapport. Quand tu déclares deux méthodes qui ont le même prototype (on parle aussi de profil ou de signature — i.e. même nom, même nombre d'argument etc., mais pas même corps, ça ne rentre pas en compte —) dans une classe A et B (où A hérite de B), et que tu te places dans A, alors, si tu utilises le mot-clé $this, il appellera la dernière méthode déclarée (on parle aussi de pile d'accès, mais on va simplifier). Si tu veux utiliser la méthode supérieure, on utilise le mot-clé parent car elle est forcément placée dans le parent. Un exemple :
class B {
public function maMethode ( ) { }
}
class A extends B {
public function maMethode ( ) { }
public function test ( ) {
// on appelle maMethode de cette classe.
$this->maMethode();
// on appelle maMethode de la classe parente.
parent::maMethode();
}
} Maintenant, si on utilise des méthodes statiques, on n'utilisera pas le mot-clé this mais self. Pourquoi ?Il faut comprendre que si tu déclares une donnée comme statique, elle n'appartient pas à l'objet mais à la classe. Le mot-clé this fait référence (et c'est pas peu dire) à l'objet lui-même. Le soucis, c'est qu'on ne veut pas appeler l'objet mais la classe, on utilise donc un autre mot-clé : self.
Le cas de parent maintenant. Tu t'es peut-être rendu compte que this peut appeler les méthodes des parents, si et seulement si ces méthodes ne sont pas définies dans la classe fille (là où on travaille). Par exemple si maMethode() était définie dans B mais pas dans A, si on appelle $this->maMethode() depuis A, on appellera maMethode dans B, logique, elle appartient à l'objet, et l'objet est un tout (fille, parent etc.), c'est une grande et belle famille (talala tala …). Impossible donc de faire la différence entre la classe fille et ses parents avec this. On utilise donc parent qui s'utilise comme un mot-clé statique mais qui n'en a pas vraiment le comportement.
this s'utilise dans un contexte objet, self dans un contexte statique, et parent dans les deux contextes. Ça se comprend bien, mais c'est un peu compliqué, on n'entrera pas dans les détails ce soir (déjà parce que je suis naze, que j'ai faim, et que j'ai encore du boulot
Utiliser une classe statique, c'est sympa, mais pas toujours. Si D a besoin d'être instancier pour son bon fonctionnement, sache qu'il existe un design pattern qui porte le doux petit nom de Singleton (même notion qu'en Mathématiques, i.e. une instance unique d'un objet). En fait, la classe contient sa propre instance et ne peut pas s'instancier sans passer par une méthode statique.
On a quelque chose du genre :
class Singleton {
// Notre instance.
// Elle est privée et appartient à la classe.
private static $_instance = null;
// Notre constructeur est privée, pas d'instance possible.
private function __construct ( ) {
echo 'Je suis construit !';
}
// La méthode qui permet de récupérer l'instance.
// Elle est statique et public.
public static function getInstance ( ) {
if(null === self::$_instance)
self::$_instance = new self();
return self::$_instance;
}
} À l'utilisation, on comprend vite qu'il faut toujours appeler la méthode getInstance pour obtenir l'instance, mais il n'existera qu'une seule et unique instance de l'objet. C'est très pratique dans des situations assez connues (connexion vers des bases de données par exemple).Voilà, j'espère avoir répondu suffisamment à ta question, dis moi si je n'ai pas été clair ou assez complet