我试图将此错误处理类实现到我的php网站https://github.com/niteshapte/advanced-error-exception-handler-logger-php,但我一直收到错误
PHP致命错误:Trait' SingletonTrait'在第37行的www.example.com/application/core/ErrorExceptionHandler.php中找不到。
第37行是第二个use SingletonTrait;
语句。
我只是把头围绕着名称空间,然后出现了特征!
我的代码如下......为了简洁,我删除了很多代码,但可以在上面的github网址上查看完整的代码。
你能发现我做错了吗?
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 Utilities\ErrorExceptionHandler;
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。
答案 0 :(得分:1)
删除use SingletonTrait
内的初始ErrorExceptionHandler.php
声明,它将对您有效。
使用类定义之外的use
语句声明特征是没有意义的。关于特征的官方PHP文档有关于此的评论,您可以在下面看到并直接阅读here:
请注意,traits(在类中)的“use”运算符和名称空间(类外)的“use”运算符以不同方式解析名称。命名空间的“use”始终将其参数视为绝对(从全局命名空间开始)
答案 1 :(得分:1)
另外值得注意的是,请调整autoload
部分:
{
autoload": {
"psr-4": {
"": [
"application/core/",
"application/model/"
],
"Utilities\\": "application/core/",
}
}
}
类SingletonTrait
和FrameworkException
位于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 Utilities\SingetonTrait;
if(!defined('DIRECT_ACCESS')) {
die("Direct access is forbidden.");
}
class ErrorExceptionHandler implements IUtilities
{
use SingletonTrait;
....
}