Я пытаюсь добавить следующую библиотеку (ссылка на сайт) в свой проект Symfony с помощью композитора.
Я сбежал
composer require jaggedsoft/php-binance-api
без проблем, но при загрузке страницы появляется следующая ошибка.
Attempted to load class "API" from namespace "App\Controller\Binance". Did you forget a "use" statement for another namespace?
public function index(){
require '../vendor/autoload.php';
$api = new Binance\API("<api key>","<secret>");
}
Теперь я предполагаю, что мне нужно добавить оператор использования, но я немного зациклился на том, что мне нужно добавить.
Если я добавлю «используйте App \ Controller \ Binance;» Я все еще получаю то же сообщение об ошибке
Дело в том, что ваш файл имеет пространство имен App\Controller, поэтому предполагается, что все, что не определено иначе, находится в этом пространстве имен. Binance\API например нет.
Оператор require vendor / autoload находится в самом верху самого первого загруженного файла. Вы бы не поместили его в вызов метода. Ничего общего с пространствами имен или операторами использования.
@Cerad, я проверил файл index.php, и он уже включает требование DIR. '/ .. / vendor / autoload.php'; Итак, я убрал эту строку, но я все еще пытаюсь загрузить класс «API» из пространства имен «App \ Controller \ Binance». Вы забыли инструкцию use для другого пространства имен?
Мне интересно, нужно ли мне что-то добавить или объявить где-то еще в рамках.
Удалось решить эту проблему, мне нужно было включить «использовать Binance»; вверху файла
Рад, что у тебя все получилось. Я предполагаю, что код, который вы разместили в своем вопросе: new Binance \ API (); на самом деле был просто новым API (); Отсюда необходимость в заявлении об использовании.






Чтобы повторить то, что я предложил в комментариях (варианты 1 и 3 ниже):
Пространство имен вашего файла - хотя оно явно не написано в вашем сообщении - это:
App\Controller
без какого-либо оператора use, new Binance\API(...) интерпретируется как:
App\Controller\Binance\API
который представляет собой конкатенацию App\Controller (ваше пространство имен) и Binance\API (используемое имя класса).
что, конечно, не то, что вы хотите использовать, так как это то, что вы пытались включить из пакета binance. Это также объясняет сообщение об ошибке.
Attempted to load class
APIfrom namespaceApp\Controller\Binance. Did you forget ausestatement for another namespace?
что именно пошло не так. PHP попытался загрузить App\Controller\Binance\API, который является классом API из пространства имен App\Controller\Binance.
Теперь есть несколько разных способов исправить это:
use Binance; в заголовок вашего файла, тогда вы можете использовать new Binance\API(...)use Binance\API; в заголовок вашего файла, тогда вы можете использовать new API(...)use, тогда вы можете использовать new \Binance\APi(...)use Binance as Something; в заголовок вашего файла, затем вы можете использовать new Something\API(...); (псевдоним родительского пространства имен Binance, поскольку Something может разрешать конфликты имен)use Binance\API as BinanceApi; в заголовок вашего файла, тогда вы можете использовать new BinanceApi(...);Вы решили использовать вариант 1. Что предпочтительнее, если класс (в данном случае API) сам по себе не очень выразительный или уникальный - то же самое и с вариантом 5. Однако, если вы используете больше классов из пространства имен Binance, вариант 1 предпочтительнее.
Вариант 3 будет работать с всегда (и может показаться предпочтительным, если какой-либо из других вариантов по какой-то причине кажется излишним) - вы вообще можете обойтись без какого-либо оператора use, но его чтение и запись может вызвать разочарование.
В целом, все варианты жизнеспособны, и решать какой использовать. Смешивание этих вариантов может привести к путанице. Внутри Symfony я чаще всего видел вариант 2 со случайным псевдонимом (use ... as ...;), особенно при использовании аннотаций DoctrineORM или при расширении некоторого класса, который имеет то же имя класса, но в другом пространстве имен:
namespace [package1];
use [package2]\[ClassName] as Base[ClassName];
class [ClassName] extends Base[ClassName] { ... }
Надеюсь, это объяснение поможет. Документация php для пространств имен действительно полезна, если вы понимаете основную концепцию пространств имен.
Спасибо за объяснение, это очень помогает
вы можете либо префикс \ so
new \Binance\Api, либо использовать операторы использования, как предлагает php ^^, по-видимому, достаточно просто добавитьuse Binanceпосле вашего пространства имен.