PSR-4(以及 PSR-0)要求类 ClassName 存储在名为 ClassName.php 的文件中。名称区分大小写,并且必须完全匹配。
您项目中的文件名是小写的,类名是混合大小写的。 Windows 和 macOS 上的默认磁盘格式在搜索时不区分大小写。这意味着当程序搜索Employee.php 并且目录中存在文件employee.php 时,搜索成功并且操作系统返回现有文件,即使其名称的大小写与所需文件的大小写不同。在基于 Linux 的操作系统上,默认磁盘格式区分大小写,搜索Employee.php 的程序找不到employee.php。
您的composer.json 文件将app/ 目录声明为遵循PSR-4 标准的MyDomain 命名空间的根目录。这足以让自动加载器在需要加载类MyDomain\Models\Employee 时找到文件app/Models/Employee.php。
因为您在 Ubuntu(这是一个基于 Linux 的操作系统)上运行它,PHP 无法加载 Employee.php 文件(因为它不存在)并且操作系统没有提供文件 employee.php 来代替。
您似乎使用composer update -o 或composer dump-autoload -o 生成自动加载器。 -o(--classmap-authoritative 的缩写)告诉 Composer 扫描在您的情况下在 composer.json (app/) 中声明的目录,并创建一个包含它可以找到的所有类的类映射。类映射是将类名(带有命名空间)映射到文件名(带有目录)的列表。这样,自动加载器就知道在哪里找到每个类,加载速度更快。
以上两段解释了为什么在添加新类后需要重新生成自动加载器。
完成这项工作的正确方法是遵循PSR-4 的要求。更具体地说,MyDomain 下的每个命名空间必须存储在具有相同名称的app/ 的子目录中,包括大小写。每个类都必须存储在正确的子目录中,在一个文件中,该文件与该类(包括大小写)和终止 .php(小写)具有相同的名称。例如,MyDomain\Models\Employee 类必须保留在文件app/Models/Employee.php 中。
修改文件名后,您可以运行composer dump-autoload 并忘记它。只要类名和文件名遵循 PSR-4,自动加载器就会找到它们而无需再次重新生成。
在生产服务器上,您可以运行composer dump-autoload -o 以稍微提高它的速度。只是不要忘记在每次部署后再次运行它(或者,更好的是,将命令包含在部署脚本中)。