PHP面向对象待办程序调用completed()方法为空报错求助
PHP面向对象待办事项程序报错修复方案
错误原因排查
Fatal error: Uncaught Error: Call to a member function completed() on null报错的核心是你调用方法的$t1等变量值为null,具体问题有4处:
set_task方法没有设置返回值,PHP中无显式return的方法默认返回null,你将$task->set_task()的结果赋值给$t1时,$t1自然为null,调用null的方法就会触发报错- 你全程仅实例化了1个
main类对象,三次调用set_task都是在修改同一个对象的name属性,无法得到三个独立的任务对象 - 现有
completed()方法逻辑完全颠倒,属性$completed为false(未完成)时反而返回true,同时没有提供标记任务为已完成的入口,无法实现单独标记完成的功能 - 遍历输出时直接打印任务对象不会展示任务名称,需要调用
get_task()方法获取任务内容
修复方案
完整可运行代码
<?php class Task{ public $completed = false; public $name; // 设置任务后返回当前对象,支持赋值 function set_task($desc){ $this->name = $desc; return $this; } function get_task(){ return $this->name; } // 标记任务为已完成 public function markAsCompleted(){ $this->completed = true; } // 判断任务是否已完成,修正逻辑 public function isCompleted(){ return $this->completed === true; } } // 每个任务单独实例化,得到三个独立对象 $t1 = (new Task())->set_task("Go to the store"); $t2 = (new Task())->set_task("Do homework"); $t3 = (new Task())->set_task("Take a run"); // 标记第一个任务为已完成 $t1->markAsCompleted(); $Tasks = []; array_push($Tasks, $t1); array_push($Tasks, $t2); array_push($Tasks, $t3); foreach($Tasks as $task){ if($task->isCompleted()){ echo "<strike>".$task->get_task()."</strike><br>"; }else{ echo $task->get_task()."<br>"; } } ?>
修复说明
- 将类名从
main改为更语义化的Task,便于后期维护 - 新增
markAsCompleted方法作为标记任务完成的入口,符合面向对象封装原则 - 把原
completed方法改名为isCompleted,修正判断逻辑,直接返回任务的完成状态 - 每个任务创建时都单独实例化
Task类,确保三个任务互相独立,属性互不干扰 set_task方法新增return $this,调用后可以直接赋值给任务变量- 输出时调用
get_task()获取任务名称,避免直接打印对象出现格式错误
内容的提问来源于stack exchange,提问作者Thabelo Mudau
相关产品推荐
相关产品推荐

