You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP自定义异常层级报错:ServiceDenied类未找到如何解决?

PHP异常类找不到问题排查与修复

问题背景

我尝试定义一个简单的异常层级:

Exception -> ServiceDenied -> IpBlocked

两个异常类文件位于同一文件夹src/exceptions/下,代码如下:

ServiceDenied.php

<?php
namespace Morpher\Ws3Client;

class ServiceDenied extends \Exception
{
    function __construct(string $message, int $code)
    {
        parent::__construct($message, $code);
    }
}

IpBlocked.php

<?php
namespace Morpher\Ws3Client;

use Morpher\Ws3Client\ServiceDenied; // IDE标灰提示该use语句多余

class IpBlocked extends ServiceDenied // 此处报错
{
    function __construct(string $message, int $code)
    {
        parent::__construct($message, $code);
    }
}

错误信息

运行单元测试时出现以下错误:

Error : Class 'Morpher\Ws3Client\ServiceDenied' not found
 C:\Code\morpher-ws3-php-client\src\exceptions\IpBlocked.php:6
 C:\Code\morpher-ws3-php-client\vendor\composer\ClassLoader.php:571
 C:\Code\morpher-ws3-php-client\vendor\composer\ClassLoader.php:428

即使移除标灰的use语句,仍然提示找不到ServiceDenied类。

问题原因

核心问题是命名空间与文件实际路径不匹配,违反了PHP PSR-4自动加载规范:

  • 类的命名空间是Morpher\Ws3Client,按照PSR-4规则,Composer会在src/目录下查找对应类文件(假设composer.json配置了Morpher\Ws3Client\对应src/)。
  • 但实际ServiceDenied.php和IpBlocked.php放在src/exceptions/子目录下,Composer无法在预期路径找到类文件,导致加载失败。

IDE标灰use语句是正常的——两个类在同一命名空间下,use语句确实多余,可以直接删除。

修复方案

方案一:调整文件路径(最简单)

将ServiceDenied.php和IpBlocked.php直接移动到src/目录下,让文件路径与命名空间完全匹配:

  • src/ServiceDenied.php → 对应命名空间Morpher\Ws3Client
  • src/IpBlocked.php → 对应命名空间Morpher\Ws3Client

方案二:修改命名空间并更新Composer配置

如果想保留src/exceptions/目录结构,按以下步骤操作:

  1. 修改两个类的命名空间为Morpher\Ws3Client\Exceptions:

    // ServiceDenied.php 和 IpBlocked.php 顶部都改成
    namespace Morpher\Ws3Client\Exceptions;
    

    IpBlocked类可以直接去掉use语句,直接继承:

    class IpBlocked extends ServiceDenied { ... }
    
  2. 打开项目根目录的composer.json,确保autoload部分包含正确的PSR-4映射:

    {
        "autoload": {
            "psr-4": {
                "Morpher\\Ws3Client\\": "src/"
            }
        }
    }
    

    (因为src/exceptions/是src/的子目录,Morpher\Ws3Client\Exceptions会自动对应到src/exceptions/)

  3. 执行以下命令更新Composer自动加载缓存:

    composer dump-autoload
    

两种方案任选其一,都能解决类找不到的问题。

内容的提问来源于stack exchange,提问作者Sergey Slepov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 22:11:05