【问题标题】:Symfony2 extends Exception classSymfony2 扩展了异常类
【发布时间】:2013-02-04 14:31:52
【问题描述】:

我正在做一个 Symfony2 项目。对于有用的技术实践,我需要导入外部库。所以我做到了。但是这个库创建了一些从 Exception 扩展的 *_Exception 类。

我的外部库文件以:

结尾
class CloudKey_Exception extends Exception {}
class CloudKey_RPCException extends CloudKey_Exception {public $data = null;}
class CloudKey_ProcessorException extends CloudKey_RPCException {}
class CloudKey_TransportException extends CloudKey_RPCException {}
class CloudKey_SerializerException extends CloudKey_RPCException {}
class CloudKey_AuthenticationErrorException extends CloudKey_RPCException {}
class CloudKey_RateLimitExceededException extends CloudKey_AuthenticationErrorException {}

class CloudKey_InvalidRequestException extends CloudKey_RPCException {}
class CloudKey_InvalidObjectException extends CloudKey_InvalidRequestException {}
class CloudKey_InvalidMethodException extends CloudKey_InvalidRequestException {}
class CloudKey_InvalidParamException extends CloudKey_InvalidRequestException {}

class CloudKey_ApplicationException extends CloudKey_RPCException {}
class CloudKey_NotFoundException extends CloudKey_ApplicationException {}
class CloudKey_ExistsException extends CloudKey_ApplicationException {}
class CloudKey_LimitExceededException extends CloudKey_ApplicationException {}

当我尝试在控制器中实例化我的对象时,Symfony 会返回:

致命错误:在第 513 行的 /var/www/carpediese/src/CD/DMBundle/Entity/CloudKey.php 中找不到类“CD\DMBundle\Entity\Exception”

我认为异常类是原生 PHP5+ 类。我怎样才能告诉 Symfony?

【问题讨论】:

  • \Exception 是本机定义的。来自namespace docs,“导入规则是基于每个文件的,这意味着包含的文件不会继承父文件的导入规则”。因此,CloudKey_Exception 文件内部肯定有问题,可能是use 语句。我们可以看到代码吗?
  • this 是您指的文件吗?如果是这样,那里似乎根本没有任何命名空间引用 - 你修改了吗?
  • 我在 Exception [...] extends \Exception {} 之前添加了一个斜杠所以这个错误消失了。但是另一个出现了:Fatal error: Class 'CloudKey_Api' not found in /var/www/carpediese/src/CD/DMBundle/Entity/CloudKey.php on line 46 是的,这是这个文件(DMCloud API)。我在文件顶部添加namespace CD\DMBundle\Entity;
  • 如果你不得不编辑这个文件,然后向维护者提出拉取请求,这样其他人就不会遇到同样的问题。
  • 我不会拉我的更改,如果你制作 natif PHP,你不需要使用命名空间(不是必需的),你不需要更改文件。如果你使用框架,你必须知道如何在你的框架中添加外部库。谢谢大家:)

标签: php exception symfony namespaces


【解决方案1】:

记得在使用Exception 类的文件中正确设置use 语句。

编辑:

当您在namespace 声明下方引用 PHP 5.3+ 中的任何类时,您需要添加要用于被引用类的命名空间(或在引用该类时使用整个命名空间)。因此,如果您使用的 Exception 类属于 someLibrary\ClouKey\Exceptions\ 命名空间,您应该拥有

use someLibrary\CloudKey\Exceptions\Exception;

在文件的开头,就在namespace 的下方,或者在定义新类时使用整个命名空间:

class CloudKey_Exception extends someLibrary\CloudKey\Exceptions\Exception {}

编辑 2:

在您使用的类中,Exception 确实是原生 PHP 类,所以应该使用 \Exception。你得到的错误是由CloudKey类的这一部分产生的:

public function __get($name)
{
    if (!isset($this->objects[$name]))
    {
        $class = 'CloudKey_' . ucfirst($name);
        if (!class_exists($class))
        {
            $class = 'CloudKey_Api';
        }
        $this->objects[$name] = new $class($this->user_id, $this->api_key, $this->base_url, $this->cdn_url, $name, $this->proxy, $this->timeout);
        $this->objects[$name]->parent = $this;
    }

    return $this->objects[$name];
}

根据文档(http://php.net/manual/en/language.oop5.basic.php):

如果包含类名的字符串与 new 一起使用,则会创建该类的新实例。如果该类位于命名空间中,则在执行此操作时必须使用其完全限定名称。

因此,您必须编辑代码的引用部分以使用字符串中的整个命名空间作为类名。

【讨论】:

  • 在这种情况下该语句应该是什么样的?
  • 我已经编辑了答案以使其更清晰 - 第一个版本有点过于简洁;)
  • 啊,我以为这个库是在扩展核心\Exception?代码的链接在我的问题下的评论中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 2013-04-01
相关资源
最近更新 更多