Data::Section 的なことを PHP でおこなう

つくってみて、あまり応用が効かなそうと思いつつ、テストデータとか、使い捨てスクリプトの作成には便利なのかも…と思ったり。

function section($name = null) {
	static $data = null;
	static $sections = array();

	if (is_null($data)) {
		$data = preg_replace('/\r\n|\r|\n/', "\n", file_get_contents(__FILE__, FALSE, NULL, __COMPILER_HALT_OFFSET__));
		$contents = explode('@@', $data);
		foreach (preg_split('/(^|\n)@@/', $data) as $section) {
			$lines = explode("\n", $section);
			$key = array_shift($lines);
			$sections[$key] = implode("\n", $lines);
		}
	}
	if (is_null($name)) {
		return $data;
	}
	return $sections[$name];
}

echo section("start");

__halt_compiler(); // __END__

@@start
Hello world.

ぐぐったら、こうすればできるよてきな情報が stackoverflow ででてきたので、それをまんまコードにした感じ。
とりあえず、書きなぐりなスクリプトで、↓みたいな感じ(ちょっと変えてるが…)で sinatra ぽくかけるような感じでつかってみている。

function render_file_or_contents($view_path, $vars) {
	extract($vars);
	ob_start();
	if (file_exists($view_path)) {
		include $view_path;
	} else {
		eval('?>' . section($view_path));
	}
	$content = ob_get_clean();
	return $content;
}

function render($view, $vars = array(), $layout = null) {
	$content = render_file_or_contents($view, $vars);
	is_null($layout) && $_SERVER['HTTP_X_REQUESTED_WITH'] && $layout = "layout";

	echo is_null($layout) ? $content : render_file_or_contents($layout, array_merge(compact('content'), $vars));
}

sinatra ぽくというか、Vの部分だけ sinatra 風を作った感じ。
あまり応用例は思いつかないのだけれど、極力ファイル数を減らしたいとか、別ファイルにするよりも1ファイルにした方が管理しやすい時とかにはいいのかもしれない。
低コストな V が作れるので、個人的にはわりかし好印象。
ちなみに、lib 化した時は file_get_contents(__FILE__, FALSE, NULL, __COMPILER_HALT_OFFSET__) は多分動かないのでなにかしらの魔法が必要に思われる。phpヨクワカラナイ・・・