如何在 PHP/Eclipse 中对 foreach 循环中从数组中拉出的自定义对象进行智能感知?

Posted

技术标签:

【中文标题】如何在 PHP/Eclipse 中对 foreach 循环中从数组中拉出的自定义对象进行智能感知?【英文标题】:How can I get intellisense in PHP/Eclipse on custom objects pulled out of array in foreach loop? 【发布时间】:2011-04-14 03:02:18 【问题描述】:

我有一个数组中的自定义对象(Podcast)集合。

当我使用 foreach 循环遍历此集合时,我没有对包含从集合中拉出的对象的变量进行 代码完成(如例如,我会在 C#/VisualStudio 中使用)。

有没有办法给 PHP 一个类型提示,以便 Eclipse 知道从集合中拉出的对象的类型,以便它可以在智能感知中显示该对象上的方法?

<?php

$podcasts = new Podcasts();
echo $podcasts->getListhtml();

class Podcasts 
    private $collection = array();

    function __construct() 
        $this->collection[] = new Podcast('This is the first one');
        $this->collection[] = new Podcast('This is the second one');
        $this->collection[] = new Podcast('This is the third one');
    

    public function getListHtml() 
        $r = '';
        if(count($this->collection) > 0) 
            $r .= '<ul>';
            foreach($this->collection as $podcast) 
                $r .= '<li>' . $podcast->getTitle() . '</li>';
            
            $r .= '</ul>';
               
        return $r;
    


class Podcast 

    private $title;

    public function getTitle()  return $this->title; 
    public function setTitle($value)   $this->title = $value;

    function __construct($title) 
        $this->title = $title;
    



?>

附录

谢谢,Fanis,我更新了我的 FOREACH 模板以自动包含该行:

if(count($lines) > 0) 
    foreach($lines as $line) 
        /* @var $$$var $Type */

    

【问题讨论】:

好东西 :) 模板的使用也很好。 【参考方案1】:

是的,试试:

foreach($this->collection as $podcast) 
    /* @var $podcast Podcast */
    $r .= '<li>' . $podcast->getTitle() . '</

我使用 Eclipse 已经有一段时间了,但我记得它也曾在那里工作过。

【讨论】:

不客气!仅供参考,某些 IDE 可能需要适当的文档块,即双星号:/** @var ... */【参考方案2】:

这可能会帮助互联网上的其他一些人寻找更简洁的解决方案来解决这个问题。

我的解决方案需要 PHP7 或更高版本。这个想法是用匿名函数映射数组并利用类型提示。

  $podcasts = getPodcasts();
  $listItems = array_map(function (Podcast $podcast) 
      return "<li>" . $podcast->getTitle() . "</li>";
  , $podcasts);
  $podcastsHtml = "<ul>\n" . implode("\n", $listItems) . "\n</ul>";

在大多数情况下,foreach 可以转换为array_map,只需将范式转换为函数式编程

如果你使用 Laravel(我相信其他框架也有 Collections),你甚至可以将这些数组映射与数组过滤器和其他类似这样的函数链接起来:

$html = "<ul>" . collect($podcasts)
  ->filter(function (Podcast $p)  return $p !== null; ) // filtering example
  ->map(function (Podcast $p)  return "<li>".$p->getTitle()."</li>"; ) // mapping
  ->implode("\n") . "</ul>";

在普通的 php 中链接这些数组函数看起来很丑...

但是你去吧!一种提示数组迭代的本机类型。

【讨论】:

以上是关于如何在 PHP/Eclipse 中对 foreach 循环中从数组中拉出的自定义对象进行智能感知?的主要内容,如果未能解决你的问题,请参考以下文章

如果您可以在 7 次比较中对 5 个数字进行排序,那么如何在 10 次比较中对 6 个数字进行排序?

如何在 WinForms 中对 URL 进行编码?

如何在 postgres 中对 jsonb 值求和?

如何在 Pyspark 中对数据框进行过采样?

如何在 AngularJS 中对隔离范围指令进行单元测试

如何在 PHP 中对正文进行排序