PHP支持5种字段作用域:public
、private
、protected
、final
和 static
。
本节介绍前4种作用域,静态作用域将在以后介绍。
总的来说,对属性或方法的访问控制,是通过在前面添加关键字 public、protected 或 private 来实现的。
由 public 所定义的类成员可以在任何地方被访问;
由 protected 所定义的类成员则可以被其所在类的子类和父类访问(当然,该成员所在的类也可以访问);
而由 private 定义的类成员则只能被其所在类访问。
public
可以通过在字段前面使用关键字public来声明公共作用域中的字段。示例如下:
class Employee
{
public $name ;
// Other field and method declalations follow…
}
公共字段可以由相应的对象直接操作和访问,例如:
$employee = new Employee();
$employee->name="Gonn NowaMagic";
$name = $employee->name;
echo "New employee: $name";
执行这段代码将得到:
New employee: Gonn NowaMagic
虽然用这种方法来操作类字段看上去很合理,但在OOP中并不鼓励使用公共字段,这是有道理的。之所以要避免这种实现,是因为直接访问使得类无法很容易地完成某种数据验证。例如,无法阻止用户像下面这样为name赋值:
$employee->name="123456";
这肯定不是你所期望的。为了防止发生这样的事情,有两种解决办法。一种办法是将数据封装在对象中,只通过一些称为公共方法(public method)的接口来访问。这种封装的数据称为具有私有作用域。第二种推荐的解决办法是使用属性(property),实际上它与第一种办法很相似,但在大多数情况下更方便使用。下面将介绍私有作用域。
PS:PHP6 中可以用var取代public。而在 PHP 6之前,这样做会产生一个警告。不过,如果你创建的软件可能在完全不同的服务器安装环境中使用,为保证兼容性一定要使用var。
private
private字段只能在定义字段的类中访问。示例如下:
class Employee
{
private $name;
private $telephone;
}
指定为私有的字段不能由实例化的对象直接访问,也不能由其子类使用。
如果要在子类中使用这些字段,可以考虑使用下面介绍的保护作用域。私有字段必须通过公共接口来访问,这符合OOP主要原则之一:封装。
考虑以下示例,这里通过一个公共方法操作一个私有字段:
class Employee
{
private $name;
public function setName($name){
$this->name=$name;
}
}
$staff=new Employee();
$staff->setName("Gonn");
将字段的操作封装在一个方法中,这就使得开发人员能够严密地控制如何设置字段。例如,可以向setName()方法增加一些功能,验证设置的姓名中只包括字母字符,并确保不为空。这种策略比让终端用户自由地提供信息可靠得多。
protected
与函数通常需要只在函数内部使用的变量一样,类也可以包含只在内部使用的字段。这些字段称为保护字段,protected要放在相应字段的前面。示例如下:
class Employee
{
protected $wage;
}
在继承的子类中也可以访问和操作保护字段,这是私有字段所没有的特性。子类对象试图访问父类的私有字段时,将导致致命错误。因此,如果希望扩展类,就应当使用保护字段而不是私有字段。
final
在为字段设置final作用域时,将阻止在子类中覆盖这个字段。final 字段如下声明:
class Employee
{
final $ssn;
}
还可以将方法声明为final。
猜你喜欢: