忍者ブログ
[PR]
×

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



2017/08/24 04:19 |
PHP5.5.3 PHPでgoto
PHP5.3で悪名高いgotoが実装されました。

あえて実装されたということはそれだけ有用でもあるということでしょう。
前作ったフィボナッチ数列をgotoで再現してみましょう。
<?php
	
	function fib5($n){
		$fib= [0, 1];
		$count = 1;
		
		loop:
		$count++;
		$fib[$count] = $fib[$count-1] + $fib[$count-2];
		if(!isset($fib[$n])){ goto loop; }
		
		return $fib[$n];
	}
あれ、予想外にわかりやすい。
しかもfib3()並に高速です。
本当は「goto使うのはやめとけ」って書くつもりだったのだがどうしてこうなった。

gotoの本当の恐ろしさ(そして有用さ)は、「あらゆる文脈を無視して強制的にジャンプを行うことができる」という点です。
PHPの場合は同一ファイル内のみ、関数内←→関数外への移動はできないなど一部制限はありますが、それでもその威力は暴力的です。
<?php
	// http://www.php.net/manual/ja/control-structures.goto.php#109027
	$link = true;

	if($link)goto iw_link_begin;
	iw__link_begin:
	if($link)goto iw_link_text;
	iw__link_text:
	if($link)goto iw_link_end;
	iw__link_end:

	goto iw_end_gt;

	iw_link_begin:
		echo'<a href="#">';
		goto iw__link_begin;
	
	iw_link_text:
		echo'SampleText';
		goto iw__link_text;
	
	iw_link_end:
		echo'</a>';
		goto iw__link_end;
	
	iw_end_gt:
	
	// 普通に書くとこう
	if($link)iw_link_begin();
	if($link)iw_link_text();
	if($link)iw_link_end();
	
	function iw_link_begin(){
		echo'<a href="#">';
	}
	function iw_link_text(){
		echo'SampleText';
	}
	function iw_link_end(){
		echo'</a>';
	}
上記はマニュアルのコメントに書かれている例ですが、こんなもん納品されてきた日には実装者をぶん殴るしかない。

なおgotoのラベルには値しか使用できないようです。
変数はおろか定数すら指定できません。
<?php
	$a = 'label1';
	goto $a;
	label1:
みたいなコードはパースエラーになります。
まあ、万一これが動いてしまったら更なる地獄になるのは間違いありませんが。

実のところPHPではgotoの使いどころがほぼありません。
他の関数が豊富なので、あえて使おうと思わない限り出番がないんですよね。
他言語では唯一の使いどころとして挙げられる多重ループ脱出についても、PHPでは普通に脱出レベルを設定できます。
いったいどんなときに使えばいいのか、私にはよくわかりません。
PR


2013/12/13 22:45 | Comments(0) | PHP

コメント

コメントを投稿する






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



<<買ったものリスト 2013/12/15 | HOME | 初音ミク Project mirai 2 初回プレイ感想>>
忍者ブログ[PR]