Php 如何存储包含回调的数据

Php 如何存储包含回调的数据,php,database,callback,Php,Database,Callback,当然,存储数据库的方法有很多种。其中最明显的是数据库。但其他包括JSON、XML等 我现在正在处理的项目的问题是,存储的数据包括回调函数作为对象的一部分。据我所知,函数不能序列化。那么,我该怎么办 是否可以将此数据存储为要包含的PHP文件?如果是这样,我应该创建一个包含所有内容的大文件,还是为数据库的每个“行”将其划分为单独的文件 有更好的选择吗?根据回调的详细程度,对于序列化,您可以将它们全部封装在一个类中,该类使用一些\uu sleep(创建回调表示)和\uu wakeup(还原回调)巫毒,

当然,存储数据库的方法有很多种。其中最明显的是数据库。但其他包括JSON、XML等

我现在正在处理的项目的问题是,存储的数据包括回调函数作为对象的一部分。据我所知,函数不能序列化。那么,我该怎么办

是否可以将此数据存储为要包含的PHP文件?如果是这样,我应该创建一个包含所有内容的大文件,还是为数据库的每个“行”将其划分为单独的文件


有更好的选择吗?

根据回调的详细程度,对于序列化,您可以将它们全部封装在一个类中,该类使用一些
\uu sleep
(创建回调表示)和
\uu wakeup
(还原回调)巫毒,并使用
\uu invoke()
方法调用实际回调。假设您可以对这些回调进行反向工程/重新创建(即指向的对象已清除)。。。。如果不是,你可能就不走运了。

根据回调的详细程度,为了序列化,你可以将它们全部封装在一个类中,该类使用一些
\uu sleep
(创建回调表示)和
\uu wakeup
(还原回调)巫毒,并使用
\uu invoke()
方法调用实际回调。假设您可以对这些回调进行反向工程/重新创建(即指向的对象已清除)。。。。如果没有,您可能运气不好。

存储回调的名称,创建从名称到函数的查找表,使用
table.call(obj,name,…)
table.apply(obj,name,…)
调用。在可序列化对象本身中没有任何代码。因为它们是开发人员创建的,所以应该有一个有限的清单,它们应该是代码,不应该序列化


或者,制作一个实现回调的原型,并将其分配给
obj.\uuuu proto\uuuu
。在序列化之前,杀死
对象。\uuuu proto\uuuu
——所有函数都会消失。以后再恢复。不确定跨浏览器是否兼容;我似乎读过一些关于在某些浏览器中无法访问的
\uu proto\uuuu
的内容,khminternetxploreorperakhm

存储回调的名称,从名称到函数都有一个查找表,使用
table.call(obj,name,…)
table.apply(obj,name,…)
来调用。在可序列化对象本身中没有任何代码。因为它们是开发人员创建的,所以应该有一个有限的清单,它们应该是代码,不应该序列化


或者,制作一个实现回调的原型,并将其分配给
obj.\uuuu proto\uuuu
。在序列化之前,杀死
对象。\uuuu proto\uuuu
——所有函数都会消失。以后再恢复。不确定跨浏览器是否兼容;我似乎读过一些关于在某些浏览器中无法访问的
\uuuu proto\uuuu
的文章,khminternetexploreroperakhm

如果它们是由开发人员创建的,那么应该很容易找到一种格式。。。例如,使用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;
}

这里还需要进行更多的错误处理,以及对您希望允许的可调用项进行一些筛选,但您已经有了想法。

如果它们是由开发人员创建的,那么应该很容易找到一种格式。。。例如,使用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;
}

这里还需要进行更多的错误处理,以及对您想要允许的可调用项进行一些筛选,但您知道了。

这些是用户定义的回调,还是开发人员将创建的回调?这些是用户定义的回调,还是开发人员将创建的回调?啊,php跨浏览器兼容,
\uuuuu协议
?你确定你说的是正确的语言吗?:)呵呵。是的,这有点轻描淡写,不是吗DAhum,php跨浏览器兼容,
\uuuuuuuuuuuuuu
?你确定你说的是正确的语言吗?:)呵呵。是的,这有点轻描淡写,不是吗DSo基本上这调用了一个函数,该函数是在代码的其他地方用指定的参数和上下文定义的?我想这是可行的,但我担心的是所有回调都是匿名的,几乎是唯一的函数。啊。。。我没有意识到它们是匿名函数。在这种情况下,最好考虑将序列化的“事件”存储在datastor中,然后可以将anon函数注册到事件中,就像在Node中一样。主要用例的一个具体示例可能会让您得到一些更好的想法:-)被认为是目前为止最好的答案。所以基本上这调用了一个在代码中其他地方定义的函数,并带有指定的参数和上下文?我想这是可行的,但我担心的是所有回调都是匿名的,几乎是唯一的函数。啊。。。我没有意识到它们是匿名函数。在这种情况下,最好考虑将序列化的“事件”存储在datastor中,然后可以将anon函数注册到事件中,就像在Node中一样。主要用例的一个具体示例可能会让您得到一些更好的想法:-)被认为是迄今为止最好的答案。