Как я могу получить intellisense в PHP / Eclipse для пользовательских объектов, извлеченных из массива в цикле foreach? - PullRequest
9 голосов
/ 18 сентября 2010

У меня есть коллекция пользовательских объектов (Podcast) в массиве.

Когда я использую цикл foreach для перебора этой коллекции, у меня нет завершения кода для переменной, содержащей объект, извлеченный из коллекции (как я бы сделал в C # / VisualStudio например).

Есть ли способ дать PHP подсказку типа, чтобы Eclipse знал тип объекта, извлекаемого из коллекции, чтобы он мог показать мне методы этого объекта в intellisense?

alt text

<?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;
    }

}

?>

Добавление

Спасибо, Фанис, я обновил свой шаблон FOREACH для автоматического добавления этой строки:

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

    }
}

alt text

Ответы [ 2 ]

18 голосов
/ 18 сентября 2010

Да, попробуйте:

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

Прошло много времени с тех пор, как я использовал Eclipse, но я помню, что он тоже работал там.

0 голосов
/ 08 августа 2018

Это может помочь другим людям из Интернета, ищущим более лаконичное решение этой проблемы.

Мое решение требует 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 (я уверен, что другие фреймворки также имеют Коллекции), вы можете даже связать эти карты массивов с фильтрами массивов и другими функциональными вещами, такими как:

$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 эти функции массива выглядят довольно некрасиво ...

Но вот, пожалуйста! родной способ указания типа итерации массива.

...