2008-08-22 51 views
10

我想在开发PHP应用程序时使用include 文件vs对象(类)的优缺点参考。PHP包含vs OOP

我知道我会受益于有一个地方去解答这个问题......我有一些自己的看法,但我期待听到别人的意见。

一个简单的例子:

我的网站上的某些页面只能为登录的用户访问。我有实现两种选择(还有其他的,但让我们把它限制在这两个)

  1. 创建authenticate.php文件,并将其包含在每一页上。它拥有认证的逻辑。

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

编辑 我想看到某种方式重量超过另一种的好处。 我目前(和弱的原因)如下:

包括 - 有时函数更容易/更短/更快地致电 对象 - 功能和属性分组导致长期维护。

包括 - 写较少的代码(没有构造函数,没有类语法)打电话给我懒惰,但这是真的。

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

包括 - 更容易为新手处理 对象 - 较难为新手,但专业人员皱起了眉头。

我在项目开始时着眼于这些因素来决定是否要包含对象或对象。 这些都是我的头顶的一些利弊。

回答

13

这些并不是相反的选择。无论如何,你将不得不包含检查代码。我把你的问题看作程序性编程与OO编程。

编写几行代码或函数,并将其包含在页面头文件中,是在PHP3或PHP4中完成的。这很简单,它很有效(这就是我们如何在osCommerce中完成的,例如,一个电子商务PHP应用程序)。尽管许多开发人员可以确认,但这并不容易进行维护和修改。

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

1

我没有太多的PHP经验,尽管我在当前的工作中使用它。一般来说,我发现较大的系统可以从OO提供的可读性和可理解性中受益。但是,像一致性(不要混合面向对象和非面向对象)和你的个人喜好(尽管只在个人项目上)也很重要。

0

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

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

1

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

这不仅灵活,而且非常高效,并保持架构清洁。

0

无论你在课堂上或在多个程序的风格做到这一点,你只需要进行检查以确保:

  1. 有一个会话;
  2. 该会话有效;并且,
  3. 拥有该会话的用户具有适当的权限。

您可以将所有三个步骤封装到一个函数中(或者Session类中的静态方法可能会工作)。试试这个:

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. 
} 
5

虽然这个问题涉及到一些非常有争议的问题(OOP,用户身份验证),我会跳过那些和第二次康拉德关于__autoload的评论。任何知道C/C++的人都知道包括文件在内可能会产生多少痛苦。如果您选择使用OOP(我几乎完全使用OOP),那么只需使用一些标准文件命名约定和(我会推荐)为每个文件限制一个类,而PHP将为您完成剩下的工作。清理代码,您不必担心记住删除不再需要的包含(包含的许多问题之一)。