代码之家  ›  专栏  ›  技术社区  ›  Damian

PSR4 Composer自动加载致命错误:未找到特征

  •  1
  • Damian  · 技术社区  · 7 年前

    https://github.com/niteshapte/advanced-error-exception-handler-logger-php 但我一直在犯错误

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

    第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;
    ....
    }
    

    <?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/"
        }
    }
    

    一旦我把它上传到我的服务器上,我就会发布 composer dump-autoload 在我的PuTTY命令行。

    <?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 回复  |  直到 7 年前
        1
  •  2
  •   Peter Featherstone    7 年前

    删除首字母 use SingletonTrait 内部声明 ErrorExceptionHandler.php 它会对你有用。

    特征并不是真的有意义 use 类定义之外的语句。官方PHP文档中有一条关于traits的评论,您可以在下面看到并直接阅读 here :

        2
  •  1
  •   localheinz    7 年前

    同样值得注意的是,调整您的 autoload

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

    课程 SingletonTrait FrameworkException Utilities 命名空间,因此它们已经被 Utilities\\ application/core .

    同样的原因建议删除 (已由回答) ),因为该名称的特征不存在于根命名空间中,而是在 公用事业

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

    或者,您可以调整import语句,但同样,因为我们已经在 公用事业

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