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ヨクワカラナイ・・・