Codeigniter类变量正在重置

时间:2015-02-27 10:44:26

标签: php codeigniter class variables model-view-controller

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

 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。

我不知道该尝试什么

1 个答案:

答案 0 :(得分:0)

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

private $tree_selected_item = 1;

你说你已经尝试而不是分配一个值,这导致了getter returing null。这也是可以预期的:默认情况下,未初始化的PHP变量实际上已初始化为null。就像JavaScript变量初始化为undefined

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

$_SESSION

看到您已标记此问题 codeigniter ,您可能希望更改编码样式,以符合the codeigniter standards。这意味着allman风格的缩进(打开public function __constructor($treeItem = 1) { $this->tree_selected_item = (int) $treeItem; } '在一个单独的行上,所有这些)。

因此,无论何时需要{的值来保持请求之间,你都必须做这样的事情(我没有使用过CI,所以我不得不把它留给你将此代码转换为CI方式:

tree_selected_item

接下来的请求,您可以正确初始化实例:

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

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