我正在尝试将我的过程代码转换为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: %sn", $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 One 2 Two.
我的oop代码打印出:2 Two
根据我的理解,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'];
并打印数组,它显示了我想要的所有信息,但是如何以非数组形式显示它?
到目前为止我所做的是正确的还是我接近这个错误?
你做错了。在你的程序示例中,你一次迭代一行数据;在您的OO示例中,如果您将它们视为数组,然后将它们打印出来,那么您将一次一列地遍历数据。而不是将数据分成单独的id和标题,我将它们视为一个bundle(即类似于您在过程版本中所做的)- 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本身并没有什么问题——如果它能做你需要它做的事情,而且做得很清楚,那么在这里,你最好选择简单而不是复杂。
由于info id是对象中的数组,因此获取该值的相应函数应该采取偏移量。或者更好的是,你应该看看你的类实现迭代器这样你就可以对对象
在切换到面向对象之前,我首先要将代码模块化,并开始分割成具有相互分离逻辑的功能部分,例如数据库访问和模板:
<?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 } ?>
然后将数据库相关的函数移动到它自己的文件中,以将其与"模板"解耦。完成这些之后,您可以考虑进一步的步骤来进行重构。我建议如下阅读(这仅仅是独立于命名框架):当平面PHP遇到symfony.