[PHP-users 914] Re: includeについて

Masashi Ohba php-users@php.gr.jp
Thu, 26 Jul 2001 18:23:30 +0900


大場です。

okazaki wrote;

>岡崎です。
>しょうなり様、初めまして。
>
>> function uploade() {
>>     global $userfile;
>>     global $userfile_name;
>>
>> とグローバル宣言すれば動くのではないでしょうか?
>
>ありがとうございます。これで望んだとおりの動きをしてくれました。

どこから$userfile_nameってのが
出てくるのかよくわからないんですが。


行き当たりばったりで済ますならそれが簡単かもしれませんが
汎用的に使うような部品単位で作っていくなら
globalで済ましちゃうと、万が一同じ名前の物が
どこか出てきたら、それで上書きされます

function uploade($username){
…
}
のように関数を作って、明示的に変数を渡して

uploade($username);

って使えばいいんではないでしょうか?
独立性を高めるなら、これが普通な関数の書き方じゃ
ないかなぁと思うけど。


あと
>    $str=<<<EOF
><form enctype="multipart/form-data" action="index.php" method=post>
>  <input type=hidden name=MAX_FILE_SIZE value=600000000>
>  ファイル名<input name=userfile type=file size=40>
>  <input type=submit value="upload">
></form>
>EOF;
>    print("$str");

はヒアドキュメントの部分を$strに採りこむ意味が
まったく無いようなので、普通書くなら

print <<<EOF
<form enctype="multipart/form-data" action="index.php" method=post>
<input type=hidden name=MAX_FILE_SIZE value=600000000>
ファイル名<input name=userfile type=file size=40>
<input type=submit value="upload">
</form>
EOF;

でしょうかね?

>> でうまく動くのが謎なんですが…。
>
>元々はindex.phpとup.incを一つの形(しょうなり様がなぜ動くのか疑問に思って
>いらっしゃる形)でした。
>そして上手く動いておりました。その時はグローバル宣言はしていません
>でした。
>それを後で、class uploadeとして色々使いたいと思い、取りあえずup.incに
>追い出してみたのですが・・・

「追い出した」って書いてるあたりから推測するに
前はfunction uploade()として使ってなくて
functionの中身をindex.htmlにベタ書きしてたんではないですか?
それなら、あからさまに指定しなくても全部「グローバル変数」です


変数の有効範囲ってがどうなるって話はマンモス本でも読んでください
マンモス本の例題

#堀田さんごめんね使っちゃいます(^^;)

Q1
$str = "TEST"; //グローバルスコープ
Function Test (){
  return $str;//ローカルスコープ
}
echo Test();

さてechoで一体なにが出力されますか?

こっちは例題をちょっとアレンジした物
Q2
$str = "TEST"; //グローバルスコープ
Function Test ($test){
  return $test;//ローカルスコープ
}
echo Test($str);

さてechoで一体なにが出力されますか

ヒント
finction(){}の外のことは、明示的に与えてやら無いと
finction(){}内には伝わりません


答え
Q1は何も出ない(functionの中の$strには文字列が何も入ってないから)
Q2はTestと出ます(functionの中の$strには変数が渡されてるから)
理由は本でも読みながら考えてください。

------------------------------------------------------------
大場正志(Masashi Ohba)
E-Mail  ohba@intelight.co.jp
(株) インテライト
http://www.intelight.co.jp
------------------------------------------------------------