namespaces — пространства имен в переполнении стека

Я немного запутался в использовании пространств имен в 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 в приведенном выше коде, но я все равно показал это, чтобы сказать, что я пытаюсь сделать

1

Решение

Пространство имен не распространяется на такие переменные:

В мире PHP пространства имен предназначены для решения двух проблем, которые
авторы библиотек и приложений сталкиваются при создании
повторно используемые элементы кода, такие как классы или функции:

  1. Конфликты имен между создаваемым кодом и внутренними классами / функциями / константами PHP или сторонними
    классы / функции / константы.
  2. Возможность псевдонима (или сокращения) 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());

И теперь мы смотрим на зачатки Внедрение зависимости, это хорошая привычка.

2

Другие решения

Если я правильно понимаю, проблема не в пространстве имен.

Как вы сказали, вы можете попробовать использовать глобальную переменную, например:

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) {

}

Я не знаю всей проблемы, но вы также можете использовать шаблон одноэлементного проектирования в классе, чтобы вы всегда получали один и тот же экземпляр каждый раз, когда используете его.

0

По вопросам рекламы [email protected]