1.是否可以在类的外部访问一个属性是由访问修饰符来确定的。
2.从类的外部直接访问类的属性是糟糕的想法。面向对象的一个方法就是鼓励封装。在PHP中,我们一般通过__get()与__set()函数来实现对
属性的访问.如果不直接访问一个类的属性而是编写访问函数,那么可以通过一段代码执行所有访问。最初的访问函数如下所示:
class classname {
public $attribute;
function __get($name) {
return $this->$name;
}
function __set($name, $value){
$this->$name = $value;
}
}
3.此访问器函数的原理就是这样:只使用一段代码来访问特定属性。由于只有一个入口,就可以对要保存的数据进行检查,可以确保保存的数
据是有意义的数据。例如:
function _set ($name, $value) {
if( ($name == "attribute") && ($value >= 0) && ($value <= 100) ) {
$this->attribute = $value;
}
}
4.通过单一的访问入口,可以方便地改变潜在的程序实现。如果由于某种原因,需要改变属性$attribute的保存方式,访问器函数允许我们只
要修改一处代码,就可以完成此工作。
5.__get(),__set(),__isset(),__unset().
一般来说,总是把类的属性定义为private,这样更复合现实逻辑。
__get(),__set():用来获取和赋值其属性.他们不是默认存在的,而是我们手工添加进去的。
__isset(),__unset():来检查属性和删除属性。
6.__get()与__set(),__isset()与__unset()的一般添加方法。
//__get()方法用来获取私有属性.
private function __get($property_name) {
if (isset($this -> property_name)) {
return($this -> $property_name);
} else {
return(NULL);
}
}
//__set()方法设置私有属性
private function __set($property_name,$value) {
$this -> $property_name = $value;
}
//__isset()方法可以设为私有
private function __isset($property_name) {
echo "当在类外部使用isset()函数测定私有成员$nm时,自动调用<br />";
return isset($this -> $property_name);
}
//__unset()方法可以设为私有
private function __unset($property_name) {
$this ->unset($this -> property_name);
}
7.__get()方法
用来获取私有成员的属性值。用一个参数传入你要获取的私有成员的属性名称,就能获得其属性值,这个方法不用手工去调用,是在直接获取
私有属性的值的时候自动调用的。若不设定,是无法在类外调取私有属性的;若加上这方法,系统在执行"$xx -> name"这样的语句的时候就
会自动调用__get()方法。从而使我们可以使用私有函数。
8.__set()方法
在设置私有属性值时自动调用。(说是私有,公有的都一样,很牛的权限!)。没有他,像是$this->name = "value"会出错。有了它,就会自
动设定值。
9.__isset()方法
通过isset()函数的调用,达到自动测定属性是否设置。"isset()"是测定变量是否测定的函数,传入一个变量作为参数,若存在,则是true.
若不存在,则是false.在对象外使用"isset()"函数来测定是否被设定的话只能测定公有成员。因为私有属性被封装,外部不可见。在类的内
部加上__isset()函数的话,在外部进行isset()的判断时,会自动调用__isset()函数。*__isset()共有私有没有好大关系。
10.__unset()方法
同__isset()方法一样,只是他的目的是在对象外删除对象内的函数。管他是私有还是共有。
11.小结
这几个函数存在的目的就是提权,把原本在对象外不能做的事情(创建设定获取删除私有参数)变为了可能。