面向对象编程的PHP过程
我正在尝试将我的过程代码转换为oop面向对象编程的PHP过程,php,html,oop,procedural,Php,Html,Oop,Procedural,我正在尝试将我的过程代码转换为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']; $
<?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 } ?>
致:
然后打印数组,它会显示我想要的所有信息,但是如何以非数组形式显示它呢
到目前为止,我所做的是正确的还是错误的?因为info id是对象中的一个数组,所以获取值的相应函数应该有一个偏移量。或者更好的是,您应该查看实现迭代器的类,这样您就可以在对象上执行foreach操作了您做错了。在您的过程示例中,您一次迭代一行数据;在您的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没有本质上的错误-如果它做了您需要它做的事情,并且做得很清楚,那么您最好选择简单而不是复杂。在切换到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 } ?>
然后将与数据库相关的函数移动到它自己的文件中,以将其与“模板”分离。完成后,您可以考虑进一步的重构步骤。我建议阅读以下内容(仅与命名框架无关):.投票迁移到只迭代公共属性的@hakre。我想Matthew说的是实现
IteratorAggregate
(或类似)以在内部array@Phil:显然,是的。这只是一个暗示,它已经在一定程度上适用于对象(就像它在一定程度上适用于数组一样)。
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
/**
* 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 } ?>