0

私はSymfony2プロジェクトに取り組んでいます。有用な技術的実践のために、外部ライブラリをインポートする必要があります。だから私はそれをしました。ただし、このライブラリは、Exceptionから拡張するsomes*_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はこれを返します:

致命的なエラー:クラス'CD \ DMBundle \ Entity\Exception'が/var/www/carpediese/src/CD/DMBundle/Entity/CloudKey.phpの513行目に見つかりません

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 に答える