composer init 不是新建项目首选,因其仅生成空壳 composer.json,缺乏代码、测试、自动加载配置及 Git 初始化,新手易卡在目录结构和配置问题上;推荐用 create-project 命令基于成熟骨架创建项目。

composer init 为什么不是新建项目的首选?
因为 composer init 只生成一个空壳 composer.json,不带任何代码、测试、自动加载配置,也不初始化 Git 或目录结构。新手常卡在“接下来该写什么”——比如该不该建 src/?autoload 怎么配?require 字段要不要填?填错格式直接导致后续 composer install 失败。
真实开发中,90% 的新项目是基于已有骨架启动的,不是从零手写配置。推荐用:
-
composer create-project laravel/laravel my-app—— 拉完整 Laravel 项目(含路由、命令行、测试等) -
composer create-project php-http/skeleton api-server—— 轻量级 PSR-7/PSR-18 模板,适合写 API -
composer create-project --no-interaction symfony/skeleton my-symfony—— 静默创建 Symfony 最小项目
注意:create-project 默认拉 stable 版本(如 v6.4.0),不是 dev-main;想拉最新开发版必须显式加 dev-main 或 --stability=dev。
vendor/autoload.php 必须在入口文件第一行引入吗?
不是“必须”,但几乎总是要放在最前——因为它是整个依赖自动加载的唯一入口。如果在它之前执行了 new MyClass() 或调用了未声明的类,PHP 会直接报 Class 'MyClass' not found,且无法被后续的 require 补救。
常见错误场景:
- 先写了
session_start()或输出 HTML,再引入vendor/autoload.php→ 报Cannot send session cache limiter - 在
index.php里漏掉这行,却在src/中用了MonologLogger→ 类找不到,且 IDE 不报错(只运行时报) - 用
require_once 'vendor/autoload.php'但路径写成./vendor/autoload.php→ 在 CLI 和 Web 下路径行为不一致,容易本地能跑、线上报错
正确写法就一行:require __DIR__ . '/vendor/autoload.php';,且确保它出现在所有业务逻辑之前。
composer install 和 composer update 到底该用哪个?
composer install 是上线和协作的标准动作,它严格按 composer.lock 安装**完全相同的版本**;composer update 是开发时主动升级依赖的动作,它忽略 lock 文件,重新解析 composer.json 并拉取满足约束的最新兼容版本。
容易踩的坑:
- 团队共用一个项目,有人偷偷运行
composer update提交了新的composer.lock,其他人install后发现行为突变 → 原因:monolog/monolog从2.10.0升到3.0.0,API 已不兼容 - CI/CD 流程里误用
update→ 每次构建拉的依赖版本不同,测试通过但线上崩溃 - 本地
install报错 “package not found”,但show能查到 → 很可能是镜像失效或网络超时,不是包不存在;先运行composer config -g repo.packagist确认是否指向国内镜像(如https://packagist.phpcomposer.com)
怎么让自己的类被自动加载?PSR-4 配置写错的典型表现
PSR-4 自动加载的核心是命名空间与目录的映射关系。写错最直接的表现是:类文件存在、路径没错、autoload.php 也引入了,但一 new 就报 Class not found。
检查点:
-
"autoload": { "psr-4": { "App\": "app/" } }→ 对应文件必须在app/Http/Controller.php,且开头有namespace AppHttp;。少一个反斜杠、多一个空格、大小写不一致(Windows 可能不报,Linux 直接失败)都会断掉映射 - 改完
composer.json后没运行composer dump-autoload→ 新增或修改 autoload 配置不会自动生效 - 用了
classmap混搭 PSR-4 → Composer 会优先走 classmap,若 classmap 缓存没更新,旧路径仍被加载,新类反而被忽略
验证方式很简单:composer dump-autoload -v 会打印出实际扫描的路径和匹配到的类,一眼就能看出映射是否命中。
最关键的细节往往藏在 composer.lock 文件里——它记录的是你上一次成功安装时每个包的真实 commit hash 或版本号。很多人删了 vendor 重装,却忘了 lock 文件可能已过期或被误提交,结果装出来的东西和队友完全不同。别跳过它,也别手动编辑它。










