php+symfony 5.0.x 扩展抽象类和同时实现接口(interface)时自动加载问题

标签 php symfony autoload psr-4 symfony5

我有一个 symfony 5 项目。

我遇到了自动加载的问题。

我使用框架提供的默认自动加载配置。

我在同一命名空间下的同一目录中定义了类、抽象类和接口(interface)。

问题是,当我这样描述我的类(class)时:

类 MyClass 扩展 MyAbstractClass

类 MyAbstractClass 实现 MyClassInterface

我收到自动加载错误:

Attempted to load class "MyClass" from namespace "App\Entities".  
Did you forget a "use" statement for another namespace? 

日志中的一行:

Error thrown while running command "myproject:mycommand". Message: "Class 'App\Entities\MyClass' not found" ...

如果我使用:

类 MyClass 扩展 MyAbstractClass

类 MyClass 实现 MyClassInterface

类 MyClass 扩展 MyAbstractClass 实现 MyClassInterface

然后错误消失了 - 一切正常。

只有在我使用的时候才会出现这个错误

类 MyAbstractClass 实现 MyClassInterface

如何解决问题?

我需要让抽象类实现一个接口(interface),这样任何扩展 AbstractClass 的类都将与该接口(interface)兼容。

PHP 7.4.1(客户端)

最佳答案

问题是顺序,正在加载文件。

我发现了问题,但我还没有解决它。

问题是自动加载器按字母顺序包含文件,但不是按顺序,必须包含文件。

我实际的类名是:

抽象实体

实体接口(interface)

门票

实现是:

接口(interface) EntityInterface {}

抽象类 AbstractEntity 实现 EntityInterface {}

class Ticket extends AbstractEntity {}

文件包含在下一个顺序中(按字母顺序):

AbstractEntity.php

EntityInterface.php

Ticket.php

AbstractEntity.php - 此文件声明了 AbstractEntity 类。

这个类实现了EntityInterface接口(interface),所以EntityInterface.php文件必须已经包含在AbstractEntity.php之前。

正确的顺序必须是:

EntityInterface.php

AbstractEntity.php

Ticket.php

很容易检查,只需将 AbstractEntity 重命名为 ObstractEntity,那么字母顺序将是:

EntityInterface.php

ObstractEntity.php

Ticket.php

现在只剩下修复自动加载顺序了。但是……应该怎么快速修复呢?有任何想法吗?是供应商自动加载问题还是 Symfony?

据我所知,composer.json 中有某种选项,其中指出:

    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "App\\Tests\\": "tests/"
        }
    },

更新: 好的,我创建了一个新项目 - 一切正常。 它适用于 Entity 目录和 Entities。版本都一样。

但是一旦我在我的源项目中将 Entites 重命名为 Entity - 一切都开始正常工作。

所以这是一件奇怪的事情。

我只能认为 Symfony 不是那么灵活,类应该存储在 Entity 目录中,这样 autolaod 才能正常工作。

现在是

Ticket.php

AbstractEntity.php

EntityInterface.php

以他们彼此需要的方式。

关于php+symfony 5.0.x 扩展抽象类和同时实现接口(interface)时自动加载问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59878138/

相关文章:

javascript - 将几个json传递给javascript

symfony2 : Using group_concat in QueryBuilder(Doctrine)

validation - 如何覆盖 FOSUserBundle 的验证规则

Symfony 生成新包无法自动更新 autoload

javascript - 如果打开对话框如何禁用焦点

php - 如何从 php 获取值到 javascript 变量是否可能

php - 嵌入式表单生成数组而不是 ArrayCollection

javascript - 使用 JQuery 和 PHP 向下滚动时自动加载页面

php - Slim 3 自动装带器

php - 在 Netbeans PHP 6.8 中编辑评论模板