笨类变量复位(Codeigniter class variables are resetting)

2019-10-22 02:53发布

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

 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。

我不知道什么尝试

Answer 1:

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

private $tree_selected_item = 1;

你说你已经尝试分配一个值,这就造成了吸气returing null 。 这又是可以预料的:未初始化的PHP变量实际上初始化为null默认情况下。 如同JavaScript变量初始化为undefined

无论如何,这一切意味着每个实例将开始出生活与tree_selected_item如果你想跟踪的请求之间的值设置为1,你将不得不使用$_POST$_GET$_COOKIE或最好$_SESSION来存储数据。 然后,你只需定义你的类的构造函数,把你想作为参数,即值:

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

看到你已经标记了这个问题 ,你可能想改变你的编码风格,以符合该标准的笨 。 含义奥尔曼风格的压痕(打开{我们去一个单独的行和所有)。

所以每当你需要的值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操作系统(服务器操作系统)的Apache(Web服务器)(否)MySQL和PHP,应用程序逻辑)



文章来源: Codeigniter class variables are resetting