Le modificateur final est utilisé pour éviter une extension des classes ou un héritage des méthodes.

Lorsque le modificateur final apparaît dans une déclaration de classe, cela signifie que la classe ne peut être étendue.

final class NomClasse {
   //...
}
//ClasseEtendue ne peut hériter de NomClasse
class ClasseEtendue extends NomClasse {
   //...
}

Une méthode portant le modificateur final ne peut pas être remplacée dans une sous-classe.

class NomClasse {
   public final function methodeFinale() {
      //...
   }
   public function autreMethode() {
      //...
   }
}

class ClasseEtendue extends NomClasse {
   public function methode() {
      //methodeFinale() ne peut être héritée de NomClasse
      parent::methodeFinale();
      //autreMethode() peut être héritée de NomClasse
      parent::autreMethode();
   }
   //...
}

En outre, une méthode finale pourra être optimisée par le compilateur, puisqu'elle ne peut être sous-classée.

Par ailleurs, les méthodes déclarées avec le modificateur static ou private sont implicitement finales.