Проблемы с пространством имен PHP

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

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

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

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

Любой способ заставить это работать без модификаций?

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

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


person johnlemon    schedule 17.03.2011    source источник


Ответы (2)


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

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.

person Gordon    schedule 17.03.2011

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

person MightyE    schedule 17.03.2011