PHP中通过ID获取项目名称始终返回null问题求助
嘿,我帮你找出问题所在啦,咱们一步步来解决:
问题根源分析
你遇到的两个核心问题导致方法始终返回null:
项目对象存储的引用错误
在首页的while循环里,你一直复用同一个$ObjProjet对象。PHP里对象是按引用传递的,所以$arrObjProject数组里的所有元素其实都是指向同一个对象的引用——循环结束后,数组里的所有"项目"都会是最后一次循环的项目数据,根本没有保存所有项目的信息。方法逻辑的设计错误
你的Projects类里的$project_id是单个私有属性,不是数组!所以foreach($this->project_id as $idproj)这行代码根本无法执行循环(单个值不能被遍历),直接跳过循环返回null。而且从设计角度来说,单个Projects对象应该代表一个项目,而不是所有项目的集合。
修复方案与代码示例
第一步:调整单个项目的类(更名为Project更符合语义)
让类只负责单个项目的属性存储和基础访问方法:
class Project { private $project_id; private $project_name; private $project_state; public function setAllProject($id_project, $name_project, $state_project) { $this->project_id = $id_project; $this->project_name = $name_project; $this->project_state = $state_project; } // 新增获取ID和名称的方法,供外部访问 public function getProjectId() { return $this->project_id; } public function getProjectName() { return $this->project_name; } }
第二步:修复首页存储项目的循环
每次循环都创建新的Project对象,确保每个项目都是独立实例:
$arrObjProject = []; $i = 0; while($dataProjet = mysqli_fetch_array($rs)){ // 每次循环新建一个项目对象 $objProject = new Project(); $objProject->setAllProject($dataProjet["project_id"], $dataProjet["project_name"], $dataProjet["project_state"]); $arrObjProject[$i] = $objProject; $i++; }
第三步:实现根据ID获取项目名称的逻辑
在项目集合(数组)上进行遍历,而不是单个项目对象里:
function getProjectNameByID($p_id, $projects) { foreach($projects as $project) { if($project->getProjectId() == $p_id){ return $project->getProjectName(); } } // 找不到对应ID时返回null return null; } // 使用示例:传入目标ID和项目数组 $targetProjectName = getProjectNameByID(1001, $arrObjProject);
如果想更贴合面向对象设计,可以封装一个项目集合类:
class ProjectCollection { private $projects = []; public function addProject(Project $project) { $this->projects[] = $project; } public function getProjectNameByID($p_id) { foreach($this->projects as $project) { if($project->getProjectId() == $p_id) { return $project->getProjectName(); } } return null; } } // 使用方式 $projectCollection = new ProjectCollection(); while($dataProjet = mysqli_fetch_array($rs)){ $objProject = new Project(); $objProject->setAllProject($dataProjet["project_id"], $dataProjet["project_name"], $dataProjet["project_state"]); $projectCollection->addProject($objProject); } // 获取目标名称 $targetName = $projectCollection->getProjectNameByID(1001);
为什么这样改?
- 单个
Project对象职责单一,只管理自己的属性,符合面向对象设计原则; - 每次循环新建对象,避免了引用覆盖问题,确保数组里每个元素都是独立的项目实例;
- 把"根据ID找名称"的逻辑放在项目集合上,遍历所有项目实例对比ID,逻辑更合理。
内容的提问来源于stack exchange,提问作者DEVLOGIN
相关产品推荐
相关产品推荐

