Quand utiliser self ou $this ? On éclaircit tout une fois pour toutes
\n\nSi vous avez déjà codé en PHP en orienté objet, vous vous êtes sûrement demandé : « Mais lequel choisir entre self et $this ? ». Cette question est si courante qu’elle cumule des dizaines de milliers de vues sur Stack Overflow, avec des centaines de commentaires. Et ce n’est pas un hasard : la différence entre les deux fait partie de ces « petits détails » qui peuvent rendre votre code fonctionnel mais obscur, ou au contraire élégant et limpide.
Commençons par une évidence : ces deux notions ne sont pas interchangeables. Elles reposent sur des philosophies différentes et, surtout, se comportent différemment avec l’héritage. Si vous utilisez $this là où il faudrait self, ou l’inverse, vous risquez des bugs logiques difficiles à débusquer.
Dans cet article, on vous explique tout en détail : des bases aux scénarios avancés. C’est parti !
\n\n\n\n
Réponse rapide (pour ceux qui sont pressés)
\n\nSi vous ne retenez qu’une seule règle, retenez celle-ci :
\n\n- \n
$this->— pour accéder aux propriétés et méthodes d’instance (de l’objet). Utilisable uniquement dans un contexte non statique. \n self::— pour accéder aux propriétés et méthodes statiques de la classe. Fonctionne aussi bien en contexte statique que non statique. \n static::— pour la « liaison statique tardive » (Late Static Binding). À utiliser quand une classe enfant doit redéfinir le comportement de la classe parente. \n
Mais comme toujours, le diable se cache dans les détails. Allons plus loin.
\n\nQu’est-ce que $this ?
\n\n$this est une pseudo-variable qui fait référence à l’objet courant. Elle n’est disponible qu’à l’intérieur des méthodes non statiques d’une classe et pointe vers l’instance avec laquelle vous travaillez.
<?php\n\nclass User {\n public string $name;\n\n public function setName(string $name): void {\n $this->name = $name; // on accède à la propriété de l’objet courant\n }\n\n public function getName(): string {\n return $this->name;\n }\n}\n\n$user = new User();\n$user->setName('Marie');\necho $user->getName(); // Marie\n\nSimple : $this->name signifie « prends la propriété name de l’objet qui a appelé cette méthode ».
Qu’est-ce que self ?
\n\nself est une référence à la classe courante, et non à un objet. Il sert à accéder aux membres statiques d’une classe (propriétés et méthodes déclarées avec le mot-clé static).
<?php\n\nclass Config {\n public static string $appName = 'PythonLib';\n\n public static function getAppName(): string {\n return self::$appName; // on accède à la propriété statique de la classe\n }\n}\n\necho Config::getAppName(); // PythonLib\n\nNotez bien : self fait toujours référence à la classe dans laquelle il est écrit. Même si vous créez une classe enfant, self dans la classe parente continuera de pointer vers le parent. C’est une différence cruciale avec static.
La différence clé : self vs $this avec l’héritage
\n\nC’est là que les choses deviennent intéressantes. Imaginez une classe de base Animal et une classe enfant Chien.
<?php\n\nclass Animal {\n public static function quiSuisJe(): string {\n return 'Je suis un animal';\n }\n\n public function dire(): string {\n // On utilise self — il est lié à la classe Animal\n return self::quiSuisJe();\n }\n}\n\nclass Chien extends Animal {\n public static function quiSuisJe(): string {\n return 'Je suis un chien';\n }\n}\n\n$chien = new Chien();\necho $chien->dire(); // Je suis un animal