1

我最近开始研究一个预先存在的 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 层?或者,出于某种原因,我可能不应该尝试这样做。

对于问题的长度,我很抱歉,但我已经在互联网上挖掘了一个星期左右,但无济于事,我似乎发现的只是语法标准,而不是结构标准。

提前致谢。

4

2 回答 2

3

有几种模式可以遵循。我自己喜欢使用MVC 模式。MVC 是将用户界面交互拆分为三个不同的角色。虽然还有其他模式,但为了清楚起见(帖子的结束长度我只会进入 MVC)。只要您使用SOLID 原则,您希望遵循哪种模式并不重要。

我来自 C#.NET 背景,所以关注点分离的想法对我来说并不新鲜。

那太棒了。在这一点上,尝试学习 PHP 只是一个实现细节。

显然,这对于与我应该处理的应用程序一样大的应用程序来说并不是很好。

很高兴我们同意:-)


在 MVC 模式中,您将拥有:

模型:完成“所有工作”
View:负责演示的
控制器:处理请求

当请求一个页面时,它将由控制器处理。如果控制器需要完成一些工作(例如获取用户),它会要求模型执行此操作。当控制器拥有所有需要的信息时,它将呈现一个视图。该视图呈现所有信息。

您正在谈论的那个人对象将是 MVC 模式中的模型。

我已经注意到 PHP 的松散类型导致我做事的方式出现问题

PHP 松散类型非常好(如果您知道自己在做什么),但同时也很糟糕。请记住,您始终可以使用三个=符号进行严格的比较:

if (1 == true) // truthy
if (1 === true) // falsy

也没有方法重载是全新的

PHP 确实不支持方法重载,但它可以被模仿。考虑以下:

function doSomething($var1, $var2 = null)
{
    var_dump($var1, $var2);
}

doSomething('yay!', 'woo!'); // will dump yay! and woo!
doSomething('yay!'); // will dump yay! and null

另一种方法

function doSomething()
{
    $numargs = func_num_args();
    $arg_list = func_get_args();
    for ($i = 0; $i < $numargs; $i++) {
        echo "Argument $i is: " . $arg_list[$i] . "<br />\n";
    }
}

doSomething('now I can add any number of args', array('yay!', 'woo!', false));

或者,出于某种原因,我可能不应该尝试这样做。

当然,您应该尝试一下。当您已经有编程经验时,它应该不会太难。


如果您还有其他问题,您可以在明天的PHP 聊天中找到我空闲的时间(我现在真的需要睡觉 :-))。

于 2012-04-05T23:16:05.123 回答
0

这是做事的好方法吗?

没有理想的方法;确定的情况有好有坏。

关于打字,PHP 不会松懈;我们称之为动态类型。

关于架构,当我们开发企业级 Web 应用程序时,从大中型到大型,我们倾向于每天谈论性能。

一个好的起点是阅读一些最知名的 PHP 框架,例如:

  • 曾德
  • Symfony
  • 小花

从那你可以开始思考建筑。

于 2012-04-05T22:56:30.113 回答