Wordpressのページ表示が重いので、自己流のフレームワークでCMS的なモノを作ろうとしていますが、ポイントは、HTMLテンプレートから、文字列操作をして、関数を実行できるような仕様にして、htmlファイル操作で便利にページ構築できるようにしたいと考えた。
そんな時、HTMLに書かれた関数記述を実行させる方法を模索した。
やりたい事
下記のようなHTMLテンプレートファイルをPHPで読み込んで、該当の関数実行箇所で、関数からのレスポンス値で書き換える
<h1><!--function:aaa(Page-Title)--></h1>
<div><!--class:bbb:ccc(Contents-Data)--></div>
<?php
function aaa($data){
return $data;
}
class bbb{
function ccc($data){
return $data;
}
}
実行後のソース
<h1>Page-Title</h1>
<div>Contents-Data</div>
functionを実行
aaaというfunctionを文字列から実行するには、以下のようにできます。
$func = "aaa";
$str = "Page-Title";
$arr = array("Page" , "Title");
// 送り値が無い場合
$res = call_user_func($func);
// 送り値が1つの場合
$res = call_user_func($func , $str);
//送り値が複数の場合
$res = call_user_func_array($func , $arr);
classを実行
classを実行する時もfunctionと同じ要領でいけます。
$className = "bbb";
$functionName = "ccc";
$str = "Page-Title";
$arr = array("Page" , "Title");
// 送り値が無い場合
$res = call_user_func(array($className , $functionName));
// 送り値が1つの場合
$res = call_user_func(array($className , $functionName) , $str);
//送り値が複数の場合
$res = call_user_func_array(array($className , $functionName) , $arr);
問題発生
無事に構築が終わり、一安心したところで、一つ問題が発生しました。
classオブジェクトの中に、$thisを使っているfunctionがあると、エラーが発生してPHPが止まってしまい真っ白画面になってしまいます。
classプログラムは以下のような感じです。
class bbb{
function ccc($data){
return $this->ddd($data);
}
function ddd(){
return $data;
}
}
解決方法
色々模索してみたところ、以下の方法でうまくできました。
$className = "bbb";
$functionName = "ccc";
$str = "Page-Title";
$arr = array("Page" , "Title");
$classObj = new $className;
$res = call_user_func_array(array($classObj , $functionName) , $arr);
これってPHPのバグなのか、namespaceなどをちゃんと利用しなければいけない仕様なのか、分からないが、new宣言して、そのオブジェクトを当ててあげるといいというだけでした。
今後のバージョンアップで不具合になるかもしれませんが、とりあえず、成功しました。
ちなみに、PHPのバージョンは、「7.0.13」です。
0 件のコメント:
コメントを投稿