簡體   English   中英

PSR4 Composer Autoload 致命錯誤:未找到特征

[英]PSR4 Composer Autoload Fatal error: Trait not found

我正在嘗試將此錯誤處理類實現到我的 php 網站https://github.com/niteshapte/advanced-error-exception-handler-logger-php但我不斷收到錯誤

PHP 致命錯誤:在第 37 行的 www.example.com/application/core/ErrorExceptionHandler.php 中找不到 Trait '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 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。

刪除ErrorExceptionHandler.php的初始use SingletonTrait聲明,它將為您工作。

在類定義之外use語句聲明特征並沒有真正意義。 在官方 PHP 文檔上有一個關於特征的評論,您可以在下面看到並直接在此處閱讀:

請注意,trait 的“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 Utilities\SingetonTrait;

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

class ErrorExceptionHandler implements IUtilities 
{
    use SingletonTrait;

    ....
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM