【问题标题】:PHP: If many objects use instance of the same object - what is an efficient way to pass it?PHP:如果许多对象使用同一个对象的实例 - 传递它的有效方法是什么?
【发布时间】:2010-12-04 17:11:52
【问题描述】:

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

这是现在如何完成的示例:

类应用{ 私人$用户; 私人$控制器; 公共函数 __construct() { $this->user = new User(); $this->controller = new Controller(); $this->controller->setUser(& $this->user); } }

这是正确的做法吗?

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

【问题讨论】:

  • PHP5默认通过引用传递对象,所以不需要显式地这样做
  • 查看单例模式。也许它更适合这里。
  • @Paul,这并不完全正确。它按值传递句柄。但是您的建议仍然正确...在函数调用中删除&
  • 查看我的编辑:将 User 实例设为全局变量会更好吗?
  • @SODA,用户在脚本执行期间是否总是代表相同的数据? (例如,发出请求的用户。)

标签: php object pass-by-reference


【解决方案1】:

只是为了在 cmets 中提出我对答案的建议

你可以实现单例模式

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

【讨论】:

    【解决方案2】:

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

    听起来单例会有帮助:

    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 对象传递给任何需要它的人。 (当然,您仍然可以使用单例来表示经过身份验证的用户。)

    【讨论】:

    • 如果我需要为其他用户获取实例怎么办?万一访问者(实例化为用户)需要执行涉及其他用户数据的操作?
    • 您可以将参数传递给instance() 并缓存数据。
    • 嗯,我想问题是我是否可以使用同一个类作为单例并通过 __construct 为其他用户实例化?
    • 实际上,没关系,为用户创建另一个类不会有什么坏处,它会更小,因为它不会处理会话等,只处理用户数据
    • 正确,您应该为两者使用不同的类。 AuthenticatedUser 可能是 User 类的子类,或者甚至只是使用 has-a 关系在其自身中包含 User 类的实例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    相关资源
    最近更新 更多