Php 不应静态调用非静态方法RequestParamsMain::buildFullURL()

Php 不应静态调用非静态方法RequestParamsMain::buildFullURL(),php,class,static,etrade-api,Php,Class,Static,Etrade Api,我使用的是etrade api,它构建在静态调用许多函数的许多类之上。因此,如果我将其更改为“publicstaticfunction”,我将继续得到这些错误。以下是完整的错误消息: 不应静态调用非静态方法RequestParamsMain::buildFullURL(),假设第72行/home/detroitclicks/public\u html/etrade/Market/MarketClient.class.php中不兼容的上下文中的$this 下面是类Market下该函数的代码。Req

我使用的是etrade api,它构建在静态调用许多函数的许多类之上。因此,如果我将其更改为“publicstaticfunction”,我将继续得到这些错误。以下是完整的错误消息:

不应静态调用非静态方法RequestParamsMain::buildFullURL(),假设第72行/home/detroitclicks/public\u html/etrade/Market/MarketClient.class.php中不兼容的上下文中的$this

下面是类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);

问题不在您的代码中,而在您使用的API中,因为它静态地调用非静态方法(即
RequestParamsMain::buildFullURL
)。这种调用在旧版本的PHP中是允许的,并且没有生成警告消息,但在新版本(如5.4)中会生成警告消息

您可以考虑以下几种选择:

  • 查找您正在使用的第三方软件的更新版本。如果找不到,就把它扔出窗外,因为它是一堆垃圾,它的作者根本不理解面向对象编程的概念。如果有其他选择,我会建议这个选择

  • 修改您正在使用的第三方软件的源代码。我不建议这样做,因为这可能是一项乏味的工作,甚至可能不符合许可证的要求

    更新:如果它是API中的一个bug,您可以通过检查
    RequestParamsMain::buildFullURL
    是否完全静态使用来修复它,如果是,则将其设置为静态方法。如果它确实不是静态方法,请通过从
    RequestParamsMain
    类中创建一个对象,使调用成为非静态的,例如:

    $request=newrequestparamsmain(/*arguments*/);
    $resourceURL=$request->buildFullURL(URL\u PRODUCTLOOKUP,null,$param\u obj)

    但是,如果存在多个问题,我真的不建议将它们全部检查一遍,因为这很容易会是一个巨大的工作量,并且软件的新版本可能会很容易抹去您的结果。无论如何,向开发人员提供的bug报告在所有情况下都是有用的

  • 打开“严格警告”以隐藏这些错误消息。当然,这不是一个真正的解决方案,只是一个变通办法。例如:

    错误报告(E_ALL^E_STRICT)


  • 根据我使用etrade api的经验,它们都充满了错误。我想主要是因为他们年纪大了


    他们的RESTAPI文档记录得足够好,但并不完美。我建议你自己滚。您可以删除的库依赖项越多越好。

    etrade是游戏中唯一的玩家。唯一的其他选择是上传csv或手动输入数据。在这种情况下,您对修改api有什么建议?我扩展了关于这个主题的回答。