You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 07:06:04