忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2017/10/19 01:38 |
PHP5では$thisを書き換えられない
http://blog.37to.net/2006/08/phptips/
> $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


2014/08/22 22:56 | Comments(0) | PHP

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<買ったものリスト 2014/08/24 | HOME | jThreeで簡単な図形を作成>>
忍者ブログ[PR]