http://blog.37to.net/2006/08/phptips/
> $this = $obj;
本当かよ!?
Fatal error: Cannot re-assign $this
http://thinkit.co.jp/free/marugoto/1/6/1/
過去の遺物だったようです。
いやあ本当に良かった。
これはコンパイル時にチェックしているようで、HOGEクラスをnewせずともこのエラーが出ます。
ん?コンパイル時にチェック?
つまりはこういうことか?
可変変数を使って無理矢理$thisを差し替えることに成功しました。
もっとも、あくまでこれを動かしてもエラーにならないというだけであり、実際のところ$thisは変更されずにHOGEクラスのままです。
変更されはしないのですが、$thisを突っ込んだメソッド内部でだけ不可解な動きをします。
$thisを静的に参照するとはHOGEクラスなのに、インスタンス変数やメソッドはFUGAクラスのものになります。
意味がわからんぞ。
さらにreturn $thisすると、返り値はそんな奇妙なことにはならず、普通に完全なHOGEクラスです。
こんな奇怪な使い方をする奴なんていないと言われれば全くそのとおりですが、なんか動作がとても気持ち悪かったので書き起こしてみた。
これを使ってHOGEクラスに定数を集めて疑似trait、みたいなことを考えてみようかと思ったが余りにも無駄すぎるのでやめた。
おまけ
http://angelicwing.net/diary/4023.html
> 実はこれだけで死ぬ、という話。
HAHAHA冗談上手いなあ
Fatal error: Cannot re-assign $this
クラス内とか関係なしに、PHP5では根本的に$thisを定義できないのであった。
PR
> $this = $obj;
本当かよ!?
1 | <?php |
2 | class HOGE{ |
3 | public function change(){ |
4 | $this = new stdClass; |
5 | } |
6 | } |
http://thinkit.co.jp/free/marugoto/1/6/1/
過去の遺物だったようです。
いやあ本当に良かった。
これはコンパイル時にチェックしているようで、HOGEクラスをnewせずともこのエラーが出ます。
ん?コンパイル時にチェック?
つまりはこういうことか?
1 | <?php |
2 | class HOGE{ |
3 | public function change( $target ){ |
4 | $ $target = new stdClass; |
5 | } |
6 | } |
7 | ( new HOGE())->change( 'this' ); |
もっとも、あくまでこれを動かしてもエラーにならないというだけであり、実際のところ$thisは変更されずにHOGEクラスのままです。
変更されはしないのですが、$thisを突っ込んだメソッド内部でだけ不可解な動きをします。
01 | <?php |
02 | class HOGE{ |
03 | const A = 'HOGE' ; |
04 | public $b = 'hoge' ; |
05 | public function c(){ return 'h' ; } |
06 | } |
07 | |
08 | class FUGA{ |
09 | const A = 'FUGA' ; |
10 | public $b = 'fuga' ; |
11 | public function c(){ return 'f' ; } |
12 | |
13 | public function change( $target ){ |
14 | $ $target = new HOGE(); |
15 | |
16 | var_dump( $this ); // object(HOGE) |
17 | var_dump( $this ::A); // HOGE |
18 | var_dump( $this ->b); // fuga |
19 | var_dump( $this ->c()); // f |
20 | |
21 | return $this ; |
22 | } |
23 | } |
24 | |
25 | $fuga = new FUGA(); |
26 | $hoge = $fuga ->change( 'this' ); |
27 | |
28 | var_dump( $fuga , $fuga ::A, $fuga ->b, $fuga ->c()); // 全てFUGA |
29 | var_dump( $hoge , $hoge ::A, $hoge ->b, $hoge ->c()); // 全てHOGE |
意味がわからんぞ。
さらにreturn $thisすると、返り値はそんな奇妙なことにはならず、普通に完全なHOGEクラスです。
こんな奇怪な使い方をする奴なんていないと言われれば全くそのとおりですが、なんか動作がとても気持ち悪かったので書き起こしてみた。
これを使ってHOGEクラスに定数を集めて疑似trait、みたいなことを考えてみようかと思ったが余りにも無駄すぎるのでやめた。
おまけ
http://angelicwing.net/diary/4023.html
> 実はこれだけで死ぬ、という話。
HAHAHA冗談上手いなあ
1 | <?php |
2 | $this = 1; |
クラス内とか関係なしに、PHP5では根本的に$thisを定義できないのであった。