字段的访问控制

服务器君一共花费了32.572 ms进行了6次数据库查询,努力地为您提供了提供了这个页面。

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。而在PHP6之前,这样做会产生一个警告。不过,如果你创建的软件可能在完全不同的服务器安装环境中使用,为保证兼容性一定要使用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。

了解更多:PHP 面向对象:访问控制

Creative Commons License

本文仅供自己学习与收藏之用,请勿转载,请勿用作其它用途(如商业目的等)。 原文链接:http://www.nowamagic.net/librarys/posts/php/10