Использование пространства имен в операторах if / else

Я управляю одним и тем же файлом для управления двумя внешними классами api.

Один класс api основан на пространствах имен, другой – нет.

Я бы хотел сделать следующее:

if($api == 'foo'){ require_once('foo.php'); } if($api == 'bar'){ require_once('bar.php'); use xxxx\TheClass; } 

Проблема в том, что когда я это делаю, возвращается следующее сообщение об ошибке:

 Parse error: syntax error, unexpected T_USE in etc... 

Вопрос 1: Должен ли я использовать два разных файла для управления двумя классами или можно ли управлять ими при использовании пространств имен в документе? Из того, что я вижу, это не похоже.

Вопрос 2: Почему пространства имен не могут использоваться внутри операторов if ()?

спасибо за помощь

См. Правила определения области импорта

Ключевое слово use должно быть объявлено в самой внешней области файла (глобальной области) или внутри декларации пространства имен. Это связано с тем, что импорт выполняется во время компиляции, а не во время выполнения, поэтому его нельзя блокировать.

Все use – это импорт имени символа в текущее пространство имен. Я бы просто опустил импорт и использовал полное имя класса, например

 switch ($api) { case 'foo' : require_once('foo.php'); $someVar = new SomeClass(); break; case 'bar' : require_once('bar.php'); $someVar = new \xxxx\TheClass(); break; default : throw new UnexpectedValueException($api); } 

Вы также можете просто добавить оператор use в начало своего скрипта. Добавление его не обязывает вас включать любые файлы и не требует, чтобы символ был известен, например

 use xxxx\TheClass; switch ($api) { case 'foo' : require_once('foo.php'); $someVar = new SomeClass(); break; case 'bar' : require_once('bar.php'); $someVar = new TheClass(); // imported above break; default : throw new UnexpectedValueException($api); } 

Операторы использования должны размещаться перед любым исполняемым кодом (вы можете иметь определения пространств имен, классов, функций и констант). На самом деле это может быть просто помещено без каких-либо ограничений в пространстве имен, так что нет, if s или внутренние функции. Также не бойтесь использовать верхнюю часть, он не загружает какой-либо класс или экземпляр объекта. он действует только как псевдоним, который используется, когда встречается позже во время выполнения.

Что касается наличия их в одном файле, в одном файле может быть много пространств имен и даже глобальное пространство имен:

 <?php namespace { class myclass{} } namespace mynamespace { class myclass{} } Пространство <?php namespace { class myclass{} } namespace mynamespace { class myclass{} } 

Но я категорически отвергаю такое «управление» кодом. У каждого класса должен быть собственный файл.

Хорошо, просто подтверждаю, что я сказал правду. Попробуйте что-то вроде этого:

* Test_1.php *

 $API = "test_1"; if ($API === "test"){ }elseif ($API === "test_1"){ require ("test.php"); $API = new daryls\testt; } $API->test(); 

test.php

 namespace daryls; class testt { public function test(){ echo "Started"; } } 

Запуск этого проделал без заминки

Другим вариантом для управления версиями класса API является установка условного обозначения класса как переменной.

 // Get class name switch ($api_version) { case 'v0': // No class namespace $class = 'Handler'; break; case 'v1': // Namespaced class $class = 'API\App\v1\Handler'; break; case 'v2': // Namespaced class $class = 'API\App\v2\Handler'; break; default: throw new Exception('Unknown API version: ' . $api_version); } // Get class object $handler = new $class();