PHP 属性(也称为成员变量)的访问控制主要遵循以下规则:
-
公共属性(Public):
- 公共属性可以在任何地方被访问,包括类的内部、子类和类的外部(通过对象实例)。
- 公共属性的值对所有实例共享。
-
受保护属性(Protected):
- 受保护属性只能在类的内部以及继承该类的子类中被访问。
- 受保护属性的值仅对类及其子类可见,不会对外部暴露。
-
私有属性(Private):
- 私有属性仅在类的内部可见,即使是继承该类的子类也无法访问。
- 私有属性的值对所有外部实体都是隐藏的,只能通过公共或受保护的 getter 和 setter 方法进行访问和修改。
-
默认访问控制(None):
- 如果不显式指定访问控制修饰符(public, protected, 或 private),则属性默认为“受保护”(protected)。
- 这意味着属性可以在类的内部被访问,但不能在类的外部通过对象实例直接访问。
-
构造函数中的属性初始化:
- 构造函数允许在创建对象时初始化属性。
- 可以在构造函数中使用公共、受保护或私有属性,具体取决于设计需求。
-
属性访问器(Getter)和修改器(Setter):
- 可以为属性定义访问器(getter)方法来读取属性值。
- 可以定义修改器(setter)方法来设置属性值。
- 访问器和修改器方法可以是公共、受保护或私有的,以控制属性的访问级别。
-
属性类型声明:
- PHP 允许在类定义时为属性指定类型声明(如 int, string, bool 等)。
- 类型声明会强制要求赋给属性的值符合指定的类型,否则会引发错误。
-
属性默认值:
- 可以在类定义时为属性指定默认值。
- 如果未显式设置属性值,则将使用默认值。
-
属性不可变性:
- 可以通过将属性声明为私有来使属性不可变,这样就无法在类的外部修改其值。
- 对于公共属性,可以通过定义 getter 方法来控制其值的读取,并在 getter 方法内部决定是否允许修改。
-
属性继承:
- 在 PHP 中,属性不是被子类继承的,但子类可以通过 super 关键字访问父类的受保护属性。
请注意,PHP 中的访问控制规则主要适用于公共、受保护和私有属性。默认访问控制(none)实际上等同于受保护属性,但在实际编程中并不常用。此外,PHP 7 引入了标量表达式类型声明,允许在类定义时为属性指定标量类型(如 int, float, string, bool, array, callable, iterable, object)。