我想为我的php控制器实现一个真正的模式MVC。特别是,我想通过在PHP(用于业务组织的对象)中创建等效的Java“ bean”和使用这些业务对象的API来拆分模型和API。例如,我的基本对象是会员。问题是:我在哪里请求数据库?我是否在__construct上要求所有成员的属性,并且只使用getter访问它们,或者在__construct中什么也不做,并且在每个getter函数中调用数据库?人们告诉我,第一种解决方案更好,但是,如果我只想在控制器中提供特定信息,我将创建一个Member,其中包含在构造时就计算出的所有信息(错误的内存管理)。在第二种情况下,如果我想要几个成员属性,我将执行几个SQL请求,这将增加服务器执行时间。第一种解决方案:public function __construct($ID_membre,$sql){ $this->ID_membre = $ID_membre; $res = mysql_get("select * from membres where ID_membre = $ID_membre",$sql); if(!$res) throw new Exceptions\MyDefaultException("no member for this Id"); $this->firstName = $res['first_name']; $this->lastName = $res['last_name']; $this->mail = $res['mail']; $this->gender = $res['gender']; // .... $this->sql = $sql;}public function getLastName(){ return $this->lastName;}public function getMail(){ return $this->mail;}public function getGender(){ return $this->gender;}// .... 第二解决方案:public function __construct($ID_membre,$sql){ $this->ID_membre = $ID_membre; $res = mysql_get("select count(*) from membres where ID = $ID_membre",$sql); if($res == 0) throw new Exceptions\MyDefaultException("no member with this id"); $this->sql = $sql;}public function getLastName(){ mysql_get("select name from members where ID = {$this->id}",$this->sql); return $this->lastName;}public function getMail(){ mysql_get("select mail from members where ID = {$this->id}",$this->sql); return $this->mail;}public function getGender(){ mysql_get("select gender from members where ID = {$this->id}",$this->sql); return $this->gender;}在这种情况下,控制器中良好的旧SQL自定义请求非常适合不浪费时间或内存,因为它们是习俗。那么,为什么今天这样的请求被如此糟糕地看待呢?并且,如果Fb或Google这样的大型组织使用数据库进行MVC,那么在拆分模型和控制器时如何不浪费任何时间/内存呢?
1 回答
慕尼黑5688855
TA贡献1848条经验 获得超2个赞
这是一个经典的问题,如果您想要多个成员的一个属性,甚至会变得更糟。
标准答案是解决方案1更好。从数据库中请求一行不会比从数据库中请求一个值花费更长的时间,因此一次请求整行是有意义的。那是除非您的数据库行变得很大。但是,在良好的数据库设计中不应发生这种情况。如果您的行太大,以至于妨碍了效率,那么可能是时候拆分表了。
现在回到我在此答案开头提到的问题。您还没有解决这个问题。我的建议是制作两类:一种解决方案1,处理一行,另一种解决方案2,处理多行。
因此,这两种解决方案都有自己的位置,只是解决方案2几乎总是无法处理一行,而且我什至没有谈到它所需的额外编码量。
- 1 回答
- 0 关注
- 112 浏览
添加回答
举报
0/150
提交
取消