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 (key => $value)
- B) for (i<count(i++)
- C) while (list(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)
selfréférence la classe courante,staticréférence la classe appelée (late static binding) - C)
staticne peut être utilisé que dans les méthodes statiques - D)
selfest 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)
.gitattributesavec export-ignore - D)
composer.jsonexclude
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
- C —
array_filterpréserve les clés par défaut. Utilisezarray_values()pour réindexer. - B —
==compare la valeur avec conversion de type,===compare valeur ET type. - B — false. En PHP 8, les comparaisons lâches ont été modifiées. 0 == 'test' retourne false.
- B —
$_POSTcontient les données POST.$_REQUESTcombine GET/POST/COOKIE. - B — 512. L'opérateur
**est associatif à droite, donc2 ** (3 ** 2)= 2^9 = 512. - A — strict_types=1 force le typage strict pour les paramètres scalaires.
- D — foreach et for sont valides.
each()est dépréciée depuis PHP 7.2. - C —
password_hash()utilise bcrypt (ou argon2). md5/sha1 ne sont pas sécurisés. - C — str_contains retourne un booléen depuis PHP 8.0.
- B —
globalimporte une variable de la portée globale dans la portée locale.
Bloc B : 11-20
- B — Une interface ne peut contenir que des signatures de méthodes. Une classe abstraite peut avoir des implémentations partielles.
- B —
readonlyempêche la modification d'une propriété après l'initialisation. - C —
insteadofrésout les conflits entre traits.useimporte les traits. - A —
matchest une expression qui retourne une valeur, contrairement àswitch. - A — La syntaxe
enum Status: int { case Pending = 1; }définit un Backed Enum. - B — Singleton pattern garantit qu'une classe a une seule instance.
- A —
__invoke()rend un objet callable comme une fonction. - B —
selfréférence la classe où est écrit le code.staticréférence la classe appelée (late static binding). - D — PHP ne supporte pas l'héritage multiple de classes. Les traits permettent de partager des implémentations.
- A — 42. Anonymous classes sont fully fonctionnelles en PHP 8.
Bloc C : 21-30
- A — Les énumérations (Enums) sont la nouveauté majeure de PHP 8.1.
- B — Fibers sont des coroutines pour la programmation asynchrone.
- A —
array_is_list()vérifie si les clés sont 0, 1, 2, ... n-1. - A —
#[AttributeName]est la syntaxe des attributs PHP 8. - A —
neverindique que la fonction termine par une exception ou un exit(). - A — Property hooks (get/set) est la nouveauté majeure de PHP 8.4.
- A —
opcache.jit=tracingactive le JIT qui compile dynamiquement les hotspots. - A —
readonly class User {}rend toutes les propriétés non typées comme readonly en PHP 8.2+. - A —
json_validate()valide une chaîne JSON sans la décoder, plus efficace. - A — Le JIT améliore les performances CPU-bound (calculs intensifs).
Bloc D : 31-40
- B —
composer.jsondécrit les dépendances du projet. - A —
composer requireinstalle ET enregistre dans composer.json. - A — PSR-4 définit l'autoloading basé sur les namespaces (PSR-0 est déprécié).
- C —
.gitattributesavecexport-ignoreexclut des fichiers du package Composer. - A —
composer dump-autoloadrégénère le fichier vendor/composer/autoload.php. - A —
composer installutilise composer.lock pour des versions fixes. - A — Packagist est le registry officiel des packages PHP/Composer.
- A —
preferred-install: disttélécharge les archives zip plutôt que les sources clonées. - A —
post-autoload-dumpest exécuté après la génération de l'autoloader. - A —
require-devcontient les dépendances pour le développement uniquement (tests, debug).
Bloc E : 41-50
- A — Les requêtes préparées séparent les données du SQL, éliminant les injections.
- C —
execute()exécute une requête préparée avec les paramètres bindés. - A —
belongsToManyest la méthode standard Eloquent pour many-to-many. - A — Le N+1 se produit quand N requêtes additionnelles sont générées pour des relations non eager-loaded.
- A — Eager loading (
with()) charge les relations en une requête. Lazy loading les charge à l'accès. - A —
php artisan make:migration create_users_table. - B —
Model::make()crée une instance sans persister.Model::create()persiste. - A —
$query->dd()dump la requête SQL et les bindings, puis die(). - C — GIN (Generalized Inverted Index) pour PostgreSQL full-text. Pour MySQL, FULLTEXT index.
- A — L'ajout d'index est la première optimisation. Évitez SELECT * en production.
Bloc F : 51-60
- A — Le Service Container gère l'injection de dépendances et la résolution de classes.
- A —
php artisan make:middleware CheckAge. - A — Symfony Mailer (SwiftMailer est déprécié depuis Symfony 5.4).
- A — L'EventDispatcher implémente le pattern Observer/Médiateur découplé.
- D — api.php n'a pas de session/CSRF et a throttle/sanctum middleware.
- A — -m (migration) -c (controller) -f (factory) — flags combinés.
- A — Doctrine ORM est l'ORM par défaut de Symfony (avec MakerBundle pour les entités).
- A —
Route::get('/route', MyController::class)pour les controllers invokables. - A — Form Requests encapsulent la validation dans des classes dédiées.
- A — spatie/laravel-permission est la solution recommandée et maintenue.
Bloc G : 61-70
- A — Sanctum fournit une authentification par tokens SPA ou API simple.
- B — GET, PUT, DELETE sont idempotents (même résultat exécutés 1 ou N fois).
- B — 201 Created est le code standard pour une création réussie.
- A — HATEOAS intègre des liens hypermédia dans les réponses API.
- A — Lighthouse est le package GraphQL le plus populaire pour Laravel.
- A — GraphQL permet au client de spécifier exactement les champs nécessaires (query flexibility).
- A — Sanctum (tokens simples) ou Passport (OAuth complet) selon les besoins.
- A — Les API Resources formatent les données Eloquent en JSON structuré.
- A — Content-Type décrit le format de la réponse (application/json, text/html, etc.).
- D — Les trois approches sont valides avec des avantages différents.
Bloc H : 71-80
- A — Pest offre une syntaxe plus expressive (describe, it, expect →). PHPUnit reste plus utilisé en entreprise.
- A —
RefreshDatabasemigre et rollback après chaque test pour une base propre. - A — La couverture de code mesure le pourcentage de code exécuté par les tests.
- A — PHPStan (et Psalm) sont les analyseurs statiques PHP les plus populaires.
- A — OpCache compile et stocke le script PHP en mémoire pour éviter la recompilation.
- A — validate_timestamps=0 est recommandé en production (pas de vérification disque à chaque requête).
- A — Le profiling identifie les goulots d'étranglement (CPU, mémoire, I/O).
- A — Xdebug + QCacheGrind (ou Blackfire, Tideways) pour le profiling PHP.
- A — Le JIT améliore significativement les calculs intensifs mais moins l'I/O-bound.
- A —
Queue::fake()capture les jobs dispatchés pour les assertions de test.
Bloc I : 81-90
- A — Les requêtes préparées sont la seule protection fiable contre les injections SQL.
- A — CSRF protège contre les requêtes inter-sites forgées.
- A — Open/Closed : les classes doivent être ouvertes à l'extension mais fermées à la modification.
- A — ISP : les clients ne doivent pas dépendre d'interfaces qu'ils n'utilisent pas.
- A — Les 4 piliers sont : Encapsulation, Héritage, Polymorphisme, Abstraction.
- A — Domain-Driven Design : modélisation basée sur le domaine métier.
- A — Value Object : objet immutable sans identité, défini par ses attributs (ex: Money, Email, Color).
- A — password_hash() avec bcrypt (coût 12) ou Argon2id pour les mots de passe.
- A — Event-Driven Architecture : composants communiquent via des événements asynchrones.
- A — La validation doit être effectuée côté serveur ET côté client (UX + sécurité).
Bloc J : 91-100
- A — Docker conteneurise l'application PHP + serveur + base de données + dépendances.
- A — Docker partage le noyau hôte (conteneurs), Vagrant virtualise un OS complet (VMs).
- A — GitHub Actions permet l'intégration et le déploiement continus.
- A — FrankenPHP est un serveur PHP moderne basé sur Caddy avec mode worker.
- A — Laravel Reverb est le serveur WebSocket officiel Laravel (remplace Pusher/Soketi).
- A — Les Fibers sont des coroutines légères (pas des threads) pour l'async.
- A — PHP Wasm compile PHP en WebAssembly pour exécution dans le navigateur.
- A — PHP-ML et Rubix ML sont les deux librairies ML principales pour PHP.
- A — NativePHP (ex Electron) permet des apps desktop PHP (macOS, Windows, Linux).
- A — Toutes ces tendances convergent : async, AI, desktop, WebAssembly, Laravel Reverb, FrankenPHP.