Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP应用程序中分离用户界面和数据库开发_Php_Html_Mysql_User Interface_Model View Controller - Fatal编程技术网

在PHP应用程序中分离用户界面和数据库开发

在PHP应用程序中分离用户界面和数据库开发,php,html,mysql,user-interface,model-view-controller,Php,Html,Mysql,User Interface,Model View Controller,fetchdata.php-发送所需数据 function FetchItems() { while($Items = mysql_fetch_object("SELECT * FROM items")) //function is deprecated, would be changing it { $TotalItems[] = $Items; } return $TotalItems; } listitems.php-用于用户界面并向

fetchdata.php-发送所需数据

function FetchItems()
{
    while($Items = mysql_fetch_object("SELECT * FROM items")) //function is deprecated, would be changing it
    {
        $TotalItems[] = $Items;
    }   
    return $TotalItems;
}
listitems.php-用于用户界面并向用户显示项目列表

require_once('fetchdata.php');
$Items = FetchItems();
echo '<table>';
foreach($Items as $ItemDetails)
{
    echo '<tr>';
    echo '<td>';
    echo $ItemDetails->ItemName;  // right now the UI developer requires the actual column names to display data but I don't want this
    echo '</td>';
    echo '<td>';
    echo $ItemDetails->ItemQty;
    echo '</td>';
    echo '<td>';
    echo $ItemDetails->ItemCost;
    echo '</td>';
    echo '</tr>';
}

echo '</table>';
require_once('fetchdata.php');
$Items=FetchItems();
回声';
foreach($Items作为$ItemDetails)
{
回声';
回声';
echo$ItemDetails->ItemName;//现在UI开发人员需要实际的列名来显示数据,但我不希望这样
回声';
回声';
echo$ItemDetails->ItemQty;
回声';
回声';
echo$ItemDetails->ItemCost;
回声';
回声';
}
回声';
我需要将mysql开发和用户界面开发分开,以便在不同的人之间分配工作负载。UI开发人员不需要实际的列名/表名/数据库名来向用户显示数据。 但这些将只由后端开发人员需要

从开发人员的角度来看,如果我想将表的列名(如,ItemQty更改为ItemAvailableQty),那么我必须要求UI开发人员编辑UIe文件,即listitems.php,但我想,仅应编辑后端文件fetchdata.php,并且不应针对此类数据库更改触摸UI文件。无论数据库中的更改是什么,这些更改都应该独立于UI文件,UI文件不应该知道/需要这些后端更改,即UI文件的更改是不可见的。只有当且仅当存在一些UI更改时,才会编辑UI文件


我应该采取什么步骤来实现这一目标?如何实现?我是否需要创建视图/存储过程等。?或者我必须使用MVC框架,如果是,那么如何使用?

您不需要使用MVC框架,但这比重新发明轮子要好。在MVC的全局概念中,您有一个视图对象,其中包含运行UI所需的变量。这取决于你实施它的方式。在视图对象的大多数情况下,您需要一个神奇的
set
方法,该方法将值分配给不存在的变量

class View {

    public function __set($name, $value) {
        $this->$name = $value
    }

    public function __get($name) {
        return $this->$name;
    }
}
以最简单的方式,如果尝试将值设置为视图对象的不存在属性,它将动态创建该属性

然后,在后端交互中,有一个全局类保存视图对象,我们不要称它为应用程序,而是控制器

class Controller {

    protected $view;

    public function __construct() {
        $this->view = new View();
    }
}
没有魔法,只是一个通过所有后端交互来保存视图对象的共享属性

现在,类中有了
FetchItems()
方法,我们将其称为
Items

因此,您可以创建一个使用数据库操作的控制器(在MVC中,它将是一个模型),并将返回值分配给视图的神奇属性

class ItemsController extends Controller {

    public function ItemsList() {
        $items = new Items();
        foreach ($items->FetchItems() as $item) {
            $this->view->ItemName[] = $item->ItemName;
            $this->view->ItemQty[] = $item->ItemQty;
            $this->view->ItemCost[] = $item->ItemCost[];
       }
 }
在这里,我们从Items模型的返回数据在View对象中创建了3个数组变量。这不是最好的方法,因为UI开发人员应该使用一些后端函数与它们交互,所以您可能希望创建一个大数组来容纳它们,比如
$this->view->Items['name']=$item->ItemName
$this->view->Items['Qty']=$item->ItemQty
,因此,您将只向视图发送变量
Items

现在,如果您更改了一个列名,您只需要在您的业务逻辑中进行更改,在这里您将使
$this->view->Items['qty']=$item->itemavaailableqty但在UI部分中,
$this->Items['qty']
将保留

当然,这并没有说明如何实现整个MVC,它只是说明了您可以遵循的逻辑。当然,您可以使用现有的MVC框架,或者只是将应用程序更改为具有共享变量,这样您的UI部件将从对象接收信息,该对象可以使用动态创建的属性。因此,一旦将值指定给内部属性,您只需要更改指定,而不需要更改模板中使用的不动产

例如,在严格的OOP或框架之外,您可以将值分配给包含
FetchItems()
方法的类的内部属性,以便UI开发人员使用它们,而不是原始返回的数据库数据


但是,到最后,这是否会花费您更多的时间,而且是否值得,您将进行数百万次的分配以查看变量,只是为了不让您的UI开发人员关心列。数据库表在被利用时不应更改其列。更重要的是,如果您已经有了这个表的后端。

您可以使用像或这样的模板引擎。它们确保了应用程序的设计和逻辑之间的清晰分离。关于如何实现这一点的示例,我建议您看看Smarty的速成课程:


甚至可以将这样的模板引擎与MVC框架结合起来。

首先,不再维护
mysql.*
函数,不应在任何新的代码库中使用。它正逐渐被淘汰,取而代之的是更新的API。因此,根据您的说法,我将为项目创建一个类,然后在处理项目时在任何地方使用该类及其方法。然后,我只需更改类文件中的列名,而不必更改UI文件中的列名。但是这种方法在UI文件中使用类名……有没有办法避免在UI文件中使用类名……像Items-class,那么在UI文件中我会做-$item=newitems()$item->FetchItems();还有,你说我不需要MVC,为什么?但是我想你已经给出了这个方法,你可以有一个外部文件来实例化这个类,所以UI文件只需要它。MVC不是必需的,但它是一个很好的解决方案,这就是为什么我给出了这种方法:)好的,所以在fetchdata.php中我将这样做:在listitems.php中,类Items{………}:$item=newitems()$item->FetchItems(),怎样