[PHP] foreach内で参照渡しをしたときに、参照が死なずに残ってしまうのはなぜか

どうもこんにちは。

PHPをいじっていて少し引っかかったことがあったのでメモメモ……

foreach文の中で、 引数として渡している配列の中身を変更するために、参照渡し(&$hogeみたいな感じで書く)を利用してみました。
↓例えばこんな感じで

こうすると、配列$aryHogeの中身がちゃんと変更されます。
でも、下記のように書くと、なんだかおかしなことになります。

上記のように書くと、最初の配列$aryHogeの値が書き変わってしまいます。
どうやら、 foreachで作成した変数$itemに、$aryHogeの参照が残ったままになっているみたいです。

仕方ないので、とりあえず場当たり的に、2つ目のforeachの変数を$valのような別の名前に変えて対処しましたが、何でこうなるのか気になったので調べてみたら、すぐに引っかかりました。

foreachの参照 – CROOZ Tech Blog http://techblog.crooz.jp/?p=4738

最後に注意点として、PHPにはブロックスコープがないので
foreachで作成した$keyや$valueは、foreachを抜けても値が入ったままです。

なので参照渡しでつかった$valueにうっかり値をいれてしまうと…
参照先の値が書き換わってしまいます。
なので忘れずにunsetしましょう。

「ブロックスコープがない」。if文やらfor文やらの内部で宣言した変数が外でもそのまま使えるってことですわね。
これって、宣言も代入も同じ構文のPHPなんかじゃ、ミスの温床になるんじゃないかしら??

ここまで書いていて気がついたのですが、自分もよくif文の中で初めて宣言した変数なんかに平気でアクセスしてました。今になって考えると無意識にそんなことをしてたんですな……なんだか恐ろしい(;ω;`)

WepSim本体を修正しました

 マビノギ装備改造シミュレータ「WepSim」の本体のフラッシュをバージョンアップしました。

WepSimサイトはこちら→http://nisihunabasi.mods.jp/wepsim/

WepSim Ver.0.43

  • ホイールをスクロールさせたとき、一緒にブラウザの画面もスクロールしてしまう問題を修正。

 使ってても差し支えないかなーと思ったけれども、指摘されたのでやっぱり修正しました。確かに固定されるとかなり便利です。

 今後も使いにくい部分がありましたら、コメントやらツイッターやらでちらちらお声をおかけくださいなー!

装備改造シミュレータ「WepSim」を公開しました。

 先日よりアナウンスしていましたマビノギ用装備改造シミュレータ「WepSim」ですが、今日より公開を始めます。

http://nisihunabasi.mods.jp/wepsim/

 このシステムの概要は前述の記事(http://d.hatena.ne.jp/nisihunabasi/20100528/1275005487)にて説明しておりますので、そちらを参照してください。

 いやぁ、本当は昨日(5月31日)に公開するはずだったんですけど、かなり時間オーバーしてしまいました。

 一応、ユーザーが直接目に触れる部分に関しては、十分バグとりをしたのですが、まだまだ至らない部分もあるかもしれませんので、「ココガヘンダヨ!!」みたいな部分がありましたら、ページ内の「コメント」から書き込んでいただくか、Twitter(http://twitter.com/nisihunabasi)にて連絡していただけるととてもありがたいです。

 さて、今からまた細かいところを直していきますかね……

 とりあえずそれでは~!

ロリポップでソースのパスを通すときにはまったのでメモ

 はまったはまったちょーはまった。なぜかinclude_pathを使うのに恐ろしく時間がかかった;; 3時間ぐらいハマってた!

 まぁマビノギにはものすごい関係ない気がしますが、ここぐらいしかメモして晒して残せる場所がないのでわからない人はスルーしてください|-`)

 ロリポップのレンサバでは、php.iniはフォームで限られたパラメータしか変更できない仕様で、その中にinclude_pathは入っていません。

仕方ないので他の方法、まずは.htaccessにphp_valueを設定する方法を試してみました。

php_value include_path “/home/users/*/***.jp-******/web/hogehoge”

(1行空行)

 ですが、これでも動きません。

 ここでダブルクオーテーションを外したりとか、パスの書き方をいじってみたりとか、いろいろ苦労してみたけれど結局進展はありませんでした。

 仕方なく、.htaccessで設定する方法は諦めて、PHP内部にinclude_pathを書く方法をとりました。この方法をとるにあたって、以下のサイトを参考にさせていただきました。

http://maihy.com/hp/phptech/phptech_incpath.html

include_path:とことん!ホームページ

このページ内にあったソースをそのままコピペして持ってきました(ぁ

 $pathにはインクルードしたい完全パスを入れてください。PATH_SEPARATORはインクルード時に使う区切り文字で、Windows系では”;”が、UNIX系では”:”が自動的に入ります。(参考サイトより)

 PHPファイルにコードを突っ込んで、なんとか動き出しました。よかった;w;

 結論としては、「ロリポップでPHPのパスを通す(include_path)ときはPHPのコード内に書く」ということになります。モノによってはすごく面倒ですね。うちは変更部分が一か所だけだったんで大丈夫でしたけど。

.htaccessで書ける方法があるならぜひ知りたいです;;