如何将已销毁的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();
关键修改说明
- 将
$deletedUsers改为public static $deletedUsers,成为类的静态属性,所有实例共享同一数组。 - 修正所有拼写错误:变量名、属性名的拼写统一。
__destruct方法中,改为向类的静态数组self::$deletedUsers添加用户名,调整输出语句顺序。getDeletedUsers改为静态方法,通过self::$deletedUsers访问数据,调用时使用User::getDeletedUsers(),无需依赖已销毁的对象。
内容的提问来源于stack exchange,提问作者oroezz
相关产品推荐
相关产品推荐

