Codeigniter class 变量正在重置

Codeigniter class variables are resetting

我不知道发生了什么,但非常令人沮丧。我的代码:

 class Catalog extends CI_Model {

     private $tree_selected_item = 1;

     public function get_tree_item_selected() {
         return empty($this->tree_selected_item) ? 1 : $this-> 

     public function set_tree_item_selected($i){
         $this->tree_selected_item = $i;
}

所以我可以在任何我想做的地方使用它:

 $this->catalog->set_tree_item_selected($i);
 $selected = $this->catalog->get_tree_item_selected();

问题是我可以改变这个变量的值。但是当我导航到另一个页面时,这个变量重置为它的原始值:1。为什么?

好像每次都加载模型?所以变量总是定义为 1?

我试过不赋值,然后当我得到变量returns null.

我不知道该尝试什么

PHP 本质上是无状态的。这意味着,对于每个请求,将创建您使用的所有 classes 的新实例,并按照 class {} 代码位中的定义进行初始化。由于您的 class 声明并初始化了 属性 ,因此:

private $tree_selected_item = 1;

您说您已尝试 分配值,这导致 getter 返回 null。同样,这也是意料之中的:未初始化的 PHP 变量实际上默认初始化为 null。就像 JavaScript 变量被初始化为 undefined.

无论如何,所有这一切都意味着每个实例都将以 tree_selected_item 设置为 1 开始。如果你想跟踪请求之间的值,你必须使用 $_POST$_GET$_COOKIE 或最好是 $_SESSION 来存储该数据。然后,您只需在 class 中定义一个构造函数,它将您想要的值作为参数,即:

public function __constructor($treeItem = 1)
{
    $this->tree_selected_item = (int) $treeItem;
}

鉴于您已将此问题标记为 codeigniter,您可能想要更改编码风格以符合 the codeigniter standards。意思是 allman 风格的缩进(打开 { 在单独的一行上等等)。

因此,每当您需要 tree_selected_item 的值在请求之间保持不变时,您就必须执行类似的操作(我没有使用过 CI,所以我必须将此代码转换为 CI-做事的方式由您决定:

//session_start(); should be called prior to this point
$_SESSION['treeItem'] = $instance->get_tree_selected_item();

所以来下一个请求,你可以正确初始化实例:

//again, you need a session_start call
$instance = new Catalog($_SESSION['treeItem']);

当然,您会发现,随着应用程序的增长,您要存储的值的绝对数量会变得相当大。正是在这一点上,您将开始使用会话作为识别用户的手段,并使用数据库来存储所有相关数据。这就是为什么 PHP 传统上与各种数据库(即 LA(N)MP 堆栈 - Linux(服务器 OS)Apache(Web 服务器)(否)MySQL和PHP,应用程序逻辑)