代码之家  ›  专栏  ›  技术社区  ›  Sev

PHP面向对象的Web应用程序

  •  4
  • Sev  · 技术社区  · 16 年前

    我有一个称为“布局”的类用于页面布局,另一个称为“用户”的类用于用户。

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

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

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

    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']);
    }
    

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

    5 回复  |  直到 13 年前
        1
  •  0
  •   selfawaresoup    16 年前

    由于每个请求只有一个用户,因此对于程序的每次运行,将“用户”设置为单例类,如下所述:

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

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

    免责声明: 是的,我知道歌手经常被用在错误的地方是为了错误的目的,有些人倾向于把这个问题归咎于模式,而不是那些把它误用为一些臭代码的人。 不过,这是Singelton模式的一个非常好的用例。

        2
  •  1
  •   Bhaskar Pramanik    13 年前

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

    松散耦合的程序——由于依赖关系是由第三类注入的,因此不需要在程序逻辑中硬编码依赖关系。

    可维护代码——这是OOP范式中最吸引人的特性。这在涉及大规模项目时尤其如此。

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

        3
  •  0
  •   Daniel    16 年前

    “全球化”通过将它放入会话变量或cookie来实现全球化,这是一个非常坏的习惯,它会导致紧密耦合的库依赖于在类外设置的任意变量。一般来说,会话变量也可以因为其他原因而远离它们。

    将变量作为参数传递给任何类都是最好的方法。布局类中有呈现(输出)它的方法吗?您可能需要向该方法添加$data参数,该参数接受可在布局中使用的关联数据数组。

        4
  •  0
  •   sunwukung    16 年前

    我个人会使用一个注册类(singleton)并在那里注册用户,以便布局访问。这样,您只需要将注册表的一个实例传递到布局。 用户类不是布局构造的组成部分,因为它只与布局有关,所以我不会在构造函数中传递它。

    另一种方法是使用控制器协调视图和模型之间的交互。每当创建新的控制器时,缓冲它的输出。然后,在渲染时,取消缓冲内容,并将其分配给视图的属性(或属性数组),然后可以对其进行渲染。您可能不需要将实际的模型类传递给视图/布局——只需要它的输出。

        5
  •  0
  •   Galen    16 年前

    使用注册表模式。没必要让它成为单身汉,每个人都在胡说八道。

    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 (包含您放入其中的所有变量)通过数据数组。