Я управляю одним и тем же файлом для управления двумя внешними классами 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();