BACK
2012-03-11
スクリプト言語でクラス使ってみた2
どうもPHPの変数のスコープがよくわからないので整理中。
通常の(つまりClass化されていない)外部ファイルをrequireした場合は、
親ファイルの変数が外部ファイルでも読めてしまう。
つまり、
[oya.php]
$aaa = 123;
require_once "ko.php";
print $aaa;
[ko.php]
$aaa = 456;
結果:456
だし、
[oya.php]
require_once "ko.php";
print $aaa;
[ko.php]
$aaa = 789;
結果:789
になる。要はプログラムのファイルをニコイチしてるだけ、という認識であってるのだろうか。
で、これをclassにすると違って、
[oya.php]
$aaa = 123;
require_once "ko.php";
$ko = new ko();
print $aaa;
[ko.php] #はコメントアウト
#1 $aaa = 999;
class ko{
function __constructor(){
$aaa = 456;
#2 $GLOBALS['aaa'] = 999;
}
}
結果:123
まあfunctionの中だからある意味当たり前かもしれない。
ちなみにclass宣言の外(たとえば#1)に書くと999になる。
よくわからないと書きつつ、わかってきた気もするが(ぉ)、
今テストしてアレ?と思ったのがスーパーグローバル変数(#2)。
999になると思いきや、123のまま、びっくりlol
ちなみに#2を#1の位置に書くと当然?999になる。
(×)__constructor => (○)__construct
GYAAAAAAAAAAAAAAAAAAA
さっきまでは function ko(){}で定義してたんですが、
なんかPHP5からは__constructが推奨ということで書き換えた結果がこれだよ!
ええ、ちゃんと#2は書き換わります。もうまんたい(ぉ
まあ結局子で親の変数触れるので、
requireしたらその階層の変数は変わってるかもよ、ということか。
つまり、
[oya]
require_once "ko.php";
hoge();
function hoge(){
$aaa = 444;
print $aaa;
}
で万事解決、ということか。
あと、無名のインスタンスっていつ開放されるんだろう。
インスタンス変数もclassから汚染されると勘違いしてたとき、
new hoge();
class hoge{
function hoge(){
$this->main();
}
function main(){
...
}
}
みたいな書き方をしてたんですが、そこはかとなく不安@@;
Comments
BACK