为啥 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 isset())[重复]
PHP检查属性是否存在于对象或类property_exists(mixed $ class,string $ property)isset(mixed $ var [,mixed $ ...])(代码