【问题标题】:How can I make Codeigniter function variables globally available?如何使 Codeigniter 函数变量全局可用?
【发布时间】:2023-03-25 23:42:02
【问题描述】:

我正在开发一个简单的游戏,用户将随机生成一个宾果板。一旦他们初始化游戏(即在 index.php 上单击“开始”后的第 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()

我的问题是,通过多个函数调用使图块的 id 和文本可用而无需在每个函数中检查和分配数组的最佳方法是什么?

【问题讨论】:

  • 查看依赖注入容器。

标签: php codeigniter


【解决方案1】:

global 变量和$GLOBALS 会导致很多问题,除此之外,调试起来也非常困难。它们有其用途,但是一旦您开始以这种方式处理每个问题,事情就会失控且难以维护。

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

虽然我不是 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或将其存储在数据库中在下一个请求/页面中检索它。尽可能少地存储数据,比如卡片 ID。

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

【讨论】:

  • @Louis:由于 Codeigniter 作为一个大型超级对象运行,因此只要加载了类,您就可以从任何地方访问它,并且配置项始终可用。不知道你在这里是什么意思,我觉得你对我的投反对票只是个孩子。
  • 您的回答根本没有涵盖问题中的问题。
  • "My question is, what is the best way to make the tiles' id and text available through multiple function calls without having to check and assign the array in each function?" 例如,设置一个配置项就可以做到这一点。不同之处在于您从CI_Config 读取而不是$GLOBALS 或更糟:global 变量。
  • "How can I make Codeigniter function variables globally available?" 如果不使用对get_instance();config_item(); 的全局帮助程序调用,设置配置项将无法实现全局可用性@ 为什么您认为调用全局框架函数是更好的做法比调用全局语言数组没有任何意义。它们本质上都是使用全局范围的肮脏黑客,应尽可能避免。
  • 如果您曾经使用或处理过第三方代码,您会理解的。使用CI_Config 作为存储对象会限制范围,其中$GLOBALS 可能会被其他人在代码的另一部分中使用它无意覆盖,从而导致很难跟踪错误。这只是一个小例子,它是糟糕设计的标志——当我们有更好的解决方案触手可及时,就应该使用它们。
猜你喜欢
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多