如何使Codeigniter函数变量全局可用?

时间:2011-09-21 18:54:55

标签: php codeigniter

我正在开发一个简单的游戏,用户将随机生成一个宾果游戏板。一旦他们初始化游戏(即在index.php上点击“start”后第1轮),代码就会开始使用新的控制器(bingo_play.php)。该控制器跟踪已标记的图块和每个图块中的信息。

以下是代码:

$card['products'] = array(
    1 => 'hamburger',
    2 => 'fries',
    3 => 'soda',
    4 => 'taco',
    5 => 'bacon',
    6 => 'onions',
    // etc.
);

if ($card['card_number'] == 1)
{
    $card['card_entries'] = array(
        'a1' => '2', 
        'b1' => '8',
        'c1' => '11',
        'a2' => '9', 
        'b2' => '14',
        'c2' => '1',
        'a3' => '16', 
        'b3' => '15',
        'c3' => '23'
    );
}

我想我可以将它们分配为会话数据,但不认为这是最好的举动。不太确定,因为我是Codeigniter的新手。在一个普通的PHP项目中,我可能只会在函数中运行include()

我的问题是,通过多个函数调用使tile的id和text可用的最佳方法是什么,而不必在每个函数中检查和分配数组?

1 个答案:

答案 0 :(得分:1)

global变量和$GLOBALS会导致很多问题,而且最重要的是调试非常困难。它们有它们的用途,但是一旦你开始以这种方式解决每一个问题,事情就会失控并且难以维持。

  

我的问题是,制作瓷砖ID和文字的最佳方法是什么   通过多个函数调用提供,无需检查和   在每个函数中分配数组?

虽然我不是100%清楚你正在使用什么,如果卡数据是静态的,或者用户可以拥有多张卡或更新卡,这些提示可能有所帮助:

如果数据永不改变,请使用Config class。将其存储在配置文件中,加载并使用config_item()$this->config->item()读取项目。

如果它不仅仅是一些静态数据,请考虑创建一个类/库来处理所有“bingo board”相关的内容。一个非常简单的例子:

class Bingo_Board {

    private $card;

    function get_card($id)
    {
        // Assign the values to the $card property if not set yet,
        // getting the values from the database, a file, or wherever they are
        // Randomize them, do whatever you want
        if (empty($this->card))
        {
            $this->card = array(/* your data here*/);
        }

        // Return the card
        return $this->card;
    }
}

然后你可以这样访问卡片:

$this->bingo_board->get_card();

将在请求期间设置值,您可以通过添加reset_card()validate_card()update_card()等功能对其进行扩展。如果您需要存储许多卡,只需使用数组作为$card属性,并按数组索引设置/获取项目。

但是,如果您需要数据在不同请求中持久存在,并且数据不是静态的(例如,在每次请求后更新),则必须使用session data或将其存储在数据库中以便在下一个请求/页面中检索它。只需存储尽可能少的数据,例如卡片ID。

Codeigniter(和PHP就此问题)提供了几种解决问题的方法。最后 - 使用最适合您的方法。获取/设置任意数据的全局变量可以是一种很好的方便的懒惰方式,但是如果你可以避免使用它们 - 你应该这样做。