Les opérateurs parent et self permettent de faire référence à des membres d'une super-classe et d'une classe.

En fait, l'opérateur parent correspond directement à la super-classe d'une classe ayant héritée de cette dernière.

class super_classe
{
  function fonction()
  {
    echo "Blocs d'instructions de la fonction fonction()"
        . " dans la super-classe.";
  }
}

class nouvelle_classe extends super_classe
{
  function fonction()
  {
    echo "Blocs d'instructions de la fonction fonction()"
        . " dans la nouvelle-classe.";

  // se référe à la fonction fonction() de la super_classe
    parent::fonction();
  }
}

$objet = new nouvelle_classe;

$objet->fonction();

/* retourne :
'Blocs d'instructions de la fonction fonction()
dans la nouvelle-classe.' et
'Blocs d'instructions de la fonction fonction()
dans la super-classe.' */

L'opérateur parent se révèle particulièrement utile lorsqu'une classe consiste en une spécialisation d'une classe générique.

L'opérateur self désigne quant à lui la classe courante. Ainsi, les membres statiques ou constants de la classe courante peuvent être accédés sans ambiguités, notamment si cette classe est dérivée d'une autre.

class super_classe
{
  const CONSTANTE = "VALEUR CONSTANTE";
  static $variable = "valeur statique";
  function fonction()
  {
    echo 'Constante : ' self::CONSTANTE 
       . '\nVariable de classe : ' . self::$variable;
  }
}

Dans le cas où une classe étendue redéfinit des méthodes de la super-classe, les méthodes de cette dernière ne seront pas invoquées par PHP. Il est donc nécessaire d'appeler les méthodes d'origines si besoin est, à partir des méthodes redéfinies au sein de la sous-classe.

De la même façon que précité, il faudra envisager ce genre d'invocation (avec self ou parent) lors de surcharges de méthodes d'une classe, de définitions des constructeurs et destructeurs et de la redéfinition des méthodes magiques (__toString(), __sleep(), __wakeup(), __clone(), __construct(), __destruct(), __call(), __get() et __set()).

Exemple [voir]
<html>
<body>
<?php
class Chaine {
   public $valeur;
   public $date;
   public function __construct(){
      $this->valeur = func_get_arg(0);
      $this->date = date(Personne::MASQUE_DATE);
   }
   public function set($valeur){
      $this->valeur = $valeur;
   }
   public function get(){
      return $this->valeur;
   }
   public function __toString(){
     return '[' . $this->valeur . ']';
   }
}
class Personne {
   const MASQUE_DATE = 'd M Y H:i:s';
   static $compteur;
   private $date_inscription;
   private $date_modification;
   private $id;
   private $civilite;
   private $nom;
   private $prenom;
   private $adresse;
   private $telephone;
   public function __construct(
                            $civilite,
                            $nom,
                            $prenom,
                            $adresse,
                            $telephone){
      $this->date_inscription = new Chaine(date(self::MASQUE_DATE));
      $this->civilite = new Chaine($civilite);
      $this->nom = new Chaine($nom);
      $this->prenom = new Chaine($prenom);
      $this->adresse = new Chaine($adresse);
      $this->telephone = new Chaine($telephone);
      $this->date_modification = new Chaine($this->date_inscription->get());
      $this->idModif();
   }
   
   public function __toString(){
    return '[' . $this->civilite->get() . ', '
               . $this->nom->get() . ', '
               . $this->prenom->get() . ', '
               . $this->adresse->get() . ', '
               . $this->telephone->get() . ', '
               . $this->date_inscription->get() . ', '
               . $this->date_modification->get() . ', '
               . $this->id->get() . ']';
   }
   public function setNom($nom){
      $this->nom->set($nom);
      $this->dateModif();
      $this->idModif();
   }
   public function setPrenom($prenom){
      $this->prenom->set($prenom);
      $this->dateModif();
      $this->idModif();
   }
   public function setAdresse($adresse){
      $this->adresse->set($adresse);
      $this->dateModif();
   }
   public function setTelephone($telephone){
      $this->telephone->set($telephone);
      $this->dateModif();
   }
   private function dateModif(){
      $this->date_modification->set(date(self::MASQUE_DATE));
   }
   private function idModif(){
      $this->id = new Chaine(self::$compteur++ . date('dmy') 
                           . '.' . $this->nom->get() 
                           . '_' . substr($this->prenom, 0, 1));
   }

   public function __clone(){
      $this->date_inscription = new Chaine(date(self::MASQUE_DATE));
      $this->civilite = new Chaine($this->civilite->get());
      $this->nom = new Chaine($this->nom->get());
      $this->prenom = new Chaine($this->prenom->get());
      $this->adresse = new Chaine($this->adresse->get());
      $this->telephone = new Chaine($this->telephone->get());
      $this->date_modification = new Chaine($this->date_inscription->get());
      $this->idModif();
   }
}
class Employe extends Personne {
   public $specialite;
   public $service;
   public $date_embauche;
   public function __construct($civilite,
                              $nom,
                              $prenom,
                              $adresse,
                              $telephone,
                              $specialite,
                              $service){
      parent::__construct($civilite,
                          $nom,
                          $prenom,
                          $adresse,
                          $telephone);
      $this->specialite = new Chaine($specialite);
      $this->service = new Chaine($service);
      $this->date_embauche = new Chaine(date(parent::MASQUE_DATE));
   }
   public function __toString(){
      return '[' . parent::__toString() .', '
                 . $this->specialite->get() . ', '
                 . $this->service->get() . ', '
                 . $this->date_embauche->get() . ']';
   }
}
$personne = new Personne(
                     'Madame', 
                     'Waldec', 
                     'Anne', 
                     '75 rue Belleville 75010 Paris', 
                     '0142152432');

$employe = new Employe(
                     'Madame', 
                     'Waldec', 
                     'Anne', 
                     '75 rue Belleville 75010 Paris', 
                     '0142152432',
                     'Analyste/programmeur',
                     'Recherche et développement');

echo 'Personne : ';
echo $personne;
echo '<br/>';
echo 'Employée : ';
echo $employe;
?>
</body>
</html>