foreach()と変数のスコープ
今までにも何度か出くわしたWarning。
「Invalid argument supplied for foreach() in 」〜うんたらかんたら。
つまり配列じゃねーんじゃねーの?って話です。
▽[PHP]Invalid argument supplied for foreach()というエラーがでたら確かめるべきこと。
(土産はいらん。)
http://d.hatena.ne.jp/slashslash/20060804
string gettype ( mixed $var )
▽PHP:gettype - Manual
http://jp2.php.net/manual/ja/function.gettype.php
で、変数の型を取得して確認せよ、と。
(マニュアルには「代わりに is_* 関数を使用してください。」とあるから恒常的に使うのはまずいかもだけど)
今、HTMLToFeed.class.php(HTMLScrapingのサンプルスクリプト)を流用して、CSVから変数に配列としてもっているデータをRSSにしようとしています。
この際、foreachのところで、上記エラーがでた次第。
そこでgettypeを書いてみたところ、HTMLToFeed.class.phpがない状態ではarray、ある状態ではnullが帰って来ます。
えー?null?
実際、print_rしてもnullだからびっくりしました。
class HTMLToFeed_Extended extends HTMLToFeed
{
function analyze()
{
echo gettype($r_values);
print_r($r_values);}
}
だけにしても、同じ結果でした。
変数の操作なにもしてないのに、なんでnullになってしまいますかね?
当然こうなると変数の取扱いが関数の内側外側で取扱いが違うのかなーと想像がつきます。
しかし、どうやってそれを確認していいのかわかりません。
そこで
今すぐ導入!PHP×PostgreSQLで作る最強Webシステム (Advanced Server‐side programmingシリーズ)
- 作者: 石井達夫
- 出版社/メーカー: 技術評論社
- 発売日: 2002/12/18
- メディア: 大型本
- クリック: 5回
- この商品を含むブログ (12件) を見る
関数の中で使用される変数はすべてデフォルトではローカル変数です。すなわち、関数の外側からは決してアクセスすることはできません。したがって、以下のように同じ$aという変数を使っていても、関数fooの中の$aと外側の$aはまったく別ものであり、お互いに影響を及ぼすことがありません。
どうもコレっぽいな、ということでより具体的な説明を探してみたところ、ありました。
▽1E.8 変数のスコープ
(日曜プログラミング講座/PHP言語 - 文法編 - Water-Sunlight)
http://www.y2sunlight.com/water/webman/php1/1E.8.html
前に$this->ってなんぞ?とか、$GLOBALS['a']的な書式は使っていたもののわかっていなかった、つけを払った感じです。
まだ払いきれていないので、自分でクラスとか関数とか書くようになったときに改めて勉強することにします。
それまではこのあたりでつまづかないように気をつける、ということで。