PSR4 编辑器自动加载致命错误:未找到特征



我正在尝试在我的 php 网站中实现此错误处理类 https://github.com/niteshapte/advanced-error-exception-handler-logger-php 但我不断收到错误

PHP 致命错误:在第 37 行的 www.example.com/application/core/ErrorExceptionHandler.php 中找不到特征"SingletonTrait"。

第 37 行是第二个use SingletonTrait;语句。

我只是刚刚对命名空间进行了思考,然后特征就出现了!

我的代码在下面....为了简洁起见,我已经删除了很多代码,但完整的代码可以在上面的 github URL 中查看。

你能发现我做错了什么吗?

www.example.com/application/core/ErrorExceptionHandler.php 来源

<?php
namespace Utilities;
use SingletonTrait;
if(!defined('DIRECT_ACCESS')) {
die("Direct access is forbidden.");
}
class ErrorExceptionHandler implements IUtilities {
// Singleton instance - the line below generates the error
use SingletonTrait;
....
}

www.example.com/application/core/SingletonTrait.php 来源

<?php
namespace Utilities;
use FrameworkException;
if(!defined('DIRECT_ACCESS')) {
die("Direct access is forbidden.");
}
trait SingletonTrait {
.....
}

www.example.com/application/core/FrameworkException.php 来源

<?php
namespace Utilities;
if(!defined('DIRECT_ACCESS')) {
die("Direct access is forbidden.");
}
class FrameworkException extends Exception { }

www.example.com/application/core/IUtilities.php 来源

<?php
namespace Utilities;
if(!defined('DIRECT_ACCESS')) {
die("Direct access is forbidden.");
}
interface IUtilities { }

www.example.com/index.php 来源

<?php
require '../vendor/autoload.php';
use UtilitiesErrorExceptionHandler;
define("DIRECT_ACCESS", TRUE);
ErrorExceptionHandler::getInstance();

这就是我 www.example.com/composer.json

"autoload": {
"psr-4": { "": ["application/core/", "application/model/"],
"Utilities\": "application/core/",
"SingletonTrait\": "application/core/",
"FrameworkException\": "application/core/"
}
}

将其上传到服务器后,我会在我的 PuTTY 命令行发出composer dump-autoload

这将在 www.example.com/vendor/composer/autoload_psr4.php 生成以下源

<?php
// autoload_psr4.php @generated by Composer
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
'phpDocumentor\Reflection\' => array($vendorDir . '/phpdocumentor/reflection-common/src', $vendorDir . '/phpdocumentor/type-resolver/src', $vendorDir . '/phpdocumentor/reflection-docblock/src'),
'Webmozart\Assert\' => array($vendorDir . '/webmozart/assert/src'),
'Utilities\' => array($baseDir . '/application/core'),
'Symfony\Component\Yaml\' => array($vendorDir . '/symfony/yaml'),
'SingletonTrait\' => array($baseDir . '/application/core'),
'Gregwar\Captcha\' => array($vendorDir . '/gregwar/captcha'),
'FrameworkException\' => array($baseDir . '/application/core'),
'Doctrine\Instantiator\' => array($vendorDir . '/doctrine/instantiator/src/Doctrine/Instantiator'),
'DeepCopy\' => array($vendorDir . '/myclabs/deep-copy/src/DeepCopy'),
'' => array($baseDir . '/application/core', $baseDir . '/application/model'),
);

我已经尽可能多地阅读了有关自动加载特征的信息,但我还没有找到答案。

我的命令行PHP版本是5.6.30。

删除ErrorExceptionHandler.php中的初始use SingletonTrait声明,它将对您有用。

在类定义之外使用use语句声明特征实际上没有意义。在官方 PHP 文档中有一个关于此特征的评论,您可以在下面看到并直接阅读 这里:

请注意,特征的"use"运算符

(类内部(和命名空间的"use"运算符(类外部(以不同的方式解析名称。命名空间的"use"始终将其参数视为绝对参数(从全局命名空间开始(

另外值得注意的是,调整您的autoload部分:

{
autoload": {
"psr-4": { 
"": [
"application/core/",         
"application/model/"
],
"Utilities\": "application/core/",
}
}
}

SingletonTraitFrameworkException驻留在Utilities命名空间中,因此它们已被Utilities\application/core的映射所涵盖。

同样的原因建议删除SingletonTrait的导入(正如Peter Featherstone已经回答的那样(,因为该名称的特征在根命名空间中不存在,而是在Utilities命名空间中:

<?php
namespace Utilities;
if(!defined('DIRECT_ACCESS')) {
die("Direct access is forbidden.");
}
class ErrorExceptionHandler implements IUtilities 
{
use SingletonTrait;
....
}

或者,您可以调整 import 语句,但同样,由于我们已经在Utilities命名空间中,这没有任何意义:

<?php
namespace Utilities;
use UtilitiesSingetonTrait;
if(!defined('DIRECT_ACCESS')) {
die("Direct access is forbidden.");
}
class ErrorExceptionHandler implements IUtilities 
{
use SingletonTrait;
....
}

最新更新