スポンサーリンク

PHPStromでextract関数を使うとundefined variableが発生するときの対処方法

WordPressでショートコードを試そうとしたら、extract関数でundefined variableエラーが発生したので、以下の方法で対処しました。

PHPDocのコメントを追加する

PHPDocのコメントをextract関数の後に記述します。

/** @var データ型 変数 */

すると、エラー警告が止まります。例えば、このような感じでしょうか。

/** @var string $name */

それにしてもショートコードって便利ですね。更新されていないExec-PHPを使うことに抵抗があったのですが、これで色々遊べそうです。

DOMDocumentのトラブル

ショートコードを試すときにHTMLを加工したくて、DOMDocumentを使ってみたのですが、PHPStormのデバッガーでDOMDocumentやDOMElementの変数値を見ることができません。

色々と調べると、

  • DOMElement(DOMNode)->C14Nで見れるよ
  • simplexml_import_domでSimpleXMLに変換する
  • コードをガリガリ書けばOK
  • などなど、

確かにそうするとデバッグできるのですが、せっかくIDEを使ってるのでダイレクトに確認できればと思います。でも、調べると同じような質問をしている人が多いので、無理なのかなと思ったり。

結局、変数の値を確認する方法は見つからず。まぁ、attributeを削除したかっただけなので、SimpleXMLを使いました。こちらは問題なく変数値を参照できました。

Simple HTML DOM ParserやphpQueryを使うべきなのでしょうか。

DOMDocumentのトラブル2

コード補完が効かなくなることがありました。コード補完が効かなくても、問題なく関数を呼べるのですが、常にMethod "・・・" not found in classの警告が表示されます。そもそも、コード補完の際、no suggestionsが出ているので当然かもしれません。調べてみると、以下の方法がみつかりました。

File-> Invalidate Caches
おそらくプロジェクトのキャッシュをクリアするようですが、今回の問題には効果なしでした。
変数の前にPHPDocを追加
コード補完が効かない変数の前に、
/** @var DOMDocument $domdocument */
/** @var DOMElement $domelement */
などのPHPDocを記述すると、コード補完が効くようになりました。

警告が出ても動くのですが、typo以外の警告は気持ちが悪いので、できるだけ無くしたいです。

おまけ

こんなこともありました。if文で{}ではなく:(コロン)を使い、elseの直後にコメントを入れると、それ以降でコード補完が効かなくなります。

 if($flag):
 else:
 	/** comment */
 	これ以降、コード補完が効かない
 endif;

でも、{}(波括弧)なら問題なし。

if($flag){
}else{
	/** comment  */
	波括弧なら問題なし
}

普通はこんなところにコメントを書かないかもしれませんね。私は、前述のPHPDocの問題でたあちこちに書いているうちに遭遇しました。

ちなみに、こうしても大丈夫です。

 if($flag){
 }else{
 	ここに何かコードがあれば問題なし
 	/** comment  */
 }

稀に同じ問題に遭遇する人がいるかもしれませんので、メモ程度に残しておきます。

おわりに

今まで、kramdown内に画像表示用のhtmlが混ざって、ゴチャッとしていたのですが、ショートコードでスッキリしました。

extract関数についてはPHPDocが原因・・・らしいです、あまり詳しく調べてないです。PhpStrom7で修正されるといいですね。