PHPとHTMLを連動させるソースコードの対応「call_user_func_array」関数を確実に使う

2018年1月29日

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

Wordpressを使ってブログを書いていますが、とにかく挙動が遅い。 仕事で他社のWEBページを作る時に、「wordpressで作って」と依頼されるが、その後のメンテナンスなどがとても煩雑になるし、mysql の管理もうんざりするのでやりたくない。 そんな思考から、自分フレームワークを作りました。 MyntStudio 以前記事にも書いたのですが、ここで使っているライブラリを更新したので、その内容をシェアしておきます。

問題点

MyntStudioの中で、HTMLソースコードにPHPの関数を埋め込む機能で、送り値が正常に動作しないパターンがありました。 具体的には、以下の通りです。 <<METHOD:hoge_class::hoge_function(<<REQUEST:val1>>,<<REQUEST:val2>>,"<<REQUEST:val3>>")>> サンプルなので、実際の記述とは別ですが、このコードは、HTMLを表示した際に、特定のclass-functionを実行する際に、postやgetのrequest値を送るという内容です。 「REQUEST:val3」の箇所が"(クォーテーション)で括られている事がポイントなのですが、val1とval2は数値だと考えてください。 そして、val3は文字列なのですが、この文字列の中に,(カンマ)文字列が含まれていると正常に動作しない不具合が発生しました。 というか、作成当初から、こうなることは分かっていましたが、規定として,(カンマ)は受け付けないという仕様にしてもいいんですが、あまりにもチープな仕様になってしまうので、この点を改修したいと思います。

改修ポイント

これまでの仕組みを簡単に解説すると、「METHOD:hoge_class::hoge_function(...)」という文字列を関数実行した返り値に変換するという内容で受け渡し値の(...)の箇所が複数ある場合、「,(カンマ)」でsplitして対応していたが為に、文字列内に「,(カンマ)」を含むと誤作動してしまうというのが原因でした。 通常のプログラムであれば、受け渡し値に「,(カンマ)」が付いていたとしても問題なく動作します、function(1,2,"aa,bb,cc")って普通に書きますよね。 ここで行いたいのは、「"(クォーテーション)」で括られている内部での「,(カンマ)」は区切り文字ではなく文字列として扱うという方法にしなければいけません。

試行錯誤

最初に考えたのは、「"(クォーテーション)」 の中にある「,(カンマ)」を別文字列に変換して、split後に「,(カンマ)」に戻すという方法をやろうとしましたが、簡易に正規表現でreplaceしようとしましたが、簡単に行える正規表現が作れなかったので、一旦この方法はヤメ。 次に考えたのが、「"(クォーテーション)」の数を数えて奇数番〜偶数番の間にある文字列で「,(カンマ)」を別文字に置き換えて、その後split後に「,(カンマ)」に再変換するという方法・・・、文字列を1文字ずつ対応していくやりかたがあまりスマートではなかったので却下。 そして、こうしている間に、一つの疑念が生まれました。「文字列内に,(カンマ)が使われている他に"(クォーテーション)が使われても、不具合に繋がる・・・」 とりあえず、こうしたことを一発で解決する方法を見つけました。
「str_getcsv」関数を使う
これです。今回の受け渡し値の特性はまさにCSVの特性と同じ、1レコードの分解が受け渡し値になればいいということで以下の以下のように変更。 // これまでの記述 $vals = explode("," , $reqs); // 変更後の記述 $vals = changeQueryArray($reqs); function changeQueryArray($vals=""){ if($vals === ""){ return array(); } else{ $valArr = str_getcsv($vals); return $valArr; } } 文字列を受け渡し血に分解する関数を追加して対応。

最後に

今回はまあまあスマートに対応できましたが、最終的にPHPのデフォルト関数で対応したのが少しだけ心残りでした。 他の言語に移植する場合に、こうしたアルゴリズムは全く通用しなくなるので、できれば自分でコードを書いておけばよかったのかもしれないが、CSVのレコード分解を書くのは一苦労なので、今後の対応でカバーしよう。 しかし、関数の受け渡し値がcsv仕様とマッチするということ自体が発見だったという事で、ひとまず今回の対応を完了にしておきます。

このブログを検索

ごあいさつ

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