2011-09-21 71 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'讀取,或者更糟糕的是:'全局'變量。 –