WorksheetsDebriefing OOP Advanced
Total questions: 40
Worksheet time: 2hrs 36mins
Quel est le principal objectif de l’encapsulation en POO PHP ?
Masquer les classes aux autres fichiers
Regrouper données + comportements et contrôler l’accès
Améliorer les performances PHP + rendre le code lisible
Acceder aux attributes depuis d'autres classes
Écrivez une classe User qui respecte strictement l’encapsulation :
Propriétés privées : id, name, email
constructeur, setters et getters ..
Respectez les bonnes pratiques (typage si possible).
Que produit le code suivant et pourquoi ?
Quel mot-clé permet d’accéder à une méthode de la classe parente en PHP ?
this
self
static
parent
Créez une classe abstraite Payment :
Méthode abstraite pay(float $amount)
Méthode concrète logPayment()
Puis implémentez : CardPayment et CashPayment
Chaqu'une des classes CashPayment et CardPayment doit implémenter pay() différemment.
Expliquez la différence entre : abstract class et interface
Laquelle de ces affirmations est fausse ?
Une interface peut contenir des constantes
Une classe peut implémenter plusieurs interfaces
Une interface peut avoir des méthodes avec implémentation
Une classe abstraite peut contenir des méthodes concrètes
Implémentez une interface Notifiable avec la méthode send(string $message)
Puis deux classes: EmailNotification et SMSNotification
Utilisez le polymorphisme pour envoyer une notification sans connaître le type exact.
Pourquoi ce code viole-t-il un principe POO ?
class User { public $email; }
Quand utiliser le mot-clé final ?
Pour empêcher l’instanciation
Pour empêcher l’héritage ou la redéfinition
Pour créer un singleton
Pour optimiser les performances
Expliquez la différence entre this, self et static.
Quel est le problème dans ce code et comment le régler ?
Quel mot-clé est utilisé pour accéder à une propriété statique depuis la classe elle-même ?
this
parent
self
static
Créez une classe Logger avec :
Une méthode statique log(string $message)
Interdiction d’instanciation de la classe
Expliquez le design pattern Singleton ?
Refactorisez ce code pour utiliser l’injection de dépendances :
Écrivez une requête qui :
Compte le nombre d’articles par catégorie
N’affiche que les catégories ayant plus de 5 articles
Quelle est la différence entre WHERE et HAVING ?
Écrivez une requête qui récupère :
Les utilisateurs
Le total de leurs commandes
Même ceux sans commandes
Sélectionnez les produits dont le chiffre d’affaires dépasse la moyenne globale.
Expliquez la différence entre :
Association
Agrégation
Composition
Dessinez un diagramme de classes pour : User, Order, Product
Contraintes :
Un utilisateur peut avoir plusieurs commandes
Une commande contient plusieurs produits

Peut-on hériter d’une classe final ? Pourquoi ?
Une classe abstraite peut-elle implémenter une interface ? Expliquez.
Pourquoi ce code est dangereux ?
public function setPrice($price) {
$this->price = $price;
}
Écrivez une classe Product avec :
Propriétés privées : id, name, price
Un constructeur qui valide si : name non vide et price > 0
Une exception si les données sont invalides
Que se passe-t-il si une classe enfant ne définit pas de constructeur mais que la classe parente en a un ?
Expliquez la différence entre ce code :
self::method();
et
static::method();
Quelle affirmation concernant les classes abstraites est vraie ?
Une classe abstraite ne peut pas être héritée de plusieurs classes.
Une classe abstraite force l’implémentation de méthodes dans les classes filles
Une classe abstraite doit contenir au moins une seule méthode abstraite
Une classe abstraite ne peut pas avoir de constructeur.
Créez une classe Shape contenant une méthode abstraite
calculateSurface(): float.
Créez deux classes Triangle et Square qui héritent de Shape et implémentent cette méthode.
Montrez ensuite un exemple de polymorphisme où une variable de type Shape appelle calculateSurface() sur différents objets.
Expliquer la différence entre agrégation et composition.
Comptez le nombre d’utilisateurs par rôle et affichez uniquement ceux ayant plus de 5 utilisateurs.
Dans quelle situation $this ne peut pas être utilisé ?
Dans une méthode publique
Dans une méthode statique
Dans un constructeur
Dans une méthode protégée
Créez une classe Counter avec :
une propriété statique $count
une méthode statique increment()
une méthode getCount()
Que se passe-t-il si une méthode est déclarée final ?
Elle devient statique
Elle ne peut pas être appelée
Elle ne peut pas être redéfinie
Elle ne peut pas être héritée
Comment peut-on accéder à une méthode statique ?
Quelles sont les types d'acteurs que l'on peut trouver dans un diagramme de cas d'utilisation ? Définissez-les.
Faites correspondre les éléments suivants
Association
Héritage
Agréagation
Composition
Dépendance
Complétez ce diagramme de classe.
Peut-on, dans un diagramme de classes UML, définir une association dont la multiplicité est fixée à 1..1 d’un côté et à 4..4 de l’autre ?
True
False
