在mysql中保存php函数

时间:2014-04-15 06:42:46

标签: php mysql

创造一个游戏是我童年时代的梦想,现在我真的知道自己应该如何实现自己的梦想,并在业余时间开始研究一个小游戏项目。它基本上是一种战斗类型的游戏,你有多达3个单位,以及你的对手,你轮流(因为它的http,你知道那种感觉)互相攻击并施放法术和东西。我遇到的问题是能力以及如何存储它们。基本上如果我要将数据存储在数组中,它看起来就像

$abilities = array(
    0 => array(
        'name' => 'Fire ball',
        'desc' => 'Hurls a fire ball at your enemy, dealing X damage.'
        'effect' => function($data){
            $data['caster']->damage($data['target'], $data['caster']->magicPower);
        }
    ),
    1 => array(...
);

但是,如果我以这种方式存储能力,每次我需要获取有关单个能力的信息时,我需要加载整个数组并且它可能会在时间上变得非常大,所以这样做是一种巨大的记忆浪费。所以我跳到了我的另一个选项,将功能保存在mysql表中,但是我遇到了effect部分的问题。如何将函数保存到mysql字段中并能够按需运行它?

或者,如果你可以建议另一种方法来拯救这些能力,我可能已经错过了。

2 个答案:

答案 0 :(得分:3)

要回答有关将数组存储到数据库(如MySQL)的问题,我希望您将数组序列化为String。正常的直接序列化不起作用,因为它们不会处理关闭。

您需要使用类似super_closure的类,它可以序列化方法并将它们转换为字符串。 Read more here

https://github.com/jeremeamia/super_closure

$helloWorld = new SerializableClosure(function($data){
            $data['caster']->damage($data['target'], $data['caster']->magicPower);
        });
$serializedFunc = serialize($helloWorld);

现在您可以像这样创建数组:

$abilities = array(
    0 => array(
        'name' => 'Fire ball',
        'desc' => 'Hurls a fire ball at your enemy, dealing X damage.'
        'effect' => $serializedFunc
    ));

此数组现在可以直接保存,序列化或编码为JSON。

我建议您查看 Redis Memcache 以缓存查询结果,并且不要使用MySQL来存储功能。

答案 1 :(得分:2)

你可以有树表

<强>法

  • ID
  • 名称
  • 描述

<强> spell_effect

  • ID
  • 名称
  • serversidescript

<强> spell_effect_binder

  • spell_id
  • spell_effect_id

这将确保您的逻辑在php文件中,您希望它们位于哪里,但是法术,效果以及它们如何在数据库中绑定在一起的所有元素。这意味着您只需加载有需要的函数/脚本。另外,还可以为一个咒语附加多个效果。

//Firedamage.php
public function calculateEffects($level,$caster,$target) {

    $extraDamage = 5*$level;
    $randDamage = rand(10,50);

    $caster->damage( $target, ($randDamage+$extraDamage) );
}

Spell_effect条目

  • id = 1
  • name =&#39; firedamage&#39;
  • serversidescript =&#39; Firedamage.php&#39;

<强>法

  • id = 1
  • name =&#39; Fireball&#39;
  • description =&#39;向敌人发射火球&#39;

<强> spell_effect_binder

  • spell_id = 1
  • spell_effect_id = 1