PSR4 Composer Autoload致命错误:未找到特征

时间:2017-07-20 17:06:12

标签: php composer-php autoload psr-4

我试图将此错误处理类实现到我的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。

2 个答案:

答案 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/",
        }
    }
}

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 Utilities\SingetonTrait;

if(!defined('DIRECT_ACCESS')) {
    die("Direct access is forbidden.");
}

class ErrorExceptionHandler implements IUtilities 
{
    use SingletonTrait;

    ....
}