Situation actuelle : PHP2Shell. Deux failles PHP critiques (CVSS 9.2) permettent d'exécuter du code malveillant sans authentification. Correctifs disponibles depuis le 21 octobre 2026.Ce qu'il faut faire maintenant →

La programmation orientée objet en PHP

Les applications PHP modernes sont presque toujours orientées objet. Cette page explique les briques, les nouveautés de PHP 8.0 à 8.4 et pourquoi les méthodes magiques comptent pour la sécurité.

État 6 min de lectureSavoir PHP

En bref : la programmation orientée objet (POO) regroupe les données et les fonctions correspondantes dans des classes. PHP offre pour cela des classes, des classes abstraites, des interfaces, des traits et, depuis PHP 8.1, des enums. De PHP 8.0 à 8.4, de nombreuses fonctionnalités se sont ajoutées, comme la promotion de constructeur, readonly, les property hooks et la visibilité asymétrique. Pour la sécurité, deux points comptent : un code bien encapsulé est plus facile à contrôler, et les méthodes magiques rendent la désérialisation non sécurisée dangereuse. Contre les failles de l'interpréteur comme PHP2Shell, la POO n'est d'aucune aide.

Ce que signifie la programmation orientée objet en PHP

Au lieu d'utiliser des fonctions isolées et des variables globales, une classe décrit un élément du domaine métier : une commande, un client, une facture. Elle définit les données qui en font partie (propriétés) et ce que l'on peut en faire (méthodes). Un objet est un exemplaire concret de cette classe.

Pour les décideurs, cela a une valeur pratique : un code orienté objet avec des classes claires se teste, se contrôle et se transmet plus facilement à des prestataires. À l'inverse, les anciennes applications PHP composées de nombreux scripts isolés avec des variables globales sont difficiles à maintenir et sujettes aux erreurs lors des mises à niveau.

Une idée centrale est l'encapsulation : une classe n'expose vers l'extérieur que les méthodes dont les autres ont réellement besoin, et protège son état interne. Une commande ne peut alors, par exemple, être marquée comme payée que par une méthode qui vérifie d'abord si c'est bien autorisé. Regrouper de telles règles en un seul endroit est aussi un gain pour la sécurité.

Les briques en un coup d'œil

Brique Rôle Exemple court
Classe plan de construction d'objets avec propriétés et méthodes class Rechnung { ... }
Classe abstraite base commune, non instanciable directement abstract class Zahlart { ... }
Interface contrat : quelles méthodes une classe doit proposer interface Versandfaehig { ... }
Trait méthodes réutilisables pour des classes sans classe parente commune trait MitZeitstempel { ... }
Enum ensemble fixe de valeurs autorisées comme type propre, depuis PHP 8.1 enum Status { case Offen; ... }

Les visibilités (public, protected, private) déterminent qui peut accéder aux propriétés et aux méthodes. Les classes sont organisées en espaces de noms et chargées par un autoloader ; la page Espaces de noms et autoloading montre comment cela fonctionne.

PHP moderne : les nouveautés de 8.0 à 8.4

Les fonctionnalités suivantes sont documentées dans le manuel PHP ou dans les annonces de versions :

Version Nouveauté
8.0 promotion de constructeur, opérateur nullsafe ?->, ::class sur les objets
8.1 propriétés readonly, enums, new dans les initialiseurs, final pour les constantes de classe
8.2 classes readonly ; les propriétés dynamiques sont considérées comme obsolètes
8.3 attribut #[\Override], constantes de classe typées
8.4 property hooks, visibilité asymétrique, new sans parenthèses englobantes

Un exemple qui combine plusieurs de ces moyens :

<?php
declare(strict_types=1);

enum Status: string
{
    case Offen = 'offen';
    case Bezahlt = 'bezahlt';
}

final class Bestellung
{
    public function __construct(
        public readonly int $id,
        public private(set) Status $status = Status::Offen,  // à partir de PHP 8.4
    ) {}

    public function alsBezahltMarkieren(): void
    {
        $this->status = Status::Bezahlt;
    }
}

$b = new Bestellung(42);
$b->alsBezahltMarkieren();
echo $b->status->value;              // bezahlt
$s = Status::tryFrom('storniert');   // null au lieu d'une erreur

readonly empêche de modifier l'ID après la création. private(set) autorise la lecture depuis l'extérieur, mais l'écriture uniquement à l'intérieur de la classe. De telles garanties dans le code rendent moins probables des erreurs qui ne se remarquent sinon qu'en exploitation. Les types sous-jacents sont expliqués sur la page Le système de types de PHP.

Pièges de mise à niveau dans le code orienté objet

Pour les applications anciennes, deux changements sont particulièrement pertinents. Depuis PHP 8.2.0, la création de propriétés dynamiques, c'est-à-dire de propriétés non déclarées dans la classe, est obsolète, sauf si la classe porte l'attribut #[\AllowDynamicProperties]. Le code ancien y recourt souvent sans le savoir et remplit alors les logs de notices. Par ailleurs, selon le manuel, les propriétés typées doivent être initialisées avant la première lecture, faute de quoi PHP lève une Error.

L'attribut #[\Override] de PHP 8.3 est utile : il marque une méthode comme redéfinition d'une méthode parente. Si cette méthode n'existe plus, par exemple après un renommage dans une bibliothèque, PHP signale une erreur au lieu de laisser la méthode tourner à vide en silence. De tels contrôles rendent les mises à niveau plus prévisibles ; pour les anciens projets enlisés, notre migration vers une version de PHP prise en charge vous aide.

Objets et mémoire

En PHP, les objets sont transmis par des identifiants (handles). Si l'on passe un objet à une fonction, celle-ci travaille avec le même objet, non avec une copie. C'est efficace, mais conduit facilement à des références circulaires, par exemple lorsqu'une commande connaît ses lignes et que chaque ligne connaît à son tour sa commande. Le comptage de références seul ne nettoie pas de tels cycles ; PHP dispose pour cela de son propre ramasse-miettes (garbage collector). Les détails figurent sur la page Gestion de la mémoire en PHP.

POO et sécurité : méthodes magiques et désérialisation

PHP connaît des méthodes magiques appelées automatiquement, comme __construct, __destruct, __toString, __get ou __wakeup. C'est pratique, mais cela a un revers : lorsqu'une application retransforme en objets, avec unserialize(), des données externes, un attaquant peut déterminer quelles classes sont créées et ainsi déclencher du code existant dans des méthodes magiques. Le guide Désérialisation non sécurisée en PHP explique comment l'éviter. En résumé : pour l'échange de données, utilisez json_encode() et json_decode(), et n'employez unserialize() que pour des données propres et fiables, idéalement avec l'option allowed_classes.

Face à PHP2Shell, en revanche, un bon code orienté objet n'aide pas. CVE-2026-109618 et CVE-2026-109619 se trouvent dans l'interpréteur, et pour mod_php, selon l'équipe PHP, un exploit a été démontré avant l'exécution du code de l'application. La mise à jour vers PHP 8.5.12, 8.4.27, 8.3.36 ou 8.2.35 et le redémarrage de tous les processus PHP sont obligatoires.

Comment PHP SOS aide-t-il concrètement ?

  • Nous évaluons la structure de votre application et montrons quelles parties compliquent une mise à niveau vers une version de PHP prise en charge.
  • Nous recherchons ciblément les motifs à risque comme unserialize() sur des données externes et les méthodes magiques dangereuses.
  • Nous contrôlons les développements maison dans le cadre d'un audit de sécurité et test d'intrusion.
  • Nous installons la mise à jour de PHP, redémarrons tous les workers et testons ensuite l'application.

Questions fréquentes

PHP est-il un langage orienté objet ?

PHP prend en charge aussi bien le code procédural que le code orienté objet. Aujourd'hui, les frameworks, les cœurs de CMS et les systèmes de boutique sont toutefois majoritairement construits en orienté objet, avec des classes, des interfaces et des espaces de noms.

Quelle est la différence entre une interface et une classe abstraite ?

Une interface décrit uniquement les méthodes qu'une classe doit proposer. Une classe abstraite peut en plus contenir déjà du code et des propriétés, mais ne peut pas être instanciée directement. Une classe peut avoir plusieurs interfaces, mais une seule classe parente.

Depuis quand les enums existent-ils en PHP ?

Les énumérations sont arrivées avec PHP 8.1. Elles remplacent des ensembles de constantes par un type propre, qui n'admet que les cas définis. Les backed enums possèdent en plus une valeur de type int ou string.

Pourquoi les méthodes magiques sont-elles importantes pour la sécurité ?

Des méthodes comme __destruct ou __wakeup sont appelées automatiquement par PHP, par exemple lors de la désérialisation de données. Si des données externes parviennent sans contrôle à unserialize(), cela peut déclencher des enchaînements inattendus dans des classes existantes.

Sources

Contact immédiat

Chaque heure compte. Écrivez-nous maintenant.

Décrivez brièvement votre système, votre version de PHP et ce que vous avez observé. Nous vous répondons, faisons le point et travaillons à distance jusqu'à la clôture et la documentation de l'incident.

Aide immédiate