关于编码风格:PHP包括vs OOP

关于编码风格:PHP包括vs OOP

PHP includes vs OOP

我想为开发PHP应用程序时使用include文件vs对象(类)的优缺点提供参考。

我知道我可以从一个地方获得这个答案中受益……我对自己有一些意见,但我希望听到其他人的意见。

一个简单的例子:

我网站上的某些页面仅供登录用户访问。我有两种实现方式(还有其他选择,但我们只限于这两种)

  • 创建一个authenticate.php文件,并将其包含在每个页面上。它具有验证逻辑。

  • 创建一个具有身份验证功能的用户对象,并在每个页面上引用该对象以进行身份??验证。

  • 编辑
    我想以某种方式权衡一个人的利益。
    我目前的原因(以及较弱的原因)如下:

    包含-有时函数调用起来更容易/更短/更快
    对象-功能和属性的分组有助于进行长期维护。

    包括-更少的代码编写(没有构造函数,没有类语法)使我懒惰,但这是事实。

    对象-强制形式化以及功能和创建的单一方法。

    包含-新手更容易处理
    对象-对于新手来说比较难,但是被专业人士所反对。

    我在项目开始时会考虑这些因素,以决定是否要执行包含或对象。
    那些优点和缺点在我脑海中荡漾。


    这些并不是真正相反的选择。无论如何,您都将必须包含检查代码。我将您的问题读为过程编程与OO编程。

    编写几行代码或一个函数,并将其包括在页面标题中,这就是在PHP3或PHP4中的工作方式。它很简单,可以正常工作(这就是我们在osCommerce中进行此操作的方式,例如,一个eCommerce PHP应用程序)。

    但是,正如许多开发人员可以确认的那样,维护和修改并不容易。

    在PHP5中,您将编写一个用户对象,该对象将携带自己的数据和身份验证方法。您的代码将更加清晰和易于维护,因为与用户和身份验证有关的一切都将集中在一个地方。


    虽然该问题涉及几个非常有争议的问题(OOP,用户身份验证),但我将跳过这些以及第二个Konrad关于__autoload的评论。任何了解C / C ++的人都知道包括文件在内可能会造成的痛苦。使用autoload(PHP5的附加功能),如果您选择使用OOP(我几乎专门这样做),则只需要使用一些标准的文件命名约定,并且(我建议)限制每个文件的单个类,PHP会为您完成其余工作。清理代码,您不必再担心要记住删除不再需要的包含(包含问题的许多问题之一)。


    除了在我使用的核心库以及应用程序中这些库的一个中央include(+ config)之外,我从未学习过在PHP中从未使用过include。其他所有内容均由全局__autoload处理程序处理,该处理程序可以配置为识别所需的不同类。使用适当的类命名约定,可以轻松完成此操作。

    这不仅灵活,而且效率很高,并且保持体系结构整洁。


    我没有太多的PHP经验,尽管我在目前的工作中正在使用它。通常,我发现大型系统受益于OO提供的可读性和可理解性。但是,诸如一致性(不要将OO和非OO混合在一起)和您的个人偏好(尽管仅在个人项目中确实如此)之类的东西也很重要。


    无论是在课堂上还是以更程序性的方式进行操作,您只需要检查以确保:

  • 有一个会议;
  • 会话有效;和,
  • 拥有会话的用户具有适当的特权。
  • 您可以将所有三个步骤封装到一个函数中(否则Session类中的静态方法可能会起作用)。尝试这个:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    class Session
    {
      const GUEST = 0;
      const SUBSCRIBER = 1;
      const ADMINISTRATOR = 2;

      public static function Type()
      {
        session_start();

        // Depending on how you use sessions on
        // your site, you might just check for the
        // existence of PHPSESSID. If you track
        // every visitor with sessions, however, you
        // might want to assign some separate unique
        // number (that you can track in a DB) to
        // authenticated sessions
        if(!$_SESSION['uniqid'])
        {
          return Session::GUEST;
        }
        else
        {
          // For the best security, don't store the
          // user's access permissions in the $_SESSION,
          // but rather check against the DB. This will
          // ensure that recently deleted or downgraded
          // administrators will not be able to make use
          // of a previous session.

          return THE_ACCESS_LEVEL_ACCORDING_TO_THE_DB
        }
      }
    }


    // In your files that need to check for authentication (you
    // could also do this in a controller if you're going MVC

    if(!(Session::Type() == Session::ADMINISTRATOR))
    {
      // Redirect them to wherever you want them to go instead,
      // like a log in page or something like that.
    }

    您能更具体一点吗?对于您给出的示例,您需要两种方式都使用include。
    在情况1中,您仅包含一个文件,在情况2中,您需要包含类文件(例如user.class.php)以允许实例化User类。

    这取决于应用程序其余部分的构建方式,是OO吗?使用OO。


    推荐阅读