从程序迁移到OOP的正确方法PHP-“对象”应该是什么?

时间:2019-10-18 06:07:59

标签: php oop

我正在学习将代码编码为OOP,但认为我没有正确理解如何从数据库中调用很多行,而是在每一行中创建一个对象的基础知识。

例如,从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'];
    }

?>

我的问题是我认为“对象”应该是“学生”,而不是学生群体?

但是,如果我让每个瞳孔都位于一个单独的对象中,则需要逐个瞳孔而不是一个函数地调用它们的信息。

那么我应该这样做吗? (这样可以避免每个对象每次都从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();
    }

?>

我想我的问题在什么时候可以变成一个对象?也许从数据库中获取学生信息需要上一堂课,然后与每个学生一起工作又是另一堂课?

非常感谢您的帮助

2 个答案:

答案 0 :(得分:1)

就像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];
}

}

答案 1 :(得分:0)

我认为您有一个代表学生的类,还有一个代表学生列表的类:

“学生”类将包含学生的所有业务逻辑(获取姓名,年龄等)。 PupilCollection类将包含Pupil列表的所有业务逻辑(添加,删除,列出所有学生,描述他们,计数等)。如果您不需要特定的方法来收集Pupil,则不需要创建PupilCollection类,那么将使用一系列Pupil即可。