[英]Correct Way to Migrate from Procedual to OOP PHP - What should be the “Object”?
我正在学习编码为 OOP 但我认为我没有正确理解如何从数据库中调用大量行的基本原理,然后从每一行中制作一个 object。
因此,例如从 DB 中绘图并通过所有相关学生进行工作。
我目前正在做这样的事情:
<?php
//Class -----------------------
$pupils = new getPupils();
$pupils->addFilter('year1');
$pupil_info = $pupils->returnPupils();
//On Page ----------------
foreach($pupil_info as $pupil_id->$p){
//Show pupil - but this is no longer OOP?
echo $p['pupil_name'];
}
?>
我的问题是我认为“对象”应该是“学生”,而不是学生群体?
但是,如果我将每个学生放在单独的 object 中,我需要逐个学生而不是在一个 function 中调用他们的信息。
那么我应该这样做吗? (这避免了每个 object 每次都从 db 调用信息)
<?php
function getPupilsInfo($year='*')
{
/* Call all pupils from database and return multi-dimensional array */
return $pupilsInfo;
}
//On Page --------------------------------
$pupilInfo = getPupilsInfo('year1');
foreach($pupilInfo as $pupil_id->$p)
{
$thisPupil = new Pupil($p);
echo $thisPupil->getPupilName();
}
?>
我想我的问题是什么时候将它变成 object? 也许从数据库中提取学生信息需要是一个 class,然后与每个学生一起工作的是另一个 class?
非常感谢您的帮助
就像 GrenierJ 提到的那样,为每种可能一次存在多次的对象创建一个对象集合是一种很好的做法。
我会像这样构建它。不是确切的解决方案,而是一个快速而肮脏的解决方案来获得正确的方向:)。
Pupil {
private $tablename="pupil"
private $name, $prename, $gender etc. (private with getter and setter function)
/**@var SchoolClass *//
private $schoolClass (class is a protected keyword..., this is the backConnection to the collection)
}
SchoolClass {
private classes=new Array();
public function addNewClassToSchool(string $className){
§this->classes[$className][]=new Array();
}
publlic function addPupilToClass($className, Pupil $pupil){
$this->classes[$className][]=$pupil
}
public function getSchoolClass($className){
return $this->classes[$className];
}
}
我想你有一个代表瞳孔的 class 和一个代表瞳孔列表的 class :
class Pupil 将包含 Pupil 的所有业务逻辑(获取姓名、年龄等)。 class PupilCollection 将包含 Pupil 列表的所有业务逻辑(添加、删除、列出所有学生、描述它们、计数等)。 如果您不需要特定的 Pupil 集合方法,则不需要创建 PupilCollection class,一个 Pupil 数组就可以了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.