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