Пространства имен в php

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

2 ответа

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

В мире 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());

И теперь мы смотрим на зачатки инъекции зависимости, которая является хорошей привычкой.

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

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

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

}

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

Другие вопросы по тегам