我不知道发生了什么,但是非常令人沮丧。我的代码:
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。
我不知道该尝试什么
答案 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,应用程序逻辑)