【问题标题】:With two classes extending another, how to avoid sharing an attribute两个类扩展另一个类,如何避免共享一个属性
【发布时间】:2012-01-06 03:19:58
【问题描述】:

我有以下课程。

问题是 $_instance 在 AuthFactory 和 UserFactory 之间共享。

class Factory {
    protected static $_instance;
    /*...*/
}

class AuthFactory extends Factory {
    protected static $_instance;
    /*...*/
}

class UserFactory extends Factory {
    protected static $_instance;
    /*...*/
}

如何避免 AuthFactory::$_instance 中的对象与 UserFactory::$_instance 中的对象相同?

这样做的全部原因是我可以在 Factory 中设置结构,并为我想要使用的每个实际工厂扩展 if。

【问题讨论】:

  • 想一想,您是否尝试将变量设置为私有?
  • 是的,我曾尝试使用私人,但同样的问题。

标签: php oop visibility


【解决方案1】:

我的经验如下:

如果您声明一个静态属性,那么它的值将在定义它的类和所有子类之间共享。

例外情况是,如果您在子类中重新声明相同的属性。在这种情况下,每个子类都有自己的价值。这意味着您需要记住重新声明该属性。

但是,由于后期静态绑定相关的问题,如果您使用 self::$variable 访问属性,则该值将从超类中获取(如果在超类中定义了访问方法。我是不确定如果在子类中定义了访问方法会发生什么)。

如果您改用 static::$variable,那么这应该不是问题,但我没有在所有条件下都进行过广泛的测试。

您是使用 self::$_instance 还是 static::$_instance 来访问相关属性?如果是前者,请尝试更改为后者。

我怀疑,但是最好使属性为非静态的,这取决于它的用途。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-04-07
  • 2020-10-05
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 2013-06-18
  • 1970-01-01
相关资源
最近更新 更多