Проблемы с пространствами имен PHP - PullRequest
7 голосов
/ 17 марта 2011

Я пытаюсь использовать внешнюю библиотеку. Поскольку есть некоторые конфликты, я использую пространства имен (php 5.3)

Цель - вообще не изменять внешнюю библиотеку (просто добавляя пространства имен вверху)

Проблема в библиотеке, есть несколько ситуаций, которые не работают

  • is_a($obj,'3thpartyclassname') работает, только если я добавляю пространство имен перед 3thpartyclassname
  • третья сторона использует собственные классы, но они не работают, только если я применил глобальное пространство (new \Exception)

Есть ли способ заставить эту работу работать без изменений?

Обновление использовать \ Exception в качестве исключения; решить проблему 2

У меня проблемы только с is_a и is_subclass_of. Им обоим нужно пространство имен, и они игнорируют текущее пространство имен.

Ответы [ 2 ]

12 голосов
/ 17 марта 2011

Нет, вам нужно внести некоторые изменения

namespace My\Own\Namespace;                // declare your own namespace
use My\ThirdParty\Component;               // import 3rd party namespace
$component = new Component;                // create instance of it
var_dump(is_a($component, 'Component'));   // FALSE
var_dump($component instanceof Component); // TRUE

Методы is_a и is_subclass_of требуют, чтобы вы указали полное имя класса (включая пространство имен).Насколько мне известно, с PHP 5.3.5 это никак не обойти.Использование instanceof должно решить обе базы.

Импорт собственных классов, например, Exception, также должен работать, например,

namespace My\Own\Namespace;
use \Exception as Exception;
throw new Exception('something broke');

См. Главу Пространство имен в руководстве по PHP для получения дополнительной информации.

0 голосов
/ 17 марта 2011

Не думаю, что есть какой-либо способ заставить is_a () уважать относительные пространства имен (например, текущее пространство имен или пространство имен, импортированное с помощью команды use).Это потому, что он принимает строковый аргумент и выполняется в другом контексте.Вместо этого вам нужно переключиться на синтаксис instanceof.Так что нет, я не думаю, что это поможет вам избежать коллизий между библиотеками, которые написаны в глобальном пространстве имен, вам все равно придется находить подобные экземпляры и обращаться к ним напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...