我最近开始研究一个预先存在的 PHP 应用程序,当谈到我应该如何提高这个应用程序的可伸缩性时,我遇到了一些麻烦。我来自 C#.NET 背景,所以关注点分离的想法对我来说并不新鲜。
首先,我想告诉你我到底在寻找什么。目前,这个应用程序的规模相当不错,由大约 70 个数据库表和约 200 个页面组成。在大多数情况下,这些页面只是简单地对数据库执行 CRUD 操作,很少有真正的程序密集型操作。目前几乎所有的页面都在使用类似这样的代码:
$x = db->query("SELECT ID, name FROM table ORDER BY name");
if ($x->num_rows > 0) {
while ($y = $x->fetch_object()) {
foreach ($y as $key => $value)
$$key = $value;
显然,这对于与我应该处理的应用程序一样大的应用程序来说并不是很好。现在,我来自 C#.NET 背景,习惯于构建小型应用程序,并且通常为我的应用程序中的每个对象构建一个小型业务对象(与我的数据库表几乎一对一匹配)。它们遵循以下形式:
namespace Application
{
public class Person
{
private int _id = -1;
private string _name = "";
private bool _new = false;
public int ID
{
get{ return _id; }
}
public string Name
{
get { return _name; }
set { _name = value; }
}
public Person(int id)
{
DataSet ds = SqlConn.doQuery("SELECT * FROM PERSON WHERE ID = " + id + ";");
if (ds.Tables[0].Rows.Count > 0)
{
DataRow row = ds.Tables[0].Rows[0];
_id = id;
_name = row["Name"].ToString();
}
else
throw new ArgumentOutOfRangeException("Invalid PERSON ID passed, passed ID was " + id);
}
public Person()
{
_new = true;
}
public void save()
{
if (_new)
{
doQuery(" INSERT INTO PERSON " +
" ([Name]) " +
" VALUES " +
" ('" + Name.Replace("'", "''") + "'); ");
}
else
{
SqlConn.doNonQuery(" UPDATE PERSON " +
" SET " +
" [Name] = '" + _name.Replace("'", "''") + "' WHERE " +
" ID = " + _id);
}
}
简而言之,它们只是具有模仿表的属性、属性、提取信息的构造函数以及save
将提交对对象所做的任何更改的调用方法。
关于我的实际问题:首先,这是一种很好的做事方式吗?它一直对我很有效。其次,更重要的是,这也是在 PHP 中做事的好方法吗?我已经注意到 PHP 的松散类型导致我做事的方式出现问题,而且没有方法重载是全新的。如果这不是一个好的做法,是否有任何好的例子说明我应该如何将该项目调整为 3 层?或者,出于某种原因,我可能不应该尝试这样做。
对于问题的长度,我很抱歉,但我已经在互联网上挖掘了一个星期左右,但无济于事,我似乎发现的只是语法标准,而不是结构标准。
提前致谢。