Нестатический метод RequestParamsMain::buildFullURL() не должен вызываться статически

Я использую etrade api, который построен на множестве классов, которые вызывают множество функций статически. Следовательно, если я изменю его на «общедоступную статическую функцию», я просто буду получать эти ошибки. Вот полное сообщение об ошибке:

Нестатический метод RequestParamsMain::buildFullURL() не следует вызывать статически, предполагая, что $this из несовместимого контекста в /home/detroitclicks/public_html/etrade/Market/MarketClient.class.php в строке 72

Вот код этой функции в классе Market. Класс RequestParamsMain находится в отдельном файле php, который включен в этот файл:

public function productLookup($param_obj)
{

    self::validateParamObj($param_obj,false);
    $resourceURL = RequestParamsMain::buildFullURL(URL_PRODUCTLOOKUP,null,$param_obj);
    return $this->getMarketResponse($resourceURL);

}

вот код, который я пытаюсь выполнить:

$request_params = new productLookupParams();
$request_params->__set('company', 'cisco'); // company = "cisco" for example
$request_params->__set('type', 'eq'); // type = equity for example
$out= $mc_obj->productLookup($request_params);

person Bruce    schedule 16.11.2014    source источник


Ответы (2)


Проблема не в вашем коде, а в API, который вы используете, потому что он вызывает нестатические методы (а именно RequestParamsMain::buildFullURL) статически. Этот вид вызова был разрешен в более старых версиях PHP и не генерировал предупреждающее сообщение, но он появляется в более новых, например 5.4.

У вас есть несколько вариантов для рассмотрения:

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

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

    Обновление: если это единичная ошибка в API, вы можете исправить ее, проверив, используется ли RequestParamsMain::buildFullURL полностью статически, и если да, сделайте его статическим методом. Если это действительно не статический метод, сделайте вызов нестатическим, создав объект из класса RequestParamsMain, например:

    $request = new RequestParamsMain(/* arguments */); $resourceURL = $request->buildFullURL(URL_PRODUCTLOOKUP,null,$param_obj);

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

  3. Включите строгие предупреждения, чтобы скрыть эти сообщения об ошибках. Конечно, это не настоящее решение, а всего лишь обходной путь. Например.:

    error_reporting(E_ALL ^ E_STRICT);

person mcserep    schedule 16.11.2014
comment
etrade — единственный игрок в игре. Единственным другим вариантом будет загрузка CSV или ввод данных вручную. Что бы вы предложили для изменения API в таких случаях? - person Bruce; 17.11.2014
comment
Я расширил свой ответ на эту тему. - person mcserep; 17.11.2014

По моему опыту работы с etrade API все они полны ошибок. Я полагаю, потому что в значительной степени они старые.

Их REST API документирован достаточно хорошо, но не идеально. Я бы предложил свернуть свой собственный. Чем больше зависимостей библиотеки вы сможете удалить, тем лучше.

person rjs2006    schedule 19.08.2015