代码点火器类变量正在重置


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?

我尝试不赋值,然后当我得到变量时返回null。

我不知道该尝试什么

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

private $tree_selected_item = 1;

您说您尝试了而不是赋值,这导致getter返回null。这也是意料之中的事:未初始化的PHP变量实际上默认初始化为null。就像JavaScript变量被初始化为undefined一样。

不管怎样,所有这些都意味着每个实例在生命开始时都会将tree_selected_item设置为1。如果要跟踪请求之间的值,则必须使用$_POST$_GET$_COOKIE或最好使用$_SESSION来存储该数据。然后,您只需在类中定义一个构造函数,该构造函数将您想要的值作为参数,即:

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

鉴于您已经标记了这个问题codeigniter,您可能需要更改您的编码样式,以符合codeigniter标准。意思是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']);

当然,您会发现,随着应用程序的增长,您想要存储的值的绝对数量会变得相当大。从那时起,您将开始使用会话作为识别用户的手段,并使用DB存储所有相关数据。这就是为什么PHP传统上与各种DB(即LA(N)MP堆栈-Linux(Server OS)Apache(Webserver)(No)MySQL和PHP,应用程序逻辑)一起使用