MFormations
Modern PHP Engineering

Chapitre 18

18 — QCM PHP (100 Questions)

18 — QCM PHP (100 Questions)

Chapitre 18 — QCM PHP (100 Questions)

18.0 Présentation

Ce QCM couvre l'intégralité des chapitres de la formation Modern PHP Engineering. Chaque question comporte une seule bonne réponse. Les réponses détaillées sont fournies en section 18.11.


18.1 Bloc A : Fondamentaux PHP (Questions 1-10)

Q1 — Quel est le type de retour de array_filter() si le tableau d'entrée conserve tous ses éléments ?

  • A) Le même tableau avec les mêmes clés
  • B) Un nouveau tableau avec des clés réindexées
  • C) Un tableau avec les clés préservées
  • D) Un objet ArrayObject

Q2 — Quelle est la différence entre == et === en PHP ?

  • A) Aucune différence
  • B) == compare la valeur, === compare la valeur et le type
  • C) === est plus lent
  • D) == est utilisé pour l'affectation

Q3 — Que retourne var_dump(0 == 'test') en PHP 8 ?

  • A) true
  • B) false
  • C) TypeError
  • D) null

Q4 — Quelle superglobale contient les données d'un formulaire POST ?

  • A) $_GET
  • B) $_POST
  • C) $_REQUEST
  • D) $_SERVER

Q5 — Quel est le résultat de 2 ** 3 ** 2 en PHP ?

  • A) 64
  • B) 512
  • C) 256
  • D) 12

Q6 — Que signifie declare(strict_types=1) ?

  • A) Active le mode strict pour les types scalaires
  • B) Désactive les warnings
  • C) Active JIT
  • D) Force l'encodage UTF-8

Q7 — Comment itérer sur un tableau en PHP 8.4 ?

  • A) foreach (arrayasarray as key => $value)
  • B) for (i=0;i=0; i<count(array);array); i++)
  • C) while (list(key,key, value) = each($array))
  • D) A et B sont valides

Q8 — Quelle fonction utilise-t-on pour générer un hash sécurisé de mot de passe ?

  • A) md5()
  • B) sha1()
  • C) password_hash()
  • D) crypt()

Q9 — Que retourne str_contains('Hello World', 'World') ?

  • A) 0
  • B) 1
  • C) true
  • D) false

Q10 — Quelle est la portée d'une variable déclarée avec le mot-clé global ?

  • A) Locale à la fonction
  • B) Globale dans tout le script
  • C) Statique
  • D) Visible uniquement dans les classes

18.2 Bloc B : PHP Objets (Questions 11-20)

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

  • A) Aucune différence
  • B) Une interface ne peut pas avoir de méthodes implémentées
  • C) Une classe abstraite ne peut pas avoir de propriétés
  • D) Une interface peut être instanciée

Q12 — Que permet readonly sur une propriété en PHP 8.1+ ?

  • A) La propriété ne peut être lue qu'une fois
  • B) La propriété ne peut être modifiée après l'initialisation
  • C) La propriété est automatiquement sérialisée
  • D) La propriété est visible uniquement en lecture

Q13 — Quel mot-clé permet de résoudre le diamant de l'héritage ?

  • A) use
  • B) trait
  • C) insteadof
  • D) extends

Q14 — Que fait l'opérateur match en PHP 8 ?

  • A) Switch amélioré avec retour de valeur
  • B) Expression régulière
  • C) Pattern matching de chaînes
  • D) Assignation conditionnelle

Q15 — Comment définir un ENUM Backed en PHP ?

  • A) enum Status: int { case Pending = 1; }
  • B) enum Status extends int { case Pending; }
  • C) enum Status with int { case Pending = 1; }
  • D) backed enum Status { case Pending = 1; }

Q16 — Quel pattern permet de rendre une classe instanciable une seule fois ?

  • A) Factory
  • B) Singleton
  • C) Builder
  • D) Prototype

Q17 — Que permet __invoke() sur une classe ?

  • A) Rendre l'objet appelable comme une fonction
  • B) Sérialiser l'objet
  • C) Cloner l'objet
  • D) Détruire l'objet

Q18 — Quelle est la différence entre self et static en PHP ?

  • A) Aucune différence
  • B) self référence la classe courante, static référence la classe appelée (late static binding)
  • C) static ne peut être utilisé que dans les méthodes statiques
  • D) self est déprécié en PHP 8

Q19 — Comment PHP gère-t-il l'héritage multiple ?

  • A) extends multiple
  • B) Traits et interfaces
  • C) Classes abstraites multiples
  • D) PHP ne supporte pas l'héritage multiple de classes, mais via les traits

Q20 — Que retourne (new class { public int $x = 42; })->x ?

  • A) 42
  • B) Erreur
  • C) null
  • D) "42"

18.3 Bloc C : PHP 8.3+ (Questions 21-30)

Q21 — Quelle nouveauté majeure apporte PHP 8.1 ?

  • A) Les énumérations
  • B) Les attributs
  • C) Le JIT
  • D) Les types union

Q22 — Que sont les Fibers en PHP 8.1 ?

  • A) Des threads légers
  • B) Des coroutines permettant l'asynchrone
  • C) Des composants Web
  • D) Des types de variables

Q23 — Que permet array_is_list() en PHP 8.1 ?

  • A) Vérifier si un tableau est indexé numériquement de 0 à n-1
  • B) Vérifier si un tableau est vide
  • C) Trier un tableau
  • D) Fusionner des tableaux

Q24 — Quelle est la syntaxe correcte pour un Attribut en PHP 8 ?

  • A) #[Route('/api')]
  • B) @Route('/api')
  • C) /* Route('/api') */
  • D) <Route('/api')>

Q25 — Que permet never comme type de retour ?

  • A) La fonction ne retourne jamais (exception ou exit)
  • B) La fonction est indéfinie
  • C) La fonction retourne null
  • D) La fonction retourne un type inconnu

Q26 — Quelle est la nouveauté principale de PHP 8.4 ?

  • A) Property hooks
  • B) Match expression
  • C) Named arguments
  • D) Constructor promotion

Q27 — Que fait opcache.jit=tracing ?

  • A) Active le JIT en mode tracing (compilation des parties chaudes)
  • B) Désactive OpCache
  • C) Active le debug
  • D) Trace les appels système

Q28 — Comment créer une Readonly Class en PHP 8.2+ ?

  • A) readonly class User {}
  • B) class User extends Readonly {}
  • C) @readonly class User {}
  • D) class User { use Readonly; }

Q29 — Que permet json_validate() en PHP 8.3 ?

  • A) Valide une chaîne JSON sans la décoder
  • B) Formate un JSON
  • C) Échappe des caractères JSON
  • D) Compare deux JSON

Q30 — Quelle est la portée du JIT en PHP ?

  • A) Améliorer les performances CPU-bound
  • B) Réduire la consommation mémoire
  • C) Accélérer les requêtes SQL
  • D) Optimiser le rendu HTML

18.4 Bloc D : Composer & Écosystème (Questions 31-40)

Q31 — Quel fichier décrit les dépendances d'un projet Composer ?

  • A) package.json
  • B) composer.json
  • C) dependencies.json
  • D) vendor.json

Q32 — Que fait composer require laravel/sanctum ?

  • A) Installe Sanctum dans vendor et met à jour composer.json
  • B) Télécharge Sanctum sans l'ajouter aux dépendances
  • C) Supprime Sanctum
  • D) Met à jour Sanctum

Q33 — Que signifie PSR-4 ?

  • A) Autoloading standard basé sur les namespaces
  • B) Coding style guide
  • C) Logger interface
  • D) HTTP message interface

Q34 — Comment exclure des fichiers du package Composer ?

  • A) .gitignore
  • B) .npmignore
  • C) .gitattributes avec export-ignore
  • D) composer.json exclude

Q35 — Que fait composer dump-autoload ?

  • A) Régénère le fichier d'autoload
  • B) Supprime le cache
  • C) Met à jour toutes les dépendances
  • D) Vérifie les conflits de version

Q36 — Quelle commande installe les dépendances décrites dans composer.lock ?

  • A) composer install
  • B) composer update
  • C) composer require
  • D) composer init

Q37 — Quel est le rôle de Packagist ?

  • A) Le registry principal des packages Composer
  • B) Un IDE PHP
  • C) Un framework PHP
  • D) Un outil de debug

Q38 — Que permet preferred-install: dist dans composer.json ?

  • A) Installer les paquets en version distribuée (zip)
  • B) Installer depuis GitHub
  • C) Ignorer les paquets
  • D) Forcer la version

Q39 — Que fait le script post-autoload-dump dans composer.json ?

  • A) S'exécute après la régénération de l'autoload
  • B) S'exécute avant l'installation
  • C) S'exécute après chaque commit
  • D) S'exécute au déploiement

Q40 — Quelle est la différence entre require et require-dev ?

  • A) require-dev est pour les dépendances de développement uniquement
  • B) require est optionnel
  • C) require-dev installe globalement
  • D) Aucune différence

18.5 Bloc E : Bases de données (Questions 41-50)

Q41 — Quel est l'avantage principal des requêtes préparées PDO ?

  • A) Protection contre les injections SQL
  • B) Performance améliorée
  • C) Syntaxe plus simple
  • D) Compatibilité MySQL/PostgreSQL

Q42 — Quelle méthode PDO exécute une requête préparée ?

  • A) query()
  • B) exec()
  • C) execute()
  • D) run()

Q43 — Comment Laravel Eloquent gère-t-il la relation many-to-many ?

  • A) belongsToMany
  • B) hasMany
  • C) morphToMany
  • D) A ou C selon le contexte

Q44 — Qu'est-ce que le N+1 problem en ORM ?

  • A) Requêtes multiples générées par des relations non chargées
  • B) Une boucle infinie
  • C) Un problème de cache
  • D) Une erreur de syntaxe

Q45 — Quelle est la différence entre eager loading et lazy loading ?

  • A) eager charge les relations en avance, lazy au moment de l'accès
  • B) eager est plus lent
  • C) lazy est toujours préférable
  • D) Aucune différence

Q46 — Comment créer une migration Laravel ?

  • A) php artisan make:migration
  • B) php artisan create:migration
  • C) php artisan generate:migration
  • D) php artisan new:migration

Q47 — Quelle méthode Eloquent hydrate un modèle sans le persister ?

  • A) new Model()
  • B) Model::make()
  • C) Model::hydrate()
  • D) Model::new()

Q48 — Que fait $query->dd() dans Laravel ?

  • A) Dump la requête SQL et die
  • B) Supprime les doublons
  • C) Débogue les données
  • D) Détache les relations

Q49 — Quel index est recommandé pour la recherche full-text ?

  • A) B-tree
  • B) Hash
  • C) GIN/GiST (PostgreSQL)
  • D) Bitmap

Q50 — Comment optimiser une requête SQL lente ?

  • A) Ajouter un index approprié
  • B) Utiliser SELECT *
  • C) Supprimer les jointures
  • D) Augmenter la mémoire serveur

18.6 Bloc F : Frameworks (Questions 51-60)

Q51 — Quel est le rôle du Service Container dans Laravel/Symfony ?

  • A) Gérer les dépendances et l'injection de dépendances
  • B) Faire le rendu HTML
  • C) Gérer les sessions
  • D) Router les requêtes

Q52 — Comment créer un middleware dans Laravel ?

  • A) php artisan make:middleware
  • B) php artisan create:middleware
  • C) php artisan generate:middleware
  • D) php artisan new:middleware

Q53 — Quel composant Symfony gère l'envoi d'emails ?

  • A) Mailer
  • B) Mime
  • C) Notifier
  • D) SwiftMailer

Q54 — Que permet l'Event Dispatcher de Symfony ?

  • A) Un système d'événements découplé
  • B) La gestion des sessions
  • C) Le rendu de templates
  • D) La validation de formulaires

Q55 — Quelle est la différence entre web.php et api.php dans Laravel ?

  • A) api.php a session et CSRF désactivés
  • B) web.php est plus rapide
  • C) api.php utilise un middleware différent (throttle, auth:sanctum)
  • D) A et C

Q56 — Que fait php artisan make:model -mcf dans Laravel ?

  • A) Crée Model, Migration, Factory, Controller
  • B) Crée Model, Migration, Seeder
  • C) Crée Model, Mail, Controller
  • D) Crée Model, Migration, Request

Q57 — Quel est l'équivalent Symfony de Eloquent ?

  • A) Doctrine ORM
  • B) Propel
  • C) Cycle ORM
  • D) PDO

Q58 — Comment définir une route vers un controller invokable dans Laravel ?

  • A) Route::get('/route', MyController::class);
  • B) Route::get('/route', [MyController::class, '__invoke']);
  • C) Route::invoke('/route', MyController::class);
  • D) Route::view('/route', MyController::class);

Q59 — Que sont les Form Requests dans Laravel ?

  • A) Des classes de validation dédiées
  • B) Des requêtes HTTP
  • C) Des formulaires Blade
  • D) Des composants Livewire

Q60 — Quelle est la bonne pratique pour gérer les rôles et permissions ?

  • A) spatie/laravel-permission
  • B) Système maison basé sur l'IP
  • C) Variables de session
  • D) Fichier de configuration

18.7 Bloc G : APIs (Questions 61-70)

Q61 — Que permet Laravel Sanctum ?

  • A) Authentification d'API avec tokens
  • B) Génération de documentation
  • C) Cache d'API
  • D) Rate limiting

Q62 — Quelle méthode HTTP est idempotente ?

  • A) POST
  • B) GET, PUT, DELETE
  • C) PATCH
  • D) OPTIONS

Q63 — Quel est le code HTTP pour une ressource créée ?

  • A) 200
  • B) 201
  • C) 204
  • D) 301

Q64 — Que signifie HATEOAS dans une API REST ?

  • A) Hypermedia as the Engine of Application State
  • B) High Availability Through Endpoints
  • C) HTTP API Transfer Protocol
  • D) Une librairie PHP

Q65 — Quel package GraphQL pour Laravel ?

  • A) Lighthouse
  • B) GraphQLite
  • C) API Platform
  • D) Webonyx/GraphQL

Q66 — Quelle est la différence entre REST et GraphQL ?

  • A) GraphQL permet au client de spécifier les données nécessaires
  • B) REST est plus récent
  • C) GraphQL ne supporte pas les mutations
  • D) REST n'utilise que GET

Q67 — Comment sécuriser une API REST en Laravel ?

  • A) Sanctum ou Passport pour OAuth
  • B) Aucune sécurité nécessaire
  • C) HTTP Basic Auth
  • D) API Key dans l'URL

Q68 — Que retourne une API Resource de Laravel ?

  • A) Une collection formatée avec des données transformées
  • B) Une vue Blade
  • C) Du JSON brut
  • D) Un fichier XML

Q69 — Quel header indique le type de contenu d'une réponse API ?

  • A) Content-Type
  • B) Accept
  • C) Authorization
  • D) X-Powered-By

Q70 — Comment versionner une API ?

  • A) URL prefix (/v1/, /v2/)
  • B) Header Accept
  • C) Query parameter (?v=1)
  • D) Toutes ces réponses sont valides

18.8 Bloc H : Tests & Performance (Questions 71-80)

Q71 — Quelle est la différence entre PHPUnit et Pest ?

  • A) Pest offre une syntaxe plus expressive
  • B) PHPUnit est plus récent
  • C) Pest ne supporte pas les assertions
  • D) PHPUnit n'est pas compatible avec Laravel

Q72 — Que permet RefreshDatabase dans les tests Laravel ?

  • A) Migrer et remigrer la base après chaque test
  • B) Vider la base de données
  • C) Rafraîchir les caches
  • D) Optimiser les requêtes

Q73 — Qu'est-ce que la couverture de code ?

  • A) Le pourcentage de code exécuté par les tests
  • B) Le nombre de tests
  • C) La vitesse des tests
  • D) La qualité des tests

Q74 — Quel outil d'analyse statique pour PHP ?

  • A) PHPStan
  • B) Xdebug
  • C) Blackfire
  • D) Laravel Debugbar

Q75 — Que fait OpCache ?

  • A) Cache le code compilé en mémoire
  • B) Optimise les requêtes SQL
  • C) Compresse les assets
  • D) Minifie le HTML

Q76 — Quelle est la différence entre opcache.validate_timestamps=0 et =1 ?

  • A) 0 = pas de vérification des modifications (prod), 1 = vérifié (dev)
  • B) 0 = désactivé, 1 = activé
  • C) 0 = lent, 1 = rapide
  • D) Aucune différence

Q77 — Qu'est-ce que le profiling ?

  • A) L'analyse des performances d'une application
  • B) La rédaction de tests
  • C) Le déploiement
  • D) Le design d'interface

Q78 — Quel outil de profiling recommander ?

  • A) Xdebug + QCacheGrind
  • B) Notepad
  • C) WordPress
  • D) phpMyAdmin

Q79 — Quel est l'impact du JIT sur PHP ?

  • A) Amélioration des performances CPU-bound
  • B) Réduction de la mémoire
  • C) Accélération du réseau
  • D) Aucun impact

Q80 — Comment tester une file d'attente dans Laravel ?

  • A) Queue::fake()
  • B) Bus::fake()
  • C) Event::fake()
  • D) Notification::fake()

18.9 Bloc I : Sécurité & Architecture (Questions 81-90)

Q81 — Quelle méthode protège contre les injections SQL ?

  • A) Requêtes préparées
  • B) addslashes()
  • C) strip_tags()
  • D) htmlspecialchars()

Q82 — Que protège CSRF ?

  • A) Les attaques cross-site request forgery
  • B) Les injections SQL
  • C) Les attaques XSS
  • D) Le vol de session

Q83 — Quel est le principe SOLID "O" ?

  • A) Open/Closed — ouvert à l'extension, fermé à la modification
  • B) Object-oriented
  • C) One responsibility
  • D) Original design

Q84 — Que définit le principe de ségrégation des interfaces (ISP) ?

  • A) Une interface ne doit pas forcer l'implémentation de méthodes inutiles
  • B) Une interface peut avoir n'importe quelle méthode
  • C) Les interfaces sont optionnelles
  • D) Une interface = une classe

Q85 — Quels sont les 4 piliers de l'OOP ?

  • A) Encapsulation, Héritage, Polymorphisme, Abstraction
  • B) Héritage, Interface, Classe, Objet
  • C) Modularité, Réutilisabilité, Performance, Sécurité
  • D) Simple, Rapide, Léger, Flexible

Q86 — Que signifie DDD ?

  • A) Domain-Driven Design
  • B) Database-Driven Development
  • C) Data Definition Document
  • D) Dynamic Data Design

Q87 — Qu'est-ce qu'un Value Object ?

  • A) Un objet immutable défini par ses attributs
  • B) Un objet avec une identité
  • C) Une classe utilitaire
  • D) Un pattern de base de données

Q88 — Quelle méthode de chiffrement utiliser pour les mots de passe ?

  • A) bcrypt via password_hash()
  • B) MD5
  • C) SHA-256
  • D) Base64

Q89 — Qu'est-ce que l'Event-Driven Architecture ?

  • A) Architecture basée sur les événements asynchrones
  • B) Architecture en couches
  • C) Architecture microservices
  • D) Architecture monolithique

Q90 — Comment valider les entrées utilisateur ?

  • A) Validation côté serveur + côté client
  • B) Côté client uniquement
  • C) Côté serveur uniquement avec strip_tags
  • D) Aucune validation nécessaire

18.10 Bloc J : DevOps & Tendances (Questions 91-100)

Q91 — Que permet Docker dans un projet PHP ?

  • A) Conteneuriser l'application et ses dépendances
  • B) Compiler le code PHP
  • C) Gérer les assets
  • D) Déboguer le code

Q92 — Quelle est la différence entre Docker et Vagrant ?

  • A) Docker conteneurise, Vagrant virtualise
  • B) Docker est plus lent
  • C) Vagrant ne supporte pas PHP
  • D) Aucune différence

Q93 — Que fait GitHub Actions ?

  • A) CI/CD intégré à GitHub
  • B) Hébergement de site
  • C) IDE en ligne
  • D) Base de données

Q94 — Qu'est-ce que FrankenPHP ?

  • A) Un serveur PHP natif basé sur Caddy
  • B) Un framework PHP
  • C) Un ORM
  • D) Un outil de test

Q95 — Que permet Laravel Reverb ?

  • A) WebSocket server first-party Laravel
  • B) Un ORM
  • C) Un moteur de template
  • D) Un cache driver

Q96 — Qu'est-ce qu'une Fiber en PHP ?

  • A) Une coroutine légère pour l'async
  • B) Un thread système
  • C) Un processus
  • D) Une fibre optique

Q97 — Que permet PHP Wasm ?

  • A) Exécuter PHP dans le navigateur via WebAssembly
  • B) Compiler PHP en binaire
  • C) Un framework PHP
  • D) Un outil de déploiement

Q98 — Quelle librairie ML pour PHP ?

  • A) PHP-ML ou Rubix ML
  • B) TensorFlow PHP
  • C) PyTorch PHP
  • D) Scikit-learn PHP

Q99 — Que permet NativePHP ?

  • A) Créer des applications desktop avec PHP
  • B) Exécuter PHP sur mobile
  • C) Compiler PHP en natif
  • D) Un IDE PHP

Q100 — Quelle est la tendance majeure pour PHP en 2025-2026 ?

  • A) Toutes ces réponses : asynchrone, AI, desktop, WebAssembly
  • B) PHP va disparaître
  • C) PHP devient un langage compile
  • D) PHP abandonne le web

18.11 Réponses détaillées

Bloc A : 1-10

  1. Carray_filter préserve les clés par défaut. Utilisez array_values() pour réindexer.
  2. B== compare la valeur avec conversion de type, === compare valeur ET type.
  3. B — false. En PHP 8, les comparaisons lâches ont été modifiées. 0 == 'test' retourne false.
  4. B$_POST contient les données POST. $_REQUEST combine GET/POST/COOKIE.
  5. B — 512. L'opérateur ** est associatif à droite, donc 2 ** (3 ** 2) = 2^9 = 512.
  6. A — strict_types=1 force le typage strict pour les paramètres scalaires.
  7. D — foreach et for sont valides. each() est dépréciée depuis PHP 7.2.
  8. Cpassword_hash() utilise bcrypt (ou argon2). md5/sha1 ne sont pas sécurisés.
  9. C — str_contains retourne un booléen depuis PHP 8.0.
  10. Bglobal importe une variable de la portée globale dans la portée locale.

Bloc B : 11-20

  1. B — Une interface ne peut contenir que des signatures de méthodes. Une classe abstraite peut avoir des implémentations partielles.
  2. Breadonly empêche la modification d'une propriété après l'initialisation.
  3. Cinsteadof résout les conflits entre traits. use importe les traits.
  4. Amatch est une expression qui retourne une valeur, contrairement à switch.
  5. A — La syntaxe enum Status: int { case Pending = 1; } définit un Backed Enum.
  6. B — Singleton pattern garantit qu'une classe a une seule instance.
  7. A__invoke() rend un objet callable comme une fonction.
  8. Bself référence la classe où est écrit le code. static référence la classe appelée (late static binding).
  9. D — PHP ne supporte pas l'héritage multiple de classes. Les traits permettent de partager des implémentations.
  10. A — 42. Anonymous classes sont fully fonctionnelles en PHP 8.

Bloc C : 21-30

  1. A — Les énumérations (Enums) sont la nouveauté majeure de PHP 8.1.
  2. B — Fibers sont des coroutines pour la programmation asynchrone.
  3. Aarray_is_list() vérifie si les clés sont 0, 1, 2, ... n-1.
  4. A#[AttributeName] est la syntaxe des attributs PHP 8.
  5. Anever indique que la fonction termine par une exception ou un exit().
  6. A — Property hooks (get/set) est la nouveauté majeure de PHP 8.4.
  7. Aopcache.jit=tracing active le JIT qui compile dynamiquement les hotspots.
  8. Areadonly class User {} rend toutes les propriétés non typées comme readonly en PHP 8.2+.
  9. Ajson_validate() valide une chaîne JSON sans la décoder, plus efficace.
  10. A — Le JIT améliore les performances CPU-bound (calculs intensifs).

Bloc D : 31-40

  1. Bcomposer.json décrit les dépendances du projet.
  2. Acomposer require installe ET enregistre dans composer.json.
  3. A — PSR-4 définit l'autoloading basé sur les namespaces (PSR-0 est déprécié).
  4. C.gitattributes avec export-ignore exclut des fichiers du package Composer.
  5. Acomposer dump-autoload régénère le fichier vendor/composer/autoload.php.
  6. Acomposer install utilise composer.lock pour des versions fixes.
  7. A — Packagist est le registry officiel des packages PHP/Composer.
  8. Apreferred-install: dist télécharge les archives zip plutôt que les sources clonées.
  9. Apost-autoload-dump est exécuté après la génération de l'autoloader.
  10. Arequire-dev contient les dépendances pour le développement uniquement (tests, debug).

Bloc E : 41-50

  1. A — Les requêtes préparées séparent les données du SQL, éliminant les injections.
  2. Cexecute() exécute une requête préparée avec les paramètres bindés.
  3. AbelongsToMany est la méthode standard Eloquent pour many-to-many.
  4. A — Le N+1 se produit quand N requêtes additionnelles sont générées pour des relations non eager-loaded.
  5. A — Eager loading (with()) charge les relations en une requête. Lazy loading les charge à l'accès.
  6. Aphp artisan make:migration create_users_table.
  7. BModel::make() crée une instance sans persister. Model::create() persiste.
  8. A$query->dd() dump la requête SQL et les bindings, puis die().
  9. C — GIN (Generalized Inverted Index) pour PostgreSQL full-text. Pour MySQL, FULLTEXT index.
  10. A — L'ajout d'index est la première optimisation. Évitez SELECT * en production.

Bloc F : 51-60

  1. A — Le Service Container gère l'injection de dépendances et la résolution de classes.
  2. Aphp artisan make:middleware CheckAge.
  3. A — Symfony Mailer (SwiftMailer est déprécié depuis Symfony 5.4).
  4. A — L'EventDispatcher implémente le pattern Observer/Médiateur découplé.
  5. D — api.php n'a pas de session/CSRF et a throttle/sanctum middleware.
  6. A — -m (migration) -c (controller) -f (factory) — flags combinés.
  7. A — Doctrine ORM est l'ORM par défaut de Symfony (avec MakerBundle pour les entités).
  8. ARoute::get('/route', MyController::class) pour les controllers invokables.
  9. A — Form Requests encapsulent la validation dans des classes dédiées.
  10. A — spatie/laravel-permission est la solution recommandée et maintenue.

Bloc G : 61-70

  1. A — Sanctum fournit une authentification par tokens SPA ou API simple.
  2. B — GET, PUT, DELETE sont idempotents (même résultat exécutés 1 ou N fois).
  3. B — 201 Created est le code standard pour une création réussie.
  4. A — HATEOAS intègre des liens hypermédia dans les réponses API.
  5. A — Lighthouse est le package GraphQL le plus populaire pour Laravel.
  6. A — GraphQL permet au client de spécifier exactement les champs nécessaires (query flexibility).
  7. A — Sanctum (tokens simples) ou Passport (OAuth complet) selon les besoins.
  8. A — Les API Resources formatent les données Eloquent en JSON structuré.
  9. A — Content-Type décrit le format de la réponse (application/json, text/html, etc.).
  10. D — Les trois approches sont valides avec des avantages différents.

Bloc H : 71-80

  1. A — Pest offre une syntaxe plus expressive (describe, it, expect →). PHPUnit reste plus utilisé en entreprise.
  2. ARefreshDatabase migre et rollback après chaque test pour une base propre.
  3. A — La couverture de code mesure le pourcentage de code exécuté par les tests.
  4. A — PHPStan (et Psalm) sont les analyseurs statiques PHP les plus populaires.
  5. A — OpCache compile et stocke le script PHP en mémoire pour éviter la recompilation.
  6. A — validate_timestamps=0 est recommandé en production (pas de vérification disque à chaque requête).
  7. A — Le profiling identifie les goulots d'étranglement (CPU, mémoire, I/O).
  8. A — Xdebug + QCacheGrind (ou Blackfire, Tideways) pour le profiling PHP.
  9. A — Le JIT améliore significativement les calculs intensifs mais moins l'I/O-bound.
  10. AQueue::fake() capture les jobs dispatchés pour les assertions de test.

Bloc I : 81-90

  1. A — Les requêtes préparées sont la seule protection fiable contre les injections SQL.
  2. A — CSRF protège contre les requêtes inter-sites forgées.
  3. A — Open/Closed : les classes doivent être ouvertes à l'extension mais fermées à la modification.
  4. A — ISP : les clients ne doivent pas dépendre d'interfaces qu'ils n'utilisent pas.
  5. A — Les 4 piliers sont : Encapsulation, Héritage, Polymorphisme, Abstraction.
  6. A — Domain-Driven Design : modélisation basée sur le domaine métier.
  7. A — Value Object : objet immutable sans identité, défini par ses attributs (ex: Money, Email, Color).
  8. A — password_hash() avec bcrypt (coût 12) ou Argon2id pour les mots de passe.
  9. A — Event-Driven Architecture : composants communiquent via des événements asynchrones.
  10. A — La validation doit être effectuée côté serveur ET côté client (UX + sécurité).

Bloc J : 91-100

  1. A — Docker conteneurise l'application PHP + serveur + base de données + dépendances.
  2. A — Docker partage le noyau hôte (conteneurs), Vagrant virtualise un OS complet (VMs).
  3. A — GitHub Actions permet l'intégration et le déploiement continus.
  4. A — FrankenPHP est un serveur PHP moderne basé sur Caddy avec mode worker.
  5. A — Laravel Reverb est le serveur WebSocket officiel Laravel (remplace Pusher/Soketi).
  6. A — Les Fibers sont des coroutines légères (pas des threads) pour l'async.
  7. A — PHP Wasm compile PHP en WebAssembly pour exécution dans le navigateur.
  8. A — PHP-ML et Rubix ML sont les deux librairies ML principales pour PHP.
  9. A — NativePHP (ex Electron) permet des apps desktop PHP (macOS, Windows, Linux).
  10. A — Toutes ces tendances convergent : async, AI, desktop, WebAssembly, Laravel Reverb, FrankenPHP.