属性的设置和获取

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

OOP提供了很多强大的特性,属性就是一个很有说服力的例子,通过强制在方法中访问和操作字段,一方面能保护字段,同时还允许像访问公共字段一样访问数据。这些方法称为访问方法和修改方法,或非正式地称为获取方法和设置方法,它们将会分别在访问或操作字段时自动触发。

遗憾的是,PHP5没有提供其他OOP语言(如C++和Java)中使用的属性功能。因此,需要使用公共方法来模拟这种功能。例如,可能需要声明两个函数getName()和setName(),为属性name分别创建获取方法和设置方法,并需要在每个函数中嵌入适当的语句。本节的最后将给出这种策略的一个例子。

PHP5确实提供了对属性的某种支持,并有几种新的可能性。这是通过重载__set和__get方法来实现的。当试图引用一个类定义中不存在的成员变量时,就会调用这些方法。属性有很多用途,如产生错误消息,甚至通过动态创建新的变量来扩展类。本节将介绍__get 和__set 。

设置属性

修改方法(mutator),或称为设置方法(setter),负责隐藏字段的赋值实现,并在为类字段赋值之前验证类数据。其形式为:

boolean __set([string property name],[mixed value_to_assign]) 

它接受一个属性名和相应的值作为输入,如果方法成功执行就返回TRUE,否则返回FALSE。示例如下:

class Employee
{
	var $name;
	function __set($propName,$propValue)
 	{
  		echo "Nonexistent variable:\$$propName!";
 	}
}
$employee=new Employee();
$employee->name="Gonn";
$employee->title="Executive Chef";

执行这段代码,可以输出:

Nonexistent variable:$title!

当然,可以使用这个方法来扩展类,使之增加新的属性,如下:

class Employee
{
	var $name;
	function __set($propName,$propValue)
 	{
  		$this->$propName=$propValue;
 	}
}
$employee=new Employee();
$employee->name="Mario";
$employee->title="Executive Chef";
echo "Name: ".$employee->name;
echo "<br />";
echo "Title: ".$employee->title;

这将得到:

Name: Mario
Title: Executive Chef

获取属性

访问方法或获取方法负责封装获得类变量所需的代码。其形式为:

boolean __get([string property name])

它接受一个属性名作为输入参数,即要获取该属性的值。它在成功执行时返回true,否则返回false。实例如下:

class Employee
{
	var $name;
	var $city;
 	protected $wage;
 	function __get($propName)
 	{
  		echo "__get called<br />";
  		$vars=array("name","city");
  		if(in_array($propName,$vars))
  		{
   			return $this->$propName;
  		}
		else
		{
   			return "No such variable!";
  		}
 	}
}
$exployee=new Employee();
$exployee->name="Mario";
echo $exployee->name."<br />";
echo $exployee->age;

执行结果如下:

Mario
__get called
No such variable!

创建自定义获取方法和设置方法

坦白的讲,虽然前面所述的__set()和__get()方法有一些优点,但对于管理复杂面向对象应用程序中的属性而言,他们确实还不够,因为PHP不支持采用Java或C#的方式来创建属性,所以你需要实现自己的方法。可以考虑为每个私有字段创建两个方法:

class Employee
{
	private $name;
 	public function getName(){
  		return $this->name;
 	}
 	public function setName($name){
  		$this->name=$name;
 	}
}

虽然这样策略不如使用属性那么方便,但确实通过使用标准的命名约定封装了管理和存取任务。当然,还应当设置方法中增加另外的验证功能。不过,这个例子已经足以说明这个问题了。

Creative Commons License

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