douxuexiao1748 2016-07-13 02:39
浏览 76
已采纳

对象内的PhpStorm对象引用错误对象

I have this code, which works fine

use path\to\class\exampleClass;
class foo {
  public function preparePortalService() {
    $this->portalService = new exampleClass(array(), $this->getWsdl('portal'));
    $portalservice_header = new \SoapHeader($this->getWsdl('portal'), 'SessionHeader', $header);
    // Set the Session Header.
    $this->portalService->__setSoapHeaders($portalservice_header);
  }
}

in another file (which is being autoloaded successfully

namespace path\to\class\exampleClass;

class exampleClass extends \SoapClient {
  public function __construct(array $options = array(), $wsdl = 'wsdl/Interface.xml')
  {}
}

However, I get a 'Field portalService not found in class foo' warning in PhpStorm (Note: not in the error logs, the code works fine).

Why is this, and how can I get it to recognise the object properties and methods?

EDIT: expanded, sorry for the formatting.

To clarify, the class methods and properties autocompletes are accessible through $portalService in PhpStorm if I do this:

$portalService = new exampleClass(array(), $this->getWsdl('portal'));

But if I do this,

$this->portalService = $portalService;

then PhpStorm tells me it can't find it when I try this

$this->portalService->__setSoapHeaders($portalservice_header);
  • 写回答

1条回答 默认 最新

  • dqn8235 2016-07-13 03:11
    关注

    PHPStorm is nagging you because although your code will compile and run, it's not well designed. When you try to assign a new value to $this->portalService, the IDE looks around but cannot find any declaration for class property postalService. In short, you are assigning a value to a property that does not exist.

    The code still runs because PHP, unlike some other languages, will infer that you intended to declare a class property and assign a value to it, even though you never actually declared it. The better design is to add a declaration:

    class foo {
      private $postalService=null; //now you've formally declared the class property
    
      public function preparePortalService() {
        $this->portalService = ... // no problem. this property exists.
      }
    }
    

    You also mentioned that:

    $portalService = new exampleClass... doesn't pose a problem

    That's correct. On this line, you're not referring to a class property (eg: $this->postalService, but you are creating and setting a local variable.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥100 有人会搭建GPT-J-6B框架吗?有偿
  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名