PSR-4:自动加载器(composer)和扩展名称空间,确保后备php - php

我的命名空间后备和在Composer中使用PSR-4加载程序时遇到问题。

我想做的是这样的:

有一个可以覆盖/扩展的核心。
核心基于接口。

目录结构如下:

site/app/View/Example.php
site/src/ACME/app/View/Example.php
site/src/ACME/app/Interface/View.php

我没有对此配置进行设置,因此,如果您有更好的建议,请继续使用。

我的作曲家json对于psr-4来说是这样的:

 "autoload": {
    "psr-4": {
         "ACME\\App\\Site\\" : "app/",
         "ACME\\App\\" : "src/AMCE/app/"
    }
}

我以为如果找不到站点一,这会使ACME \ App \ Site \ View退回到ACME \ App \ View(请注意,我还没有完成界面部分...)。

我的site / app / View / Example.php代码如下所示:

namespace ACME\App\Site\View;

class ViewExample extends View {

当我也有site / app / View / View.php时,哪个可行。看起来像:

namespace ACME\App\Site\View;

class View extends \ACME\App\View\View {

site / src / app / View / View.php看起来像这样:

namespace ACME\APP\View;

class View {

这个应该使用接口(我还没有尝试过)。

因此,我真正想做的是制作它,因此我不必拥有site / app / View / View.php,也不必具有site / app / View / Example.php-它可以使用site /src/ACME/app/View/Example.php。

抱歉,我是名称空间的新手,所以我可能说得不太好。

我得到的是我认为ACME \ App \ Site会回退到ACME \ App-不是吗?还是我做错了?目前,它需要所有文件。

参考方案

编辑:原来我原来错了,有可能让您的示例在PSR-4上工作!您只需要为可以从不同位置加载的名称空间指定目录数组。

简单的解决方案

{
    "autoload": {
        "psr-4": {
            "ACME\\App\\Site\\": ["app/", "src/ACME/app"],
            "ACME\\App\\": "src/ACME/app/"
        }
    }
}

就个人而言,我宁愿更明确地命名我的命名空间,请参见下文。

原始答案

尝试加载不存在的文件时,作曲家PSR-4加载器不会后退。它只是立即失败。其流程如下所示:

\ACME\App\Site\View未加载
扫描PSR-4条目以查找匹配的名称空间
类名与名称空间\ACME\App\Site(您的第一个PSR-4条目)匹配。
加载文件app/View.php
文件不存在。错误。

它永远不会返回到步骤3并尝试下一个名称空间。

那么我该如何解决呢?

看来您想将可重用的库代码与站点代码分开。如果是这样,我将使用单独的名称空间。例如,使用ACME\Site命名空间保存您的可重用代码,并使用ACME\MySiteName作为您特定于站点的代码。这样就不会有歧义,作曲家也不会在加载您的类时遇到麻烦。

但是我不想重新排列我的名称空间!

好的,那很好,但是您必须使用黑客解决您的问题。 Composer有一个classmap加载器,您必须使用它而不是首选的PSR-4加载器。

{
    "autoload": {
        "classmap": ["app/", "src/"]
    }
}

Composer PSR-4自动加载“找不到类”调试 - php

是的,有关“找不到类”错误的另一个问题。我丢失了某些东西,或者我误解了PSR-4逻辑。我的作曲家库目录结构:“扫描仪” =>“ src” =>“ Test.php”Test.phpnamespace MyNS; class Test { } composer.json"autoload": { "psr-4"…

从缓存加载作曲家 - php

我在使用composer安装/卸载laravel中的某些依赖项时遇到问题,这些依赖项从composer.json删除并删除了他们的供应商文件夹后又回来了,我最初使用dflydev的markdown包,但现在我想将其更改为michelf的php-markdown,但是我无法卸载旧版本,因为它是从缓存中重新加载的,我在AppData\Roaming\Compos…

最新的symfony安装程序与作曲者 - php

我想知道使用上次出现的新symfony安装程序和旧作曲家创建新的symfony项目时有什么区别。我同时安装了最新版本的symfony(2.6.1),结果却有所不同,例如,当我用composer安装symfony时,会得到.gitignore文件。当我使用新的symfony安装程序脚本进行安装时,缺少gitignore。以下是新鲜项目中的目录和文件数量:sym…

创建作曲家软件包时,我应该选择哪种“软件包类型” - php

我正在创建我的第一个PHP Composer软件包(在these instructions之后)。我跑了$ composer init 并填写详细信息,现在正在询问我 包类型(例如库,项目,元包,composer-plugin)[]:我以为这只是用于分类不同包装的易于理解的标签?我想知道某个地方是否有包类型的定义? 参考方案 我发现这是发布问题: 作曲家软件…

如何从php中获取datatables jQuery插件的json数据 - php

我是PHP的新手,正在尝试使用Datatables jQuery插件。我知道我必须从.php文件中获取数据,然后在数据表中使用它,但是我似乎无法通过ajax将其传递给数据表。我设法从数据库中获取数据,并对其进行json编码,但是后来我不知道如何在我的index.php文件中调用它,并在其中显示它。我究竟做错了什么?这是我的代码:HTML(已编辑): <…