【问题标题】:PHP - using a namespace in another namespacePHP - 在另一个命名空间中使用一个命名空间
【发布时间】:2015-08-03 05:48:08
【问题描述】:

我正在尝试在我自己的命名空间中使用来自另一个命名空间的一些文件,但是它无法识别来自 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;
        }
    }
}

【问题讨论】:

    标签: php namespaces


    【解决方案1】:

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

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

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

    catch (Exception\CryptoTestFailedException $ex)
    

    或者您必须在别名下声明命名空间以供内部使用,就像@HenriS 一样。以上建议:

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

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

    【讨论】:

    • 这是我正在使用的库,我没有例外
    • 好的,那么您应该在文件中导入顶级名称空间。因此,将 your 命名空间放在顶部(您只能使用一个活动命名空间),然后使用 use 语句将库中的所有命名空间作为别名导入,然后您可以在类中使用它们。就像我回答中的第三种情况一样,上面有你自己的命名空间。
    • “仍然无法正常工作”从未帮助任何人随时随地找到问题。 这是什么意思?准确地说!会发生什么?您收到错误消息吗?那就告诉我们吧!
    • 对不起。给你PHP Fatal error: Class 'Defuse\Crypto\Exception\CannotPerformOperationException' not found
    • 那条线在哪里?在将名称空间导入别名时在文件顶部,或者您是否尝试在文件代码中使用合格的名称空间?请将您当前的代码添加到您的问题中,以便我们知道您在说什么。我建议你在底部画一条水平线,在此处添加由于建议而导致的更改的备注,然后发布代码的当前状态。谢谢。
    【解决方案2】:

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

    试试这个:

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

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

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

    改变你的第一行:

    namespace myNamespace;
    

    并删除第二个命名空间行!

    【讨论】:

    • 什么意思?我没有名为 Namespace 的命名空间
    猜你喜欢
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多