Opérateur ::parent
<?php
trait t {
const parent = parent::class;
const grandparent = self::parent::class;
}
class x {
use t; // valid but just don't even think about using x::parent,
}
class y extends x {
use t;
}
class z extends y {
}
echo y::parent; // x
echo z::parent; // y
PHP fournit l’opérateur X::class pour accéder au nom pleinement qualifié d’une classe. Pour obtenir la classe parente, il faut utiliser la fonction native get_parent_class(). Ne serait-il pas pratique d’avoir le même opérateur ?
Pour construire cet opérateur, on utilisera un trait spécial t : il définit une constante construite avec parent::class. Cet opérateur est l’inverse de ce dont on a besoin, mais c’est la seule situation où on l’utilise. Notez que parent est un nom valide de constante ou de méthode.
Notez également que les versions récentes de PHP n’acceptent pas un appel direct à un trait, il n’est donc pas possible d’appeler t::parent, qui n’a pas de parent.
L’opérateur ::parent sera sensible à la casse. La version insensible à la casse de cet opérateur est laissée en exercice au lecteur.
À partir de là, toute classe ayant besoin d’utiliser ::parent doit faire use t;. Il est possible d’utiliser ce trait dans n’importe quelle classe, mais évitez d’appeler l’opérateur ::parent sur des classes qui n’ont pas de parents.
L’astuce ici est que z::parent appelle en réalité la classe du trait, qui, à son tour, utilise la classe relative parent. Même parent::parent fonctionne, le premier étant le mot-clé et le second la constante.
Assurez-vous que chaque classe fait use t, car toute classe non configurée déléguera l’exécution à son propre parent et retournera… une valeur incorrecte.
Après ::parent, l’opérateur ::grandparent, basé sur la même stratégie, était tentant, et… essayé ! Malheureusement, const grandparent = self::parent::parent; produit une erreur (expression)::class cannot be used in constant expressions, même lorsqu’il n’est pas utilisé.
See Also
- ::parent operator [Try me]
PHP Error Messages
PHP Features
Last updated: 11 October 2026