[PHP] 既存のCLASSオブジェクトを変数stringで実行すると$thisが利用できない問題

2017年4月21日

PHP テクノロジー プログラミング

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」です。

人気の投稿

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。

ブログ アーカイブ