Я немного запутался в использовании пространств имен в php, попытался бы объяснить, используя проблему, с которой я столкнулся с одним из моих проектов
У меня есть класс под пространством имен, как
namespace BigBlueButton;
class BigBlueButton
{
public function createMeeting($createMeetingParams, $xml = '')
{
//some code
return new CreateMeetingResponse($xml);
}
}
Я использую это как
use \BigBlueButton;
$bbb = new BigBlueButton\BigBlueButton();
//then I try to reference the variable $bbb in a function but I can't
function easymeet_create_meeting($id) {// $bbb = new BigBlueButton\BigBlueButton(); I don't want to create a new object here but reference the object I created above,something like this
$bbb=BigBlueButton\bbb;
}
Но я не могу получить доступ к вышеупомянутой переменной, т.е. $ bbb, я пытался global $bbb
,но $bbb
кажется, не в глобальном пространстве имен, я понимаю, что я пытаюсь получить доступ к постоянной $ bbb в приведенном выше коде, но я все равно показал это, чтобы сказать, что я пытаюсь сделать
Пространство имен не распространяется на такие переменные:
В мире PHP пространства имен предназначены для решения двух проблем, которые
авторы библиотек и приложений сталкиваются при создании
повторно используемые элементы кода, такие как классы или функции:
- Конфликты имен между создаваемым кодом и внутренними классами / функциями / константами PHP или сторонними
классы / функции / константы.- Возможность псевдонима (или сокращения) Extra_Long_Names предназначена для облегчения первой проблемы, улучшения читаемости исходного кода.
http://php.net/manual/en/language.namespaces.rationale.php
Ваше объявление класса в порядке, но вы неправильно использовали use
ключевое слово, поскольку оно должно ссылаться на конкретные классы, а не на пространство имен.
use \BigBlueButton\BigBlueButton;
function easymeet_create_meeting($id, BigBlueButton $bbb) {
/* ... */
}
$bbb = new BigBlueButton();
$result = easymeet_create_meeting(1234, $bbb);
Вы заметите, что я тоже переехал $bbb
в параметры функции, потому что глобальное государство это дьявол. Это также типа намекали потому что почему нет?
Еще лучше:
class BigBlueButton implements ButtonInterface {}
class BigRedButton implements ButtonInterface {}
А также:
function easymeet_create_meeting($id, ButtonInterface $bbb) {}
$result[] = easymeet_create_meeting(1234, new BigBlueButton());
$result[] = easymeet_create_meeting(5678, new BigRedButton());
И теперь мы смотрим на зачатки Внедрение зависимости, это хорошая привычка.
Если я правильно понимаю, проблема не в пространстве имен.
Как вы сказали, вы можете попробовать использовать глобальную переменную, например:
use \BigBlueButton;
global $bbb;
$bbb = new BigBlueButton\BigBlueButton();
function easymeet_create_meeting($id) {
global $bbb;
// you can use it
}
или вы можете отправить переменную в функцию
function easymeet_create_meeting($id, $bbb) {
}
Я не знаю всей проблемы, но вы также можете использовать шаблон одноэлементного проектирования в классе, чтобы вы всегда получали один и тот же экземпляр каждый раз, когда используете его.