1

もちろん、データのベースを保存する方法はたくさんあります。それらの中で最も明白なデータベース。ただし、JSON、XMLなどが含まれるものもあります。

私が現在取り組んでいるプロジェクトで私が持っている問題は、保存されているデータにオブジェクトの一部としてコールバック関数が含まれていることです。私の知る限り、関数をシリアル化することはできません。だから、私は何をすべきですか?

このデータをPHPファイルとして保存して含めることはできますか?もしそうなら、すべてを含む1つの大きなファイルを作成する必要がありますか、それともデータベースの「行」ごとに別々のファイルに分割する必要がありますか?

より良い代替案はありますか?

4

3 に答える 3

1

コールバックの精巧さに応じて、シリアル化のために、実際のコールバックを呼び出すメソッドを使用して、いくつかの__sleep(コールバック表現の作成)および__wakeup(コールバックの復元)ブードゥーを利用するクラスでそれらをすべてラップできます。__invoke()これらのコールバックをリバース エンジニアリング/再作成できると仮定します (つまり、指すオブジェクトが明確である)... そうでない場合は、おそらく運が悪いでしょう。

于 2012-06-16T00:45:16.907 に答える
0

それらが開発者によって作成された場合、フォーマットを考え出すのは簡単なはずです...たとえば、JSONを使用します。

{
  "callback" : {
      "contextType": "instance", // or "static"
      "callable" : "phpFunctionName",
      "arguments" : [] 
   }
}

したがって、この機能を使用できるモデルでは、次のようにすることができます。

protected function invokeCallback($json, $context = null) {
   $data = json_decode($json, true);
   if(isset($data['callaback'])) {
      if($data['contextType'] == 'instance') {
         $context = is_object($context) ? $context : $this;
         $callable = array($context, $data['callable']);
      } else {
         // data[callable] is already the string function name or a array('class', 'staticMethod')
         $callable = $data['callable'];
      }

      if(is_callable($callable) {
         return call_user_func_array($callable, $data['arguments'];   
      } else {
         throw new Exception('Illegal callable');
      }
   }

   return false;
}

そこで発生する必要があるエラー処理と、許可したい呼び出し可能オブジェクトのスクリーニングがいくつかありますが、アイデアは得られます。

于 2012-06-16T01:39:09.657 に答える
0

代わりにコールバックの名前を保存し、名前から関数への参照テーブルを持ち、table.call(obj, name, ...)またはtable.apply(obj, name, ...)呼び出します。シリアル化可能なオブジェクト自体にコードを含めないでください。それらは開発者によって作成されるため、限られた在庫が必要であり、コード内にある必要があり、シリアル化されるべきではありません。

または、コールバックを実装するプロトタイプを作成し、それを に割り当てますobj.__proto__obj.__proto__シリアル化する直前に殺します-すべての機能が消えます。後で元に戻してください。ブラウザ間の互換性があるかどうかは不明です。__proto__一部のブラウザーでアクセスできないことについて何か読んだようです

于 2012-06-16T00:57:55.300 に答える