Thinkphp 出现 Call to a member function assign() on a non-object

本文详细介绍了在使用ThinkPHP框架时遇到的“Calltoamemberfunctionassign()onanon-object”错误及其解决方案。通过分析源代码发现,未在自定义构造函数中调用父类构造函数导致父类实例化失败,从而引发错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Call to a member function assign() on a non-object

今天在做东西时遇到了这个问题,调了好久才发现,原来是这样!

出现这个问题的原因是:

我有一个构造函数,但是在这个构造函数中没有调用parent::__construct(); 来实例化父类。

源代码:

开始:

<span style="font-size:18px;">public function __construct(){
		$this->systemService = new SystemService();
	}</span>
报错截图:

加上后:

<span style="font-size:18px;"><span style="color:#333333;">public function __construct(){
		</span><span style="color:#ff0000;">parent::__construct();</span><span style="color:#333333;">
		$this->systemService = new SystemService();
	}</span></span>
这样就好了!~~大家一定要注意啊!~~

简单分析下原因:

我们进入ThinkPHP\Library\Think\Controller.class.php,看到其构造器中有这么一段代码:

//实例化视图类
        $this->view     = Think::instance('Think\View');
然后我们再看报错的122 行,代码是这样:
$this->view->assign($name,$value);
看到这里相信你已经知道原因了吧!~~就是说,如果我们自己有构造函数,而没有调用父类构造函数,对父类进行实例化,那么$this->view 就是空的,没有模版实例,所以我们调用 assign ,就相当于 用 null->assign,就会出现我们看到的错误啦!~~

以后可要注意喽!~~~

<think>我们正在解决ThinkPHP6中出现的'Anon-numericvalueencountered'错误。根据引用资料,这个错误通常发生在非数值被用于数值运算的场景。在ThinkPHP中,这往往与模型的时间字段自动转换有关。分析引用内容:引用[2]和[3]提到,在ThinkPHP5中,如果数据库字段为datetime类型,系统会自动进行时间戳转换。如果我们在获取器(getter)中再次进行转换,就会导致这个错误。解决方法是在模型中关闭该字段的自动转换。在ThinkPHP6中,模型的时间字段自动转换机制类似。因此,我们可以尝试以下解决方案:步骤1:检查模型中是否有时间字段(如create_time,update_time)的定义。如果存在,并且我们不需要自动转换,可以关闭该字段的自动转换。步骤2:在对应的模型中,我们可以通过设置$dateFormat属性来关闭自动转换,或者修改获取器(getter)来避免重复转换。具体方法:方法一:在模型文件中,关闭特定字段的自动转换```phpnamespaceapp\model;usethink\Model;classUserextendsModel{protected$dateFormat=false;//完全关闭时间字段的自动转换//或者,如果只想关闭某个字段的自动转换,可以设置该字段的获取器//例如,对于create_time字段:publicfunctiongetCreateTimeAttr($value){return$value;//直接返回原始值,不进行转换}}```方法二:如果问题出现在模板渲染时,检查模板中是否对时间字段进行了数值运算(比如加减运算)。如果有,确保运算前该字段是数值类型。如果不是,需要先转换。方法三:检查代码中是否有其他地方对非数值进行了算术运算。例如,字符串连接使用点(.)而不是加号(+),但有时误用加号会导致此错误。根据用户提供的引用[3]:在ThinkPHP5中,可以通过在模型中定义获取器并返回原始值来解决。在ThinkPHP6中,同样适用。因此,重点检查模型中的时间字段。如果问题仍然存在,请检查数据库查询返回的数据,确保参与数值运算的字段确实是数值类型。示例:假设我们在模型中有一个price字段,但在数据库中存储的是字符串,那么在运算时就会出错。我们需要确保该字段是数值类型(如使用类型转换)或者在模型中进行转换。在模型中,我们可以使用类型转换:```phpclassProductextendsModel{protected$type=['price'=>'float'];}```这样,price字段在获取时会自动转换为浮点数。总结:1.检查模型的时间字段,避免重复转换。2.使用模型类型转换确保字段为数值类型。3.检查代码中的算术运算,确保操作数是数值。相关问题:§§相关问题§§1.在ThinkPHP6中如何正确使用模型的时间字段自动转换?2.如何设置ThinkPHP6模型的类型转换?3.如何在ThinkPHP6中自定义获取器(getter)和修改器(setter)?4.除了模型字段,还有哪些常见原因会导致'Anon-numericvalueencountered'错误?</think>### ThinkPHP6 'A non-numeric value encountered' 错误解决方案 在ThinkPHP6中遇到 `A non-numeric value encountered` 错误,通常发生在**非数值类型数据被用于数值运算**时。结合引用资料分析,主要原因与解决方案如下: #### 常见原因及解决方案 1. **模型时间字段自动转换冲突**(最常见原因) ThinkPHP模型默认会将 `datetime` 类型字段自动转换为时间戳。若在获取器或模板中再次转换,会导致字符串被用于数值运算: ```php // 错误示例:$create_time 已被自动转换,再次转换导致字符串运算 $user->create_time + 3600; ``` **✅ 解决方案**:在模型中关闭字段的自动转换 ```php namespace app\model; use think\Model; class User extends Model { // 方法1:完全关闭时间自动转换 protected $dateFormat = false; // 方法2:仅关闭特定字段转换 public function getCreateTimeAttr($value) { return $value; // 返回原始值,不进行转换 } } ``` 2. **数据库字段类型不匹配** 数值字段(如 `int`/`float`)在数据库中被存为字符串类型: ```php // 示例:price 字段在数据库是 VARCHAR,但用于计算 $total = $product->price * $quantity; // 触发警告 ``` **✅ 解决方案**: - 修改数据库字段类型为数值类型(如 `DECIMAL`) - 或在模型中使用类型转换: ```php class Product extends Model { protected $type = [ 'price' => 'float' // 强制转换为浮点数 ]; } ``` 3. **表单/请求数据未验证** 用户提交的非数值数据直接用于计算: ```php // 未验证的请求数据 $amount = request()->param('amount'); $result = $amount * 1.1; // 若amount为字符串则报错 ``` **✅ 解决方案**:使用验证器或强制类型转换 ```php // 方法1:验证器 $validate = Validate::rule('amount', 'number'); if ($validate->check(['amount'=>$amount])) { // 安全计算 } // 方法2:强制转换 $amount = (float) request()->param('amount'); ``` 4. **模板中的数值运算** 在视图层直接对非数值数据运算: ```html <!-- 错误示例:create_time 是字符串 --> {:$user->create_time + 86400} ``` **✅ 解决方案**: - 在控制器中预先处理数据 - 使用 `strtotime` 转换时间: ```html {:$user->create_time|strtotime + 86400} ``` #### 调试建议 1. **定位错误位置**: 开启详细错误日志 `config/app.php`: ```php 'show_error_msg' => true, 'app_trace' => true ``` 2. **检查数据类型**: 在运算前使用 `gettype()` 或 `var_dump()` 检查变量类型: ```php // 调试示例 Log::error(gettype($create_time)); // 查看变量类型 ``` > **关键预防措施**: > - 始终验证用户输入数据 > - 使用模型类型转换(`$type`)确保字段数据类型 > - 避免对时间字段的重复转换 > - 在模板中进行数值运算前显式转换类型 [^1]: PHP官方文档指出当非数值参与算术运算时会触发此警告 [^2]: ThinkPHP5的datetime字段自动转换机制会导致此问题 [^3]: 关闭模型自动转换是有效的解决方案 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值