PSR-0 mapped the entire namespace onto the path, so AppReportBuilder had to live at src/App/Report/Builder.php — the vendor and package name repeated inside a directory that was already the package. PSR-4 lets the prefix map to a directory, and the repetition disappears.
// PSR-0: "App\": "src/" => src/App/Report/Builder.php
// PSR-4: "App\": "src/" => src/Report/Builder.php
{
"autoload": {
"psr-4": { "App\": "src/" }
}
}
PSR-0 also translated underscores in class names into directory separators, a PEAR-era compatibility rule that PSR-4 drops — so a class named Report_Builder resolves differently under the two standards. Move one namespace at a time and keep both entries in autoload during the transition; they coexist without complaint.