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

如何将已销毁的User对象用户名存入指定数组?

问题分析与修正方案

代码中的核心错误

  • 拼写错误导致致命问题

    • 调用getInfo()时变量名写成$iser1,正确应为$user1,直接触发报错。
    • 构造函数里的$this->registrdate与getInfo()里的$this->registredate拼写不一致(少了字母'e'),导致注册日期无法正常显示。
  • deletedUsers属性作用域错误
    当前deletedUsers是实例属性,每个User对象都会生成独立的数组。销毁对象时,该对象的deletedUsers数组也会被销毁,根本无法留存已删除的用户名。必须改为类的静态属性,让所有User实例共享同一个数组,数据不会随单个对象销毁而丢失。

  • __destruct方法逻辑错误

    • return语句在echo之前,导致echo "User has been deleted";永远无法执行(函数遇到return会直接终止)。
    • 往实例的deletedUsers数组添加数据毫无意义,应该写入类的静态数组。
  • 销毁对象后调用方法的错误
    unset($user1)后,$user1不再指向任何对象,此时调用$user1->getDeletedUsers()会触发错误,因为对象已不存在。需通过类访问静态属性或方法获取已删除用户列表。


修正后的代码

//Class User
class User
{
    //User attributes
    public $firstname;
    public $lastname;
    protected $username;
    protected $registerdate;
    // 改为静态属性,属于类而非单个实例
    public static $deletedUsers = array();

    //Constructor
    public function __construct($firstname, $lastname)
    {
        $this->firstname = $firstname;
        $this->lastname = $lastname;
        $this->username = "$firstname.$lastname" . rand(1, 100);
        // 修正拼写错误
        $this->registerdate = date("d.m.Y");
    }

    public function __destruct()
    {
        // 往类的静态数组中添加用户名
        self::$deletedUsers[] = $this->username;
        echo "User has been deleted<br>";
    }
  
    public function getInfo()
    {
        // 修正拼写错误
        return $this->firstname . " " . $this->lastname . " " . $this->username . " " . $this->registerdate;
    }

    // 改为静态方法,通过类调用
    public static function getDeletedUsers()
    {
        return implode(", ", self::$deletedUsers);
    }
}

$user1 = new User("John", "Smith");
// 修正变量名拼写
echo $user1->getInfo();
echo "<br>";
unset($user1);
// 通过类调用静态方法获取已删除用户
echo "已删除用户:" . User::getDeletedUsers();

关键修改说明

  1. 将$deletedUsers改为public static $deletedUsers,成为类的静态属性,所有实例共享同一数组。
  2. 修正所有拼写错误:变量名、属性名的拼写统一。
  3. __destruct方法中,改为向类的静态数组self::$deletedUsers添加用户名,调整输出语句顺序。
  4. getDeletedUsers改为静态方法,通过self::$deletedUsers访问数据,调用时使用User::getDeletedUsers(),无需依赖已销毁的对象。

内容的提问来源于stack exchange,提问作者oroezz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 13:41:41