Questions live as markdown files in the repository, everything runs in the browser, and all
progress is stored in localStorage. There is no backend and no account, and nothing you do is ever
sent anywhere — the only requests the app makes are for its own files. Use it at
phprep.dev, or clone it, add your own questions, and study.
Practice — immediate feedback and an explanation after every question. Drill by topic or by what you've not yet seen, with per-question mastery that accumulates across sessions. Runs are capped at 20 questions, drawn at random and reshuffled each time.
Exam — 70 questions under a 90-minute countdown that auto-submits at zero, with no feedback until you submit and flagging for questions to revisit. An in-progress exam survives a reload. Each attempt draws a fresh random 70 from the bank.
Progress — best and latest scores against the pass mark, a score trend across attempts, and a per-topic table putting practice mastery next to exam accuracy, weakest first.
Nothing to install — the app is live at phprep.dev. Open it, pick Practice or Exam, and your progress saves to that browser. No account, and no sync between devices.
Only needed if you want to add questions or change the app.
Prerequisites: Node 24+. Run nvm use to pick up the exact version from .nvmrc — the lockfile
is sensitive to the npm version bundled with Node, so a different Node 24 patch can make npm ci fail
with Missing: @emnapi/... from lock file.
npm install
npm run devThe dev server runs on http://localhost:3000.
npm test # run once
npm run test:watch # re-run on change
npm run test:coverage # with a v8 coverage report
npm test -- grading # a single file or matching subsetVitest with jsdom and Testing Library.
All 1000 questions were written for this repository. None are taken from the official practice exam or any other question bank — that material is copyrighted, and the scraped PHP quiz content floating around is mostly PHP 5/7-era and now factually wrong on 8.4. This project is not affiliated with or endorsed by Zend or Perforce, and these are not real exam questions; they target the published exam topics.
They were drafted with AI assistance, which is exactly why the validation below exists: the failure mode that matters here is not a typo, it is a fluent and confidently wrong answer.
PHP is executable, so most answers have an oracle. Where an answer follows from running code, the
snippet was executed under php:8.4-cli before the question was written, and the marked option
records what actually happened — output first, question second.
| How | Count | What it means |
|---|---|---|
| Executed | 939 | The snippet was run on PHP 8.4 and the marked option is its real output |
| Documented | 61 | Not exercisable in a CLI container |
Found a wrong answer or a misleading explanation? Run the snippet, then open an issue — see CONTRIBUTING.md.
Markdown files under src/questions/php-certified-engineer/<topic>/, glob-imported at build time.
| Field | Notes |
|---|---|
id |
Required, unique and permanent. Suffix matches the filename, so arrays/8.md holds arrays-8. |
topic |
One of the eleven below, spelled exactly. A typo silently creates a twelfth topic. |
type |
single or multiple. Controls radio vs checkbox, and grading. |
shuffle |
Optional, default true. Set false to pin option order. |
topic: |
Directory |
|---|---|
PHP Basics |
php-basics/ |
Functions |
functions/ |
Arrays |
arrays/ |
Strings and Patterns |
strings/ |
Data Format and Types |
types/ |
Object-Oriented Programming |
oop/ |
Error Handling |
error-handling/ |
Security |
security/ |
Web Features |
web-features/ |
Databases and SQL |
databases/ |
I/O |
io/ |
Run npm run qa before opening a pull request. Everything else is in
CONTRIBUTING.md.
ROADMAP.md is what would most improve the project, in rough order of how much it would matter — nothing there is promised or scheduled. Released versions are in CHANGELOG.md.
