2011-09-21 68 views
1

我正在一个简单的游戏中,用户将随机生成一个宾果板。一旦他们初始化游戏(即在点击index.php上的“start”之后的第1轮),代码开始使用新的控制器(bingo_play.php)。该控制器跟踪已标记的瓦片和每个瓦片中的信息。如何使Codeigniter函数变量全局可用?

下面的代码:

$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和文本可用而不必在每个函数中检查和分配数组的最佳方式?

+0

调查依赖注入容器。 – dqhendricks

回答

1

global变量和$GLOBALS可能导致很多问题,并且最重要的是可能非常难以调试。他们有他们的用处,但一旦你开始用这种方式处理所有问题,事情就会失控并且难以维护。

我的问题是,什么是让瓷砖标识和文字 可通过多个函数调用,而不必检查和 分配在各项功能的阵列的最佳方式?

虽然我不是你正在使用什么100%的清楚,如果卡内的数据是静态的或者没有,或者如果用户可以有几个卡或更新卡片,这些技巧可以帮助:

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

如果除了一些静态数据还有其他更多的内容,请考虑创建一个类/库来处理所有“宾果板”相关的问题。一个很简单的例子:

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或将其存储在数据库中以便在下一个请求/页面中检索它。只需存储尽可能少的数据,例如卡号就可能。

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

+0

@Louis:由于Codeigniter作为一个超大对象运行,因此只要加载该类,就可以从任何地方访问它,并且配置项始终可用。不知道你在这里的意思,我觉得你只是我的downvote的孩子。 –

+0

你的答案根本不包括问题中提出的问题。 – Louis

+0

“'我的问题是,通过多个函数调用使tile的id和文本可用,而不必在每个函数中检查和分配数组的最佳方式是什么?'”设置一个配置项例如, 。不同之处在于你从'CI_Config'而不是'$ GLOBALS'读取,或者更糟糕的是:'全局'变量。 –