为啥 isset($this->var) 在我的 Codeigniter 模型中总是返​​回 false?

Posted

技术标签:

【中文标题】为啥 isset($this->var) 在我的 Codeigniter 模型中总是返​​回 false?【英文标题】: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" 【参考方案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。 抱歉,回复晚了,希望能帮到人!

【讨论】:

欣赏答案。不幸的是,我没有任何方法可以检查它是否可以解决问题。希望它可以帮助别人:)

以上是关于为啥 isset($this->var) 在我的 Codeigniter 模型中总是返​​回 false?的主要内容,如果未能解决你的问题,请参考以下文章

PHP面向对象

php魔术方法。。

如何在函数中使用无限参数(如 PHP isset())[重复]

isset() 的 PHP 简写? [复制]

PHP检查属性是否存在于对象或类property_exists(mixed $ class,string $ property)isset(mixed $ var [,mixed $ ...])(代码

PHPUnit:模拟__get()导致“__ get()必须正好接受1个参数......”