404 motivation not found | t_ishidaのブログ

1月/08

31

今日微妙にはまったこと

固定長ファイルの切り出し

PHPでもなんでもないんだけどね。

  • EUCで半角カナが2バイト(正確な定義としては違うんだけどね)
  • 半角スペースは1バイト

当たり前の話なんだけど、これでスペース埋めの文字列フィールドを単純にバイト数で切り出すとハマる。

一度sjisとかにコンバートしてからやった方が良いよ。

変数のスコープ

  1. メインルーチンを書いた、main.phpが有ったとする。
  2. main.phpに定数代わりにグローバル変数をまとめたdefine.php、requireしてやるとする。*1
  3. main.phpに関数をまとめたfncs.phpがをrequireしてやるとする。
  4. fncs.phpの中の関数でdefine.phpの変数を見ようとすると、中身が空になる。

と言う事らしい。

globa $g_varとか、使う先の関数でしてやらんといかんらしい。

$GLOBALS[g_var]と、呼ぶこともできるらしい。

もっと極端な話だと。

<?php
$a = 100;
$b = 101;

//駄目な見本
function x(){
$b = $a + $b;
print "関数の中 : x 計算後 : \$b = $b\n";
}

//大丈夫な見本
function y(){
$GLOBALS[b] = $GLOBALS[a] + $GLOBALS[b];
print "関数の中 : y 計算後 : \$GLOBALS[b] = $GLOBALS[b]\n";
}

//これも大丈夫
function z(){
global $a,$b;
$a = $a + $b;
print "関数の中 : z 計算後 : \$a = $a\n";
}

x();
print "関数の外 : x call後 : \$b = $b\n";

y();
print "関数の外 : y call後 : \$b = $b\n";

z();
print "関数の外 : z call後 : \$a = $a\n";
?>

の、実行結果が、

関数の中 : x 計算後 : $b = 0
関数の外 : x call後 : $b = 101
関数の中 : y 計算後 : $GLOBALS[b] = 201
関数の外 : y call後 : $b = 201
関数の中 : z 計算後 : $a = 301
関数の外 : z call後 : $a = 301

う~ん、期待を裏切らない気持ち悪さ♪(笑)

global側を制限するんじゃなくて、レキシカル側を制限しろよ。

まとめ

  • 半角カナを扱う時にはEUCじゃなくて、sjisとかutf8とかにしよう。
  • global変数は気をつけよう(そう使う事も無かったから、今まで気づかなかった。定数用のクラス作ってたしね^^;)

*1:defineだと、ハッシュとか作れないでしょ?

Share and Enjoy:
  • Digg
  • del.icio.us
  • Google Bookmarks
  • Tumblr
  • email
  • Facebook
  • FriendFeed

RSS Feed

コメントはまだありません。

Leave a comment!

<< 使えないRSSリーダー

最近のネットってどうよ? >>

Find it!

Theme Design by devolux.org

Tag Cloud