我正在尝试将我的过程代码转换为oop。
<?php
$dbc = get_dbc();
$info = mysqli_query($dbc, "SELECT info_id, info_title FROM text") or die("Error: ".mysqli_error($dbc));
while ($info_row = mysqli_fetch_array($info))
{
$info_id = $info_row['info_id'];
$info_title = $info_row['info_title'];
?>
<div style="width: 100%;">
<div style="float: left;">
<?php echo $info_id; ?>
</div>
<div style="float: left;">
<?php echo $info_title; ?>
</div>
<div style="clear: both;"></div>
</div>
<?php } ?>我在没有HTML样式的类/对象中未完成的尝试:
<?php
class InfoTest {
private $info_id;
private $info_title;
public function __construct() {
$dbc = get_dbc();
$info = $dbc->query ("SELECT info_id, info_title FROM text");
if ($dbc->error) {
printf("Error: %s\n", $dbc->error);
}
while ($info_row = $info->fetch_array())
{
$info_id = $info_row['info_id'];
$info_title = $info_row['info_title'];
}
$info->free();
$this->info_id = $info_id;
$this->info_title = $info_title;
}
public function setInfoID() {
$this->info_id = $info_id;
}
public function getInfoID() {
return $this->info_id;
}
public function setInfoTitle() {
$this->info_title = $info_title;
}
public function getInfoTitle() {
return $this->info_title;
}
public function __destruct() {
}
}
?>
<?php
$display = new InfoTest();
echo $display->getInfoID();
echo $display->getInfoTitle();
?>我的过程代码打印出来:1,1,2,2。
我的oop代码打印出来:2 2
据我所知,oop是这样打印的,因为$info_id和$info_title不是数组,它们只打印最后存储的信息。
所以,如果我改变了:
$info_id = $info_row['info_id'];
$info_title = $info_row['info_title'];至:
$info_id[] = $info_row['info_id'];
$info_title[] = $info_row['info_title'];并打印数组,它显示了我想要的所有信息,但是如何以非数组的形式显示它呢?
到目前为止,我所做的是正确的还是错误的?
发布于 2011-08-16 10:15:37
你做错了。在您的过程示例中,您是一次迭代一行数据;在OO示例中,如果您将它们视为数组,然后打印它们,那么您将一次遍历一列数据。我不会将数据分成单独的id和标题,而是将它们作为一个包(即,类似于您在过程版本中的操作方式)-id与标题一起使用,而不是其他id,对吗?
因此,例如,您可能有一个成员变量
private $texts = array();然后在构造函数中执行以下操作:
while ($info_row = $info->fetch_array()) {
$text = array(
'id' => $info_row['info_id'],
'title' => $info_row['info_title']
);
$this->texts[] = $text;
}然后提供一个方法来获取这个数组数组:
public function getTexts() {
return $this->texts;
}最后,您可以像在过程示例中所做的那样对其进行迭代:
<?php
$display = new InfoTest();
foreach ($display->getTexts() as $text) {
?>
<!-- html goes here -->
<?php echo $text['info_id']; ?>
<!-- more html -->
<?php echo $text['info_title']; ?>
<!-- other html -->
<?
}
?>后退一步--你可以问这一切是否真的有必要。过程式PHP本身并没有什么问题--如果它做了你需要它做的事情,而且做得很清楚,你可能会更喜欢简单而不是复杂。
发布于 2011-08-16 10:07:12
因为info id是对象中的一个数组,所以获取该值的相应函数应该有一个偏移量。或者更好的做法是查看实现迭代器的类,这样就可以对对象执行foreach操作。
发布于 2011-08-16 10:19:29
在切换到OOP之前,我将首先模块化代码,并开始将其划分为逻辑相互分离的功能部分,例如数据库访问和模板:
<?php
/**
* infos provider
*
* @return array
*/
function get_infos()
{
$infos = array();
$dbc = get_dbc();
$info = mysqli_query($dbc, "SELECT info_id, info_title FROM text") or die("Error: ".mysqli_error($dbc));
while ($info_row = mysqli_fetch_array($info))
{
$infos[] = (object) $info_row;
}
return $infos;
}
foreach(get_infos() as $info)
{
?>
<div style="width: 100%;">
<div style="float: left;">
<?php echo $info->info_id; ?>
</div>
<div style="float: left;">
<?php echo $info->info_title; ?>
</div>
<div style="clear: both;"></div>
</div>
<?php } ?>然后将与数据库相关的函数移动到它自己的文件中,以将其与“模板”解耦。完成后,您可以考虑进一步的重构步骤。我建议阅读以下内容(仅独立于命名框架):When flat PHP meets symfony。
https://stackoverflow.com/questions/7072835
复制相似问题