PHP - 在另一个命名空间中使用命名空间

时间:2015-08-03 05:48:08

标签: php namespaces

我正在尝试使用我自己的一个命名空间中的另一个命名空间中的一些文件,但是它没有识别Defuse\Crypto命名空间中的异常。

我检查了所有文件,一切都存放在我的目录中。我也可以包括自动加载器,也没有例外。

如何在同一个文件中干净地使用两个命名空间?

这是我的代码:

namespace Defuse\Crypto;

$path = '/my/path/to/DefuseCrypto/autoloader';
require_once $path;

use \Defuse\Crypto\Crypto;
use \Defuse\Crypto\Exception as Ex;

namespace myNamespace;

class myClass
{
    static function encrypt_key($key)
    {
        try
        {
            $ciphertext = Crypto::encrypt($key, $privateKey);
            return $ciphertext;
        }
        catch (Ex\CryptoTestFailedException $ex)
        {
            return false;
        }
        catch (Ex\CannotPerformOperationException $ex)
        {
            return false;
        }
    }

    static function decrypt_key($key)
    {
        try
        {
            $decryptedKey = Crypto::decrypt($key, $privateKey);
            return $decryptedKey;
        }
        catch (Ex\InvalidCiphertextException $ex)
        {
            return false;
        }
        catch (Ex\CryptoTestFailedException $ex)
        {
            return false;
        }
        catch (Ex\CannotPerformOperationException $ex)
        {
            return false;
        }
    }
}

2 个答案:

答案 0 :(得分:0)

当然,您可以在类中使用命名空间。但是你从带有前导\

的root开始

试试这个:

{{1}}

包含名称空间后,您可以使用它们。如果要经常使用命名空间(超过1次),请在顶部包含命名空间。否则,您可以在需要的地方使用完整路径。

此外,出于可维护性原因,请使用max。 1个命名空间行。

更改您的第一行:

{{1}}

删除第二个命名空间行!

答案 1 :(得分:0)

三个选项:要么直接指定完全限定(绝对)命名空间:

catch (\Defuse\Crypto\Exception\CryptoTestFailedException $ex)

或者在当前活动的命名空间中使用相对命名空间:

catch (Exception\CryptoTestFailedException $ex)

或者你必须在@HenriS的内部用法的别名下声明命名空间。建议如上:

use Defuse\Crypto\Exception as Ex;
[...]
catch (Ex\CryptoTestFailedException $ex)

一般来说,没有什么可以反对在一个文件中使用多个名称空间,这很常见。但我同意@HenriS。在这里,是为异常创建单独命名空间的好习惯。