我正在尝试将面向对象的方法应用于我的网站。
我有以下对象:
通常,每个对象都传递给它上面的对象。
我要做的是,有一个page-> render()函数来渲染整个页面。
我有一个标题数组,一个页脚数组,一个元标记数组和一个脚本数组,渲染函数依次包含它们。该函数看起来像这样:
public function render(){
// to simplify im excluding meta tag and script arrays
foreach($this->headers as $header){
include $header;
}
//page sontents here
foreach($this->footers as $footer){
include $footer;
}
我的问题是我应该如何呈现数据库数据,以便在调用render函数时呈现它们,而不是在我包含视图时呈现?
例如,假设我有以下代码:
$result = mysql_query("SELECT SOME ENTRIES FROM DB");
while($row = mysql_fetch_assoc){
include "views/show_the_entry.php";
}
当调用page-> render()函数时,我该怎么做才能渲染它们?
我是否认为整件事都错了?如果是这样,有人可以提供关于此类OO实施的理念的链接或信息吗?
答案 0 :(得分:1)
我见过处理视图的最常见方法是将视图创建为自己的类。因此,您将从通用视图类开始,并使用模板名称对其进行实例化。
$view = new View('show_the_entry');
从那里,您可以设置查询中的所有相关数据。
while($row = mysql_fetch_assoc($rs)){
$view->set('row', $row);
echo $view->render();
}
这种方法有一些优点:
include
意味着包含的视图可以访问调用脚本中的所有变量。使用View
类将范围隔离到仅传递的内容。View
类在内部仍可以简单地将文件包含在::render
中(这是我见过的最常见的实现)。但是,通过强制您的视图仅使用它所需的内容并明确地将该数据传递给它,您获得了代码隔离,可重用性和可测试性。答案 1 :(得分:1)
首先,我不知道你在哪里学习使用php的mysql,但该网站已经过时了。真的老了。您不应该使用古老的mysql_*
函数编写任何新代码。它们不再被维护,PHP社区有begun弃用它们的过程。相反,您应该使用PDO pr MySQLi来准备语句。新的API实际上是面向对象的,这意味着你的“数据库类”也有点过时了。
对于学习PDO,你可以go here ..对于MySQLi:我不知道。
那就是说,我真的怀疑你应该为这个案例瞄准一个完整的MVC-ish架构。你应该远离框架。
你真正需要的是实现a simple way for templating并取消Java样式 On-class-to-contain-all-all ..或者你所谓的:{{1 }}
而是使用一个简单的脚本..这样的事情:
Page
不,这不能称为MVC或任何类似MVC的东西,因为 View 不应该是一个模板,而是一个类的实例,它处理表示逻辑并且处理多个模板。对于该架构模式的Model2 MVC(也称为--Web MVC)版本, View 的实例从Model层中的 Domain Objects 请求信息。
但正如我已经提到的,在这种情况下实施MVC将是过度的。此外,在您开始深入了解MVC之前,您应该了解SOLID principles和Dependency Injection是什么。
答案 2 :(得分:0)
广泛用于此问题的无处不在的模式是Model-view-controller模式 我认为这就是你要找的东西,但我建议你使用一个已经解决了这些问题的框架。 Symfony 2,Yui和Zend都是很好的框架,你应该使用哪一个取决于你需要构建的网站