$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、みたいなことを考えてみようかと思ったが余りにも無駄すぎるのでやめた。
おまけ
実はこれだけで死ぬ、という話。
HAHAHA冗談上手いなあ
<?php
$this = 1;
Fatal error: Cannot re-assign $this
クラス内とか関係なしに、PHP5では根本的に$this
を定義できないのであった。