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(){
     ...
   }
}

みたいな書き方をしてたんですが、そこはかとなく不安@@;

BACK