Skip to content

DevEx: PSR-4 autoload paths in phpc.json project manifest #155

@PurHur

Description

@PurHur

Problem

#106 defines phpc.json for binary / serve --aot, but multi-file apps (#67, #210) need PSR-4 autoloading (App\Router in src/Router.php). Today contributors must manual require every file or rely on host PHP spl_autoload only at compile time.

Without a manifest autoload story, examples/003-MiniWebApp cannot use namespaced src/ cleanly.

Goal

Manifest keys:

{
  "public": "public",
  "entry": "public/index.php",
  "autoload": {
    "psr-4": { "App\\": "src/" }
  },
  "includes": ["config.php"]
}

phpc serve / bin/vm.php project mode resolves classes before compile/run.

Implementation hints

Phase A — VM serve (compile-time)

  1. Extend lib/Web/ProjectManifest.php to parse autoload + includes.
  2. Before Runtime::parseAndCompile, register a compile-time autoloader:
    • Map App\ prefix → src/ relative to project root
    • require_once on class file when referenced (host PHP is fine for discovery)
  3. includes: require_once each path in order (for config.php constants).

Phase B — AOT (harder)

Phase C — Docs + example

Tasks

Acceptance criteria

{ "autoload": { "psr-4": { "App\\": "src/" } } }
./phpc serve 127.0.0.1:8080 examples/003-MiniWebApp
curl 'http://127.0.0.1:8080/index.php'

App\Router resolves without manual require in public/index.php.

Verification (local only)

./script/ci-local.sh --filter ProjectManifest
docker run --rm -v "$(pwd):/compiler" -w /compiler php-compiler:22.04-dev ./phpc lint examples/003-MiniWebApp/public/index.php

Dependencies

Related

Files

  • lib/Web/ProjectManifest.php, bin/serve.php, bin/phpc.php, docs/phpc-json.md

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions