PHP OOP练习:如何将表单数据转为对象存入数组实现产品库存管理
代码修改方案
问题根因
你当前的代码存在两个核心问题:
- 直接将单个产品对象赋值给
$_SESSION["prod"],每次提交都会覆盖旧数据,没有用数组存储多个产品 - 构造方法已经完成了属性赋值,后续重复调用set方法属于冗余代码,且没有对SESSION变量做初始化,容易出现未定义变量警告
完整修改后的处理代码
<?php // 启动会话必须放在代码最顶部 session_start(); include_once "product.php"; // 初始化存储产品的会话数组,仅首次访问时执行 if (!isset($_SESSION['prod_list'])) { $_SESSION['prod_list'] = []; } $max_product_limit = 50; // 添加产品逻辑 if (isset($_POST["add"])) { $current_count = count($_SESSION['prod_list']); if ($current_count >= $max_product_limit) { echo "错误:最多仅支持添加50个产品"; exit; } // 构造方法直接赋值,无需重复调用set方法 $new_prod = new Product( (int)$_POST["key"], trim($_POST["description"]), (float)$_POST["price"], (int)$_POST["stock"] ); // 追加到数组末尾,不会覆盖原有数据 $_SESSION['prod_list'][] = $new_prod; echo "产品添加成功,当前已添加" . ($current_count + 1) . "个产品"; } // 列出所有产品逻辑 if (isset($_POST["list"])) { if (empty($_SESSION['prod_list'])) { echo "当前没有录入任何产品"; exit; } echo "<h4>产品列表</h4> <table border='1' cellpadding='6' cellspacing='0'> <tr><th>产品键号</th><th>产品描述</th><th>价格</th><th>库存</th></tr>"; foreach ($_SESSION['prod_list'] as $prod) { echo "<tr> <td>{$prod->getKey()}</td> <td>{$prod->getDescription()}</td> <td>{$prod->getPrice()}</td> <td>{$prod->getStock()}</td> </tr>"; } echo "</table>"; } // 删除产品逻辑(按表单输入的产品键号匹配删除) if (isset($_POST["baja"])) { $target_key = (int)$_POST["key"]; foreach ($_SESSION['prod_list'] as $index => $prod) { if ($prod->getKey() === $target_key) { unset($_SESSION['prod_list'][$index]); // 重置数组索引,避免后续操作出现索引异常 $_SESSION['prod_list'] = array_values($_SESSION['prod_list']); echo "键号为{$target_key}的产品已删除"; exit; } } echo "未找到键号为{$target_key}的产品"; } // 按产品键号升序排序逻辑 if (isset($_POST["Sort"])) { usort($_SESSION['prod_list'], function ($a, $b) { return $a->getKey() - $b->getKey(); }); echo "已按产品键号升序排序完成,点击列表按钮可查看排序结果"; } // 退出逻辑:清空会话数据 if (isset($_POST["exit"])) { session_unset(); session_destroy(); echo "已退出,所有临时产品数据已清空"; } ?>
关键调整说明
- 存储结构调整:使用
$_SESSION['prod_list']数组存储所有产品对象,通过[]语法追加新元素,避免覆盖旧数据 - 冗余代码删除:构造方法已经传入参数完成属性赋值,删除了重复调用set方法的冗余代码
- 变量初始化:首次访问时初始化产品数组和上限变量,避免未定义变量警告
- 功能补全:完整实现了添加、删除、列表、排序、退出五个要求的功能
- 类型校验:对输入的键号、价格、库存做了强制类型转换,避免类型不一致导致的逻辑错误
内容的提问来源于stack exchange,提问作者gsad
相关产品推荐
相关产品推荐

