PHP面向对象的Web应用程序

时间:2010-05-26 03:10:57

标签: php oop

我有一个名为“Layout”的类用于页面布局,另一个类叫做“User”用户。

我创建的每个页面都会实例化一个新的布局。

当用户登录时,会有一个新用户实例化。

如何获取布局类的实例以了解实例化的用户?我还可以在会话变量中保存用户的整个实例。我认为这是个坏主意。这方面的最佳做法是什么?

class User
{
  var $userid;
  var $email;
  var $username;

  function User($user)
  {
     $this->userid = $this->getUid($user);
     $this->email = $this->getEmail($user);
     $this->username = $user;
  }
  function getUid($u)
  {
     ...
  }

  function getEmail($u)
  {
     ...
  }
}

class Layout
{

    var $var1;
    var $var2;
    var $var3;

    function Layout()
    {
        //defaults...
    } 


    function function1()
    {
        echo "something";
    }


   function function2()
   {
        echo "some other stuff";
   }

   function function3()
   {
      echo "something else";
   }

}

所以在index.php中,例如,我将执行以下操作:

include "user.php"
include "layout.php"

$homelayout = new Layout();
$homelayout->function1();
$homelayout->function2();
$homelayout->function3();

现在让我们说在login.php中有人登录:

include "layout.php"
include "user.php"

if(userAuthSuccess)
{
    $currentUser = new User($_POST['username']);
}

只要用户没有注销,从这里开始访问$ currentUser及其成员变量(如$ currentUser-> email等)的最佳方法是什么? / p>

5 个答案:

答案 0 :(得分:1)

我认为上述解决方案的最佳补救方法是使用一个名为Dependency Injection的概念,您可以编写一个额外的类,它将依赖项(在本例中为An Object)注入请求类。大多数现代开发人员将坚持使用这种将依赖关系注入其应用程序的技术,因为这将实现:

松散耦合的程序 - 由于依赖项是由第三个类注入的,因此不需要在程序逻辑中对依赖项进行硬编码。

可维护代码 - 这是OOP范例中最具吸引力的功能。在提到大规模计划时尤其如此。

内存管理 - 作为开发人员,您可以根据规范要求自由管理内存。

答案 1 :(得分:0)

通过将其置于会话变量或cookie中来“全局化”某些东西,其唯一目的是全球化它是一个非常糟糕的习惯,它导致紧密耦合的库依赖于在类外设置的任意变量。一般来说,会话​​变量也可以远离其他原因。

将变量放入任何类的最佳方法是将其作为参数传递。你在Layout类中有一个渲染(输出)它的方法吗?您可能希望向该方法添加$ data参数,该参数采用布局中可用的关联数据数组。

答案 2 :(得分:0)

由于每个请求只有一个用户,因此对于你的程序的每次运行,这将使“User”成为Singleton类,如下所述:

http://php.net/manual/en/language.oop5.patterns.php

这将为其他类提供一种方式来引用当前用户而不会访问错误的实例,因为只有一个。

声明: 是的,我知道Singeltons经常在错误的地方用于错误的目的,有些人倾向于将这个问题归咎于模式而不是那些滥用它的人为某些臭代码。 然而,这对于Singelton模式来说是一个非常好的用例。

答案 3 :(得分:0)

我个人使用注册表类(Singleton)并在那里注册用户以进行布局访问。这样,您只需要将注册表的实例传递给布局。 User类不是Layout构造的组成部分 - 因为它只应该关注Layout,所以我不会在构造函数中传递它。

另一种方法是使用Controller来协调视图和模型之间的这些交互。每当创建一个新的Controller时,缓冲它的输出。然后,在渲染时,取消缓冲内容并将它们分配给视图的属性(或属性数组),然后可以渲染它们。您可能不需要将实际的Model类传递给View / Layout - 只是它的输出。

答案 4 :(得分:0)

使用注册表模式。没有必要让它成为一个单身人士,每个人都在抛弃这个词。

include "layout.php"
include "user.php"

if(userAuthSuccess)
{
    $data['currentUser'] = new User($_POST['username']);
}

$data['nav'] = new nav('home'); 

$homelayout = new Layout( $data );

现在$homelayout可以通过数据阵列访问$data(其中包含您放入的所有变量)。