繁体   English   中英

逻辑和标记,HTML和PHP

[英]Logic and markup, html and php

我正在学习php。 我看到人们建议将html和php或逻辑和标记分开。 但是在某些特定情况下,我不确定该怎么做。 为了提高可读性和可维护性,我尝试将所有php放在一个单独的文件中,但是现在我必须从数据库下载标题,而我看到的唯一方法是将其与其余的html以及html和php混合在一起。 在这种特定情况下,是否有更干净,更有条理的方式? 将这种和平的php文件放入“设计”文件中可以吗? 我可以还是应该把这个php代码与其余的php放在一起?

<?php
include("../../externs/includes/connexio.php");

$result = mysqli_query($con, "SELECT * FROM myTable");

while ($row = mysqli_fetch_array($result)) {
    $id = $row["id"];
    $title = $row["title"];
    $subtitle = $row["subtitle"];
?>  

<div class="title" id="<?php echo $id; ?>"><?php echo $title; ?> </div>
<div class="subtitle"><?php echo $subtitle;?> </div>
<br>

<?php 
}//end while items
?>

首先,我建议您阅读有关MVC(模型-视图-控制器)的信息,您可以从此Wikipedia文章开始: http : //en.wikipedia.org/wiki/Model%E2%80%93view%E2%80% 93controller

我认为对于一个简单的问题,您的解决方案是最好的。 其他任何事情都会增加不必要的复杂性。

话虽如此,我将尝试使用这种简单的情况,并提供一种可能的方法,将逻辑与表示分离开来,以期一些基本概念将从中变得清晰。

my_controller.php

include("../../externs/includes/connexio.php");

$result = mysqli_query($con, "SELECT * FROM myTable");

$myList = array();
while ($row = mysqli_fetch_array($result)) 
{
    $myList[] = $row;
}

// Now load the view.
include "my_view.php";

my_view.php

<?php foreach ($myList as $row ) : ?>

    <div class="title" id="<?php echo $row['id']; ?>"><?php echo $row['title']; ?></div>
    <div class="subtitle"><?php echo $row['subtitle'];?></div>
    <br>

<?php endforeach; ?>

如您所见,我只是获取了您的代码,并将其分离为业务逻辑和表示形式。 这里的想法是要呈现的数据应在视图外部生成。 视图应该对如何“生成”数据一无所知。

在此示例中,视图仅知道包含字段:id,title和subtitle的变量$ myList。 如果您曾经更改数据库或决定从文件或Web服务中获取数据,请执行以下操作: 您根本不需要触摸视图。

同时,控制器不在乎视图如何显示数据。 无论来源如何:数据库,Web服务,文件等; 它将始终产生至少包含View期望字段的数组。

MVC的下一步是将数据操作从控制器转移到模型。 我不会在那儿详细介绍,但这是控制器的外观:

include "my_model.php";
$myList = fetchData();
include "my_view.php;

fetchData()内部函数my_model.php文件将基本上做的是一样的my_controller.php以上。

一个非常有争议且确实存在争议的问题是,在View中包含任何PHP代码是否是一种好习惯。 有人认为应该使用其他模板语言,例如Smarty。 我的观点是,通过添加另一种语言来更改语法不会改变不可避免的事实,即您需要在View中添加一些逻辑,否则您将无法向应用程序引入动态性。

当您阅读PHP代码时更加自在时,您将能够研究周围的几个框架,并了解它们是如何做到的。 它们都有一个共同点,那就是它们在表示层都有一些逻辑,无论是PHP还是其他东西。

以下是将PHP与标记混合使用时可以遵循的最佳实践。

(不是最佳做法)

1)例如,如果您在顶部有一个逻辑,并且希望生成标记,那么您可以采取的一种不太好的方法是:

<?php
$query = mysql_query("SELECT id,name FROM table");

while($row = mysql_fetch_assoc($query)){
    $id   = $row['id'];
    $name = $row['name'];
?>

<div>ID:<?php echo $id;?></div>
<div>NAME:<?php echo $name;?></div>

<?php
}
?>

在上面的代码中,您必须跟踪结尾的花括号,如果您的应用程序很复杂,则可能会产生问题,尤其是在一个以上的迭代级别中。

2)好的方法是利用PHP标记,例如

<?php if(count($array)):?>

    <?php foreach($array as $result):?>

        <div><?php echo result;?></div>

    <?php endforeach;?>

<?php else:?>

    <div>NO results found</div>

<?php endif;?>

您的代码没有显示问题,但是如果它是复杂的应用程序,则需要遵循最佳实践。

<?php
$array = array();
$query = mysql_query("SELECT id,name FROM table");

while($row = mysql_fetch_assoc($query)):
    $array[] = $row;
endwhile;
?>

在PHP标记之外,检查$array的计数,如果有计数,则生成标记。

<?php if(count($array)):?>

    <?php foreach($array as $result):?>

        <div>ID<?php echo result['id'];?></div>
        <div>ID<?php echo result['name'];?></div>

    <?php endforeach;?>

<?php else:?>

    <div>NO results found</div>

<?php endif;?>

使用这种格式可以达到令人愉悦的效果。 尝试分离或避免将过多的PHP与标记混合使用。 如果您希望将表示逻辑与业务逻辑分开,那么我建议您使用MVC模型,因为它可以提高可读性和可维护性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM