10
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PHP5では$thisを書き換えられない

Last updated at Posted at 2014-08-22

$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を定義できないのであった。

10
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?