有两个类扩展另一个类,如何避免共享属性

时间:2011-11-25 07:10:16

标签: php oop visibility

我有以下课程。

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

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

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

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

如何避免AuthFactory :: $ _实例中的对象与UserFactory :: $ _ instance是同一个对象?

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

1 个答案:

答案 0 :(得分:1)

我的经验如下:

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

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

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

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

您是否正在使用self :: $ _ instance或static :: $ _ instance来访问相关属性?如果是前者,那么尝试改为后者。

我怀疑,但是根据它的用途,将属性设置为非静态可能更好。