【问题标题】:Why is isset($this->var) always returning false in my Codeigniter model?为什么 isset($this->var) 在我的 Codeigniter 模型中总是返​​回 false?
【发布时间】:2017-08-26 16:33:25
【问题描述】:

我正在使用 Codeigniter 3 和 PHP 7。

在我的一个模型中,如果用户已登录,我会尝试设置用户 ID 变量并将其保存到数据库中。在我所有的控制器中,顶部都有一个会话检查,如果用户登录,它会设置 $this->uid。我在模型中使用的代码如下所示。 $uid 总是保存为 NULL。

if(isset($this->uid)){
    $uid = $this->uid;
}else{
    $uid = NULL;
}

如果我尝试不使用布尔值(如下所示),则 $uid var 返回用户 ID 值并在用户登录时正确保存到数据库,如果用户未登录则错误。所以我我确信错误不是 $this->uid 中的缺失值。

$uid = $this->uid;

【问题讨论】:

  • 你能发布 var_dump($this->uid); ?
  • 登录时来自 var_dump($this->uid) 的结果:string(1) "1"

标签: codeigniter isset


【解决方案1】:

Codeigniter 3 使用CI_Model 中的__get() 魔术函数来实现模型中的控制器属性。 (您可以验证:CI 3 github

检查控制器中的var_dump($this); 代码和模型。在控制器中,您将看到属性名称及其值,但在您的模型中则不会。 也检查var_dump($this->uid, isset($this->uid));。您将在控制器和模型中看到该值,但 isset() 将在您的模型中失败。

如果您在模型类中创建 __isset() 魔术函数,您可以修复它。 例如(models/User_model.php):

class User_model extends CI_Model
{
    public function __construct()
    {
        // Without declaring __isset() magic func, the isset($this->uid) returns with bool(false)
        var_dump($this, $this->uid, isset($this->uid)); // object(User)#14 (0) { } int(69) bool(true)
    }

    public function __isset(string $property): bool
    {
        return isset(get_instance()->$property);
    }
}

在您的控制器(controllers/User.php)中,您只需为 $this->uid 分配一个值。

class User extends CI_Controller
{
    public function index()
    {
        $this->uid = 69;
        $this->load->model('user_model');
    }
}

注意: 更专业的方式,如果你创建一个从CI_Model 扩展的MY_Model 类。在此类中,您可以按上述方式定义__isset()。唯一的区别是,User 类(和其他模型)将从新的 MY_Model 扩展而来,您可以在 application/core 文件夹中创建它。

在这里您可以了解更多关于 PHP 中的Property overloading
抱歉,回复晚了,希望能帮到人!

【讨论】:

  • 欣赏答案。不幸的是,我没有任何方法可以检查它是否可以解决问题。希望它可以帮助别人:)
猜你喜欢
  • 1970-01-01
  • 2016-02-26
  • 2017-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多