2015-08-03 2 views
0

Я пытаюсь использовать некоторые файлы из другого пространства имен внутри одного из моих собственных пространств имен, однако он не распознает исключения из пространства имен Defuse\Crypto.PHP - использование пространства имен в другом пространстве имен

Я проверил все файлы, и все там прекрасно хранилось в моем каталоге. Я могу включить автозагрузчик без исключений.

Что я могу сделать для чистого использования обоих пространств имен в одном файле?

Вот мой код:

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; 
     } 
    } 
} 

ответ

0

Конечно, вы можете использовать пространства имен в классах. Но начинать с корня с ведущими \

Попробуйте это:

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

После пространств имен включены, вы можете использовать их. Если вы хотите использовать пространство имен часто (более одного раза), включите пространства имен в верхней части. В противном случае вы можете использовать полный путь в том месте, где вам нужно.

Кроме того, по соображениям мобильности используйте макс. 1.

Измените первую строку в:

namespace myNamespace; 

и удалите вторую строку пространства имен!

+0

Что вы имеете в виду? У меня нет пространства имен под названием 'Namespace' – mightyspaj3

+0

Я просто сделал это, и он не сработал. – mightyspaj3

0

Три варианта: либо вы указываете полное (так абсолютное) пространство имен непосредственно:

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

Или использовать относительное пространство имен внутри текущего активного пространства имен:

catch (Exception\CryptoTestFailedException $ex) 

Или вы должны объявите пространство имен под псевдонимом для внутреннего использования так же, как @HenriS. предложено выше:

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

В общем ничего не говорит против использования нескольких пространств имен в одном файле, который является общим. Но я согласен с @HenriS. здесь, что не хорошая практика для создания отдельного пространства имен для исключений.

+0

Это библиотека, которую я использую, я не делал исключений – mightyspaj3

+0

OK, тогда вы должны импортировать верхний уровень пространства имен внутри вашего файла. Итак, разместите пространство имен _your вверху (вы можете использовать только одно активное пространство имен), а затем используйте оператор 'use' для импорта всех пространств имен из библиотеки в качестве псевдонимов, которые затем можно использовать внутри вашего класса. так как третий случай в моем ответе с вашим собственным пространством имен сверху. – arkascha

+0

Хорошо, я сделал это, и он все еще не работает. – mightyspaj3

Смежные вопросы