Как я могу сделать переменные функции Codeigniter глобально доступными? - PullRequest
1 голос
/ 21 сентября 2011

Я работаю над простой игрой, где пользователь будет случайным образом генерировать доску бинго. Как только они инициализируют игру (т. Е. Раунд 1 после нажатия «start» на index.php), код начинает использовать новый контроллер (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() для функции.

Мой вопрос: как лучше всего сделать идентификатор и текст плиток доступными через несколько вызовов функций, не проверяя и не назначая массив в каждой функции?

1 Ответ

1 голос
/ 22 сентября 2011

global переменные и $GLOBALS могут привести к большому количеству проблем, и, кроме того, их чрезвычайно сложно отладить. Они имеют свое применение, но как только вы начинаете подходить к каждой проблеме таким образом, вещи могут выйти из-под контроля и их будет сложно обслуживать.

У меня вопрос, как лучше всего сделать идентификатор и текст плиток? доступны через несколько вызовов функций без необходимости проверять и назначить массив в каждой функции?

Хотя я не на 100% уверен в том, с чем вы работаете, а также, являются ли данные карты статичными или нет, или если у пользователей может быть несколько карт или карт обновления, эти советы могут помочь:

Если данные никогда не меняются, используйте класс Config в ваших интересах. Сохраните его в файле конфигурации, загрузите его и прочитайте элементы с помощью 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 и установите / получите элементы по индексу массива.

Однако, если вам нужно, чтобы данные сохранялись в разных запросах и данные не были статичными (например, они обновляются после каждого запроса), вам придется использовать данные сеанса или сохранять их в базе данных, чтобы получить его в следующем запросе / странице. Просто храните как можно меньше данных, например, идентификатор карты.

Codeigniter (и PHP в этом отношении) предоставляют несколько способов решения проблемы. В конце концов - используйте тот метод, который вам больше подходит. Глобальные переменные могут быть удобным и ленивым способом получения / установки произвольных данных, но если вы можете избежать их использования - вам следует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...