0

我正在做一个 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?

4

1 回答 1

2

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

编辑:

当您在声明下方引用 PHP 5.3+ 中的任何类时,namespace您需要添加要用于被引用类的命名空间(或在引用类时使用整个命名空间)。所以,如果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 一起使用,则将创建该类的新实例。如果该类位于命名空间中,则在执行此操作时必须使用其完全限定名称。

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

于 2013-02-04T14:50:36.893 回答