【问题标题】:Auto complete for a variable inside a foreach自动完成 foreach 中的变量
【发布时间】:2012-03-28 01:45:35
【问题描述】:

我有以下代码:

class Orders{
    /**
     *
     * @var Supplier
     */
    private $suppliers; //Array of Supplier

    function loopAllSuppliers(){
        foreach($this->suppliers as $supplier){
            $supplier->/*no suggestion*/ //Can't get the method's to show here

            $this->suppliers->getSupplierName(); //methods in class Supplier show normally here
        }
    }
}

问题很简单。我只想能够为我的变量 $supplier 声明一个类型,就像我使用 $suppliers 所做的那样。

注意事项:

  • Supplier 是一个具有公共方法 getSupplierName() 的类。
  • 我正在使用 Netbeans IDE。

【问题讨论】:

  • 如果您的$suppliersSupplier 的数组,那么您的phpDoc 注释是错误的。在其他 IDE 中,您可以将这样的数组注释为 @var Supplier[],您尝试过吗?
  • @DCoder 是的$suppliersSupplier 的数组,我尝试了@var Supplier[],但它不起作用。实际上将其更改为 @var Supplier[] 并没有为 $this->suppliers-> 显示任何建议
  • 好吧,如果它是一个数组,它实际上并没有任何方法,不是吗?
  • hmmmm 似乎解决方案是在 Netbeans 中找到用于将变量声明为对象数组的注释。但是找不到它的语法。
  • 这里正确的注释/标签语法确实是“var Supplier[]”。这将很快被标准化,并且 IDE 可能会在标准化后的某个时间开始添加基于看到此语法的自动完成功能。

标签: php netbeans autocomplete foreach phpdoc


【解决方案1】:

我可以使用 PHP7 和 PHPStorm:

use path/to/Supplier; //needs the path for your class Supplier

foreach ($suppliers as /* @var $supplier Supplier */ $supplier) {
    echo $supplier->getName(); //Output each Name
}

【讨论】:

    【解决方案2】:

    对我来说这行不通:

    foreach ($suppliers as /* @var $supplier Supplier */ $supplier) {
        $supplier->/*should have suggestions*/
    }
    

    我的解决方案:

    foreach ($suppliers as $supplier) {
        if($suppliers instancof Supplier) {
            $supplier->
        }
    }
    

    【讨论】:

      【解决方案3】:

      您可以通过执行以下操作来实现这一点(在 netbeans 中):

          foreach ($suppliers as /* @var $supplier Supplier */ $supplier) {
              $supplier->/*should have suggestions*/
          }
      

      【讨论】:

        【解决方案4】:

        这应该可行:

        class Orders
        {
            /**
             * @var Supplier[]
             */
            private $suppliers;
        
            public function loopAllSuppliers()
            {
                foreach($this->suppliers as $supplier) {
                }
            }
        }
        

        【讨论】:

          【解决方案5】:
          class Orders{
              /**
               *
               * @var Supplier
               */
              private $suppliers;
          
              function loopAllSuppliers(){
                  foreach($this->suppliers as $supplier){ /* @var $supplier Supplier */
                //Must declare the type again inside the foreach as Netbeans doesn't support
                // defining variable as arrays in doc blocks, yet.
                  }
              }
          }
          

          【讨论】:

          • 为什么不只是foreach($this->suppliers as /* @var Supplier */ $supplier)
          • 可以在netbeans中将vars定义为数组: /** @var Supplier[] */
          【解决方案6】:

          如果 $this->suppliers 是一个数组,试试这个:

          function loopAllSuppliers(){
              foreach($this->suppliers as $key => $supplier){
                  $supplier->/*no suggestion*/ //Can't get the method's to show here
          
                  $this->suppliers[$key]->getSupplierName(); //should work
          
                  $this->suppliers->getSupplierName(); //methods in class Supplier show normally here
              }
          }
          

          【讨论】:

          • 在您的解决方案中,我仍在访问$this->suppliers 以获取方法。我正在尝试访问$supplier 的方法。
          • 是一样的。如果你循环遍历一个元素数组,你可以通过任何一种方式访问​​元素的方法。也许,您可以为我们提供一个不符合您要求的工作示例。
          猜你喜欢
          • 2018-02-09
          • 1970-01-01
          • 2018-05-13
          • 1970-01-01
          • 2020-10-05
          • 1970-01-01
          • 1970-01-01
          • 2012-07-07
          • 2021-11-26
          相关资源
          最近更新 更多