PHPStorm和魔术方法

时间:2012-03-12 11:14:33

标签: php phpdoc phpstorm

我正在使用PHPStorm并编写了一个使用SimpleXML类的类。一切都很好,除非我遍历XML字符串,否则我将收到“Undefined Property”警告。

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

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

我相信这是因为PHPStorm中没有正确定义魔术属性。有人知道一个很好的小工作吗?这让我很烦,因为我很擅长使用干净的代码(和IDE)并且在课堂上出现警告很糟糕!

4 个答案:

答案 0 :(得分:10)

到目前为止,我还没有找到解决办法,只是创建了一个具有相关属性的类型,并且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。

答案 1 :(得分:8)

我想我已经解决了。如果我将花括号内的节点封装为字符串,PHPStorm将忽略这些。

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

例如,如果您遇到带有连字符的XML标记,则此优势是一致的。 $xml->{'Parent-Node'}

答案 2 :(得分:1)

要摆脱烦人的警告,您可以选择以下几种方法:

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;

这是一个好习惯:您将对XML进行正确定义和可读的php表示, 这将有助于代码自动完成并消除警告。

2)禁止代码行上的非常警告:

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

按Alt + Enter进入警告->检查...选项->禁止发表声明

这不是一种很干净的方法,但是检查将帮助您完成项目的其余部分。

3)禁用整个检查。

我认为这是一个不好的做法,但有些检查可能会引起争议。

答案 3 :(得分:0)

由于PHPStorm没有“动态”编译你的代码,如果从外部源加载了该字符串,它就不知道“$ string”中的内容。

如果有什么可以帮助你的话,你可以查看插件存储库:

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