【问题标题】:Codeigniter class variables are resettingCodeigniter 类变量正在重置
【发布时间】:2015-04-30 01:15:49
【问题描述】:

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

 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 codeigniter class variables model-view-controller


    【解决方案1】:

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

    private $tree_selected_item = 1;
    

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

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

    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 传统上与各种 DB 一起使用(即 LA(N)MP 堆栈 - Linux(服务器操作系统)Apache(Webserver)(否)MySQL 和 PHP,应用程序逻辑)

    【讨论】:

    • 我不知道...所以“保存”变量的唯一方法是通过 PHP 预定义变量?嗯.. :(
    • @slayerbleast: 不,有很多方法可以“保存” 值:数据库存储、文件、辅助非无状态环境、会话、cookie ......但是您不能做的是在请求之间保留对象的状态。与大多数针对 Web 的语言一样,PHP 是无状态的,这是一件好事。当然,它会产生一些hippy-like pseudo-poetic blog posts,但不要被愚弄,无国籍是一件好事。将请求想象为启动您的计算机、执行一些工作并再次关闭(发送响应)
    • @slayerbleast:冒着看到代表饥饿的风险。如果我已经充分回答了您的问题,您会非常介意marking it as accepted。如果您不确定某事,请随时询问更多信息(或发布后续信息)
    猜你喜欢
    • 2018-11-03
    • 2012-09-15
    • 1970-01-01
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 2020-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多