PHPStorm и магические методы - PullRequest
6 голосов
/ 12 марта 2012

Я использую PHPStorm и написал класс, который использует класс SimpleXML.Все хорошо, за исключением того, что когда я пересекаю строку XML, я получаю предупреждения «Неопределенное свойство».

$xml = simplexml_load_string($string); //Returns SimpleXML Element

echo $xml->childElement; //PHPStorm reports "Undefined Property

Я полагаю, это потому, что магические свойства не определены должным образом в PHPStorm.Кто-нибудь знает о хорошей маленькой работе вокруг?Это раздражает меня, потому что я педантичен по поводу того, что у меня есть хороший чистый код (и IDE), а появление предупреждений в классе просто ужасно!

Ответы [ 4 ]

10 голосов
/ 12 марта 2012

Пока я не нашел обходного пути, а просто создал тип с соответствующими свойствами и var-type-hinting переменной:

class myXmlStoredValueObject {
     /* @var string */
     public $childElement;
}

$xml = simplexml_load_string($string); //Returns SimpleXML Element

/* @var $xml myXmlStoredValueObject */

echo $xml->childElement;

Естественно, это не всегда применимо / практически осуществимо,есть чит с stdClass:

$xml = simplexml_load_string($string); //Returns SimpleXML Element

/* @var $xml stdClass */

echo $xml->childElement;

Вам не нужно объявлять какой-либо конкретный тип, чтобы подсказка исчезла.

Есть и другие недостатки, но вы все равно останетесьвозникают проблемы с foreach, например, когда вам нужно снова выполнить var-type-hint.

9 голосов
/ 15 марта 2012

Я думаю, что решил это. Если я инкапсулирую узлы внутри фигурных скобок в виде строк, PHPStorm будет игнорировать их.

echo $xml->{'Parent'}->{'ChildElement'};

Преимущество заключается в том, что он согласован, например, если вы встретите тег XML с дефисом. $xml->{'Parent-Node'}

1 голос
/ 13 декабря 2018

Чтобы избавиться от надоедливого предупреждения, у вас есть несколько вариантов:

1) ясно и читаемо: Определите заглушку где-нибудь в вашем проекте:

class myXmlPhpRepresentation {
   /** @var string */
   public $childElement;
   /** @var number */
   public $anotherXmlProperty;
}

Тебе не нужен класс, просто имей папка проекта для IDE для индексации. Затем просто используйте PhpDoc, чтобы «смешать» этот класс с SimpleXMLElement:

/** @var myXmlPhpRepresentation|SimpleXMLElement $xml */
$xml = simplexml_load_string($string);
echo $xml->childElement;

Это хорошая практика: у вас будет правильно определенное и читаемое представление php вашего xml, что поможет с автозаполнением кода и удалением предупреждения.

2) Подавить само предупреждение в строке кода:

 /** @noinspection PhpUndefinedFieldInspection */
 echo $xml->childElement;

Alt + Enter в предупреждении -> Параметры проверки ... -> Подавить выписку

Не очень чистый способ, но проверка поможет вам в остальной части проекта.

3) Отключить всю проверку.

Полагаю, это плохая практика, но некоторые проверки могут быть самоуверенными.

0 голосов
/ 12 марта 2012

Поскольку PHPStorm не компилирует ваш код "на лету", он не знает, что находится в "$ string", если вы загрузили эту строку из внешнего источника.

Вы можете заглянуть в репозиторий плагинов, если есть что-тоэто вам поможет:

http://plugins.intellij.net/?webide

...