Php 自动加载程序导致找不到类
我正试图在我的wordpress项目中包括一个自动加载器。更具体地说,我正在开发一个插件,其中包含我所有类的类/目录。我希望这些类可以通过名称空间访问我的wordpress项目根目录和子文件/文件夹 我觉得我的composer.json应该负责autoloader实现,尽管我仍然得到一个类notfound致命错误。还有其他人遇到过这个问题吗?我感谢您提前提出的任何建议 这就是我迄今为止所尝试的: /composer.jsonPhp 自动加载程序导致找不到类,php,wordpress,composer-php,autoload,Php,Wordpress,Composer Php,Autoload,我正试图在我的wordpress项目中包括一个自动加载器。更具体地说,我正在开发一个插件,其中包含我所有类的类/目录。我希望这些类可以通过名称空间访问我的wordpress项目根目录和子文件/文件夹 我觉得我的composer.json应该负责autoloader实现,尽管我仍然得到一个类notfound致命错误。还有其他人遇到过这个问题吗?我感谢您提前提出的任何建议 这就是我迄今为止所尝试的: /composer.json { "autoload": {
{
"autoload": {
"psr-4": {
"Classes\\": "wp-content/plugins/example-plugin/Classes"
}
},
"require": {}
}
然后
composer安装
./index.php(在wordpress根目录中)
./wp content/plugins/example plugin/Classes/MyService.php
namespace Classes;
class MyService {
是的,的确,composer应该负责您的依赖项和自动加载。您的配置也是正确的。让我们浏览一个检查列表: 您的环境是这样的吗
$ tree
.
├── composer.json
├── composer.phar
├── index.php
├── vendor
│ ├── autoload.php
│ └── composer
│ ├── autoload_classmap.php
│ ├── autoload_namespaces.php
│ ├── autoload_psr4.php
│ ├── autoload_real.php
│ ├── autoload_static.php
│ ├── ClassLoader.php
│ ├── installed.json
│ └── LICENSE
└── wp-content
└── plugins
└── example-plugin
└── Classes
└── MyService.php
$ cat composer.json
{
"name": "my/project",
"authors": [
{
"name": "My Name",
"email": "my@na.me"
}
],
"autoload": {
"psr-4": {
"Classes\\": "wp-content/plugins/example-plugin/Classes"
}
},
"require": {}
}
$ cat wp-content/plugins/example-plugin/Classes/MyService.php
<?php
namespace Classes;
class MyService {
}
$ cat index.php
<?php
require_once('./vendor/autoload.php');
$foo = new \Classes\MyService;
var_dump($foo);
您的composer.json是这样的吗
$ tree
.
├── composer.json
├── composer.phar
├── index.php
├── vendor
│ ├── autoload.php
│ └── composer
│ ├── autoload_classmap.php
│ ├── autoload_namespaces.php
│ ├── autoload_psr4.php
│ ├── autoload_real.php
│ ├── autoload_static.php
│ ├── ClassLoader.php
│ ├── installed.json
│ └── LICENSE
└── wp-content
└── plugins
└── example-plugin
└── Classes
└── MyService.php
$ cat composer.json
{
"name": "my/project",
"authors": [
{
"name": "My Name",
"email": "my@na.me"
}
],
"autoload": {
"psr-4": {
"Classes\\": "wp-content/plugins/example-plugin/Classes"
}
},
"require": {}
}
$ cat wp-content/plugins/example-plugin/Classes/MyService.php
<?php
namespace Classes;
class MyService {
}
$ cat index.php
<?php
require_once('./vendor/autoload.php');
$foo = new \Classes\MyService;
var_dump($foo);
您的实现是这样的吗
$ tree
.
├── composer.json
├── composer.phar
├── index.php
├── vendor
│ ├── autoload.php
│ └── composer
│ ├── autoload_classmap.php
│ ├── autoload_namespaces.php
│ ├── autoload_psr4.php
│ ├── autoload_real.php
│ ├── autoload_static.php
│ ├── ClassLoader.php
│ ├── installed.json
│ └── LICENSE
└── wp-content
└── plugins
└── example-plugin
└── Classes
└── MyService.php
$ cat composer.json
{
"name": "my/project",
"authors": [
{
"name": "My Name",
"email": "my@na.me"
}
],
"autoload": {
"psr-4": {
"Classes\\": "wp-content/plugins/example-plugin/Classes"
}
},
"require": {}
}
$ cat wp-content/plugins/example-plugin/Classes/MyService.php
<?php
namespace Classes;
class MyService {
}
$ cat index.php
<?php
require_once('./vendor/autoload.php');
$foo = new \Classes\MyService;
var_dump($foo);
如果答案为“是”,则创建一个新目录,下载composer.phar
,运行php composer.phar init
,将此答案的文件复制并粘贴到该目录中,然后重试
如果这是可行的,那么将
diff
与您的实现结合起来。我的猜测是,如果你走到这一步,你的一个文件中隐藏着一个离群的字符——可能是Unicode空格。PSR-4不要求文件是/wp-content/plugins/example-plugin/Classes/Api/MyService.php
(特别注意Api
目录)?嗨,菲尔,我感谢你的建议,我做了这两个更改,现在仍然很幸运:/(请参见编辑)自从添加自动加载
字段以来,您是否执行了转储自动加载
编写器任务?如果添加require\u一次,会发生什么情况/wp content/plugins/example plugin/Classes/MyService.php'代码>到脚本顶部?感谢您的帮助!你的建议帮了我的忙:)在添加autoloader之前,有一个问题,在示例插件
目录中,我使用了\GuzzleHttp\Client
等类,这些类由位于示例插件/functions/api
中的一个单独的composer.json/autoload.php文件链接,修复上述问题似乎破坏了现有的自动加载程序,您知道为什么会这样,以及我将如何维持现有功能吗?您可以将自动加载定义移动到api子目录的composer.json中,也可以将其自动加载移动到新的composer.json中,或者,您可以确保相应的代码路径使用正确的autoload.php。无论如何,最好让所有代码都同意使用同一个composer.json。我很困惑。只是澄清一下,GuzzleHttp\Client是由composer安装的依赖项,而不是我编写的类。它位于示例插件/functions/api
中的供应商
目录中,该目录与api目录本地的composer.json文件的位置相同。我尝试将psr-4定义移动到该文件,但没有成功。。。我不知道如何使/vendor
类和私有类同时工作。因此,在api子目录中有一个composer.json文件。您确实可以拥有自己的PSR-4自定义类。听起来新的自动加载条款打破了以前的定义。检查差异?是的,没错。我需要两者都去工作,似乎其中一个占了上风。这些文件被忽略,所以我没有差异。我想知道我的composer.json中是否可以有多个psr子句,一个指向类,一个指向供应商。。?