PHP:如果许多对象使用同一个对象的实例 - 传递它的有效方法是什么?

时间:2010-12-04 17:11:52

标签: php object pass-by-reference

例如,我的应用程序正在使用User对象的实例,而其他不同的对象必须访问某些属性和方法。并且这些对象实例化其他对象,而这些对象又必须访问User。管理这个的最佳方法是什么?当我实例化这些新对象时,将User对象作为参考传递?

以下是如何完成此操作的示例:

class App {
  private $user;
  private $controller;

  public function __construct() {
    $this->user = new User();
    $this->controller = new Controller();
    $this->controller->setUser(& $this->user);
  }  
}

这是正确的方法吗?

编辑:有没有办法让User实例成为全局变量?

2 个答案:

答案 0 :(得分:2)

只是在评论中提出我的建议

您可以实施单例模式

class User {
    protected static $instance = null;
    protected function __construct () { /* disable external instanciation */ }
    private function __clone () { /* disable clone */ }
    public static function getInstance () {
        if (is_null(self::$instance)) {
            self::$instance = new self();
        }
        return self::$instance;
    }
}

以下是阅读内容:)

http://en.wikipedia.org/wiki/Singleton_pattern

答案 1 :(得分:1)

  

有没有办法让User实例成为全局var?

听起来像单身人士会有所帮助:

class User
{
  private static $instance;

  private function __construct() { } 

  public function instance()
  {
    return self::$instance ? self::$instance : (self::$instance = new self());
  }
}

$user = User::instance();

基本上只需要用户的任何内容,只需拨打User::instance()而不是new User()。它们都将在对象的同一个实例上运行,因此这仅适用于User对象在整个脚本持续时间内表示相同的数据。

更新

您的评论“否,一个用户可以对其他用户执行操作”,则此模式不适用于每种用途。

听起来你只需将$user对象传递给任何需要它的人。 (当然,您仍然可以使用单例来表示经过身份验证的用户。)