完全分离的PHP应用程序的标准

时间:2012-04-05 22:46:18

标签: php standards

我最近开始研究预先存在的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背景,用于构建小规模应用程序,并且通常为我的应用程序中的每个对象构建一个小的Business Object(几乎与我的数据库表匹配1对1)。他们遵循以下形式:

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层?或者,我可能不应该出于某种原因尝试这样做。

我很抱歉这个问题很长,但是我已经在网上挖了一个星期左右无济于事,我似乎总能找到语法标准,而不是结构标准。

提前致谢。

2 个答案:

答案 0 :(得分:3)

可以遵循几种模式。我喜欢自己使用MVC pattern。 MVC约为splitting user interface interaction into three distinct roles。虽然有其他模式,但为了清楚起见(帖子的结束长度我只会进入MVC)。只要您使用SOLID principles

,您希望遵循哪种模式并不重要
  

我来自C#.NET背景,因此分离关注点的想法对我来说并不陌生。

那很好。尝试学习PHP只是一个实现细节。

  

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

很高兴我们同意: - )


在MVC模式中,您将拥有:

M odel:“完成所有工作” V iew:负责演示文稿
C ontroller:处理请求

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

您正在谈论的那个人对象将是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

另一种方式是to do

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 chat找到我的空闲时间(我现在真的需要睡一觉:-))。

答案 1 :(得分:0)

  

这是一种很好的做事方式吗?

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

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

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

一个好的开始就是阅读一些最着名的PHP框架,例如:

  • 的Zend
  • Symfony的
  • Kohana的

由此你可以开始考虑建筑。