Comment réussir un entretien PHP : les questions de niveau avancé
L'entretien pour un poste de développeur Senior PHP ne se limite pas à une simple vérification de la syntaxe. L'employeur évalue la pensée architecturale, la compréhension du fonctionnement interne du langage, l'expérience avec les systèmes à forte charge et la connaissance des normes modernes. Dans cet article, nous analyserons les questions clés de niveau avancé avec des exemples pratiques qui vous aideront à réussir votre entretien technique en toute confiance.
1. SOLID en PHP : principes et exemples de violations
La question sur SOLID est un classique de tout entretien. Il est important non seulement d'énumérer les principes, mais aussi de montrer comment leur violation entraîne des problèmes et comment les corriger.
Principe de responsabilité unique (SRP). Une classe ne doit avoir qu'une seule raison de changer. Considérons une violation typique :
class User { public function save() { /* sauvegarde en BDD */ } public function sendEmail() { /* envoi d'email */ } public function generateReport() { /* génération de rapport */ }}Ici, la classe User est responsable à la fois de la sauvegarde, des notifications et des rapports. La bonne approche consiste à extraire chaque responsabilité dans un service séparé :
class UserRepository { public function save(User $user) { /* ... */ }}
class MailService { public function sendWelcomeEmail(User $user) { /* ... */ }}
class ReportGenerator { public function generate(User $user) { /* ... */ }}Principe d'ouverture/fermeture (OCP). Les classes doivent être ouvertes à l'extension, mais fermées à la modification. Au lieu de if-else, utilisez le polymorphisme :
// Violation de l'OCPclass PaymentProcessor { public function pay(string $type) { if ($type === 'credit_card') { /* ... */ } elseif ($type === 'paypal') { /* ... */ } }}
// Solution correcteinterface PaymentMethod { public function process();}
class CreditCardPayment implements PaymentMethod { public function process() { /* ... */ }}
class PayPalPayment implements PaymentMethod { public function process() { /* ... */ }}
class PaymentProcessor { public function pay(PaymentMethod $method) { $method->process(); }}Lors de l'entretien, mentionnez impérativement que pour PHP, le principe d'inversion des dépendances (DIP) est également important — dépendre des abstractions, et non des classes concrètes. Montrez un exemple avec l'injection de dépendances :
class OrderService { private PaymentMethod $paymentMethod; public function __construct(PaymentMethod $paymentMethod) { $this->paymentMethod = $paymentMethod; } public function checkout() { $this->paymentMethod->process(); }}2. Patrons de conception : quand et pourquoi
Les questions sur les patrons lors de l'entretien vérifient si vous savez appliquer des solutions types à des problèmes réels. Il ne suffit pas de nommer le patron — il faut expliquer quel problème il résout.
Singleton. Utilisé pour les objets qui doivent exister en un seul exemplaire (par exemple, la connexion à la BDD). Mais soyez prêt à la critique : beaucoup considèrent Singleton comme un anti-patron en raison des dépendances cachées et des problèmes de test.
class Database { private static ?Database $instance = null; private function __construct() { } public static function getInstance(): Database { if (self::$instance === null) { self::$instance = new self(); } return self::$instance; }}Factory Method (Méthode de fabrique). Crée des objets sans spécifier la classe concrète. Particulièrement utile pour travailler avec différents types de connexions :
interface Connection { }class MysqlConnection implements Conn