属性重载:发生在实例化访问不存在或无权限访问属性,系统自动加载方法。
主要方法有:
public function __get($name){} 读操作
public function __set($name,$value){} 写操作
public function __isset($name){} 读操作
public function __unset($name){} 写操作
原来类中private和protected类型属性不可直接访问,需要在类中构造方法使用。
在访问这些不存在或权限限制的属性时,自动加载这些方法
作用:常用在一些权限设置用到。比如设置权限查看,设置权限修改数据
1、--在给不可访问属性赋值时,__get()会被调用。
__get()方法:这个方法用来获取私有成员属性值的,有一个参数, 参数传入你要获取的成员属性的名称,返回获取的属性值, 这个方法不用我们手工的去调用, 是在直接获取私有属性的时候自动调用的。因为私有属性已经被封装上了,是不能直接获取值的(比如:”echo $p1->name” 这样直接获取是错误的),但是如果你在类里面加上了这个方法,在使用”echo $p1->name” 这样的语句直接获取值的时候就会自动调用__get($property_name)方法,将属性name传给参数$property_name,通过这 个方法的内部执行,返回我们传入的私有属性的值。
2、--读取不可访问属性的值时,__set()会被调用。
__set()方法:这个方法用来为私有成员属性设置值的, 有两个参数,第一个参数为你要为设置值的属性名,第二个参数是要给属性设置的值,没有返回值。这个方法同样不用我们手工去调用,是在直接设置私有属性值的 时候自动调用的,同样属性私有的已经被封装上了, 如果没有__set()这个方法,是不允许的, 比如:”$this->name=’zhangsan’,这样会出错,但是如果你在类里面加上了__set($property_name, $value)这个方法,在直接给私有属性赋值的时候,就会自动调用它,把属性比如name传给$property_name, 把要赋的值”zhangsan”传给$value,通过这个方法的执行,达到赋值的目的, 为了不传入非法的值, 还可以在这个方法给做一下判断。
3、--当对不可访问属性调用 isset() 或empty() 时,__isset()会被调用。
__isset() 方法:在看这个方法之前我们看一下“isset()”函数的应用,isset()是测定变量是否设定用的函数,传入一个变量作为参数,如果传入的变量存在则传回true,否则传回false。那么如果在一个对象外面使用“isset()”这个函数去测定对象里面的成员是否被设定可不可以用它呢?分两种情况,如果对象里面成员是公有的,我们就可以使用这个函数来测定成员属性,如果是私有的成员属性,这个函数就不起作用了,原因就是因为私有的被封装了,在外部不可见。那么我们就不可以在对象的外部使用“isset()”函数来测定私有成员属性是否被设定了呢?可以,你只要在类里面加上一个“__isset()”方法就可以了,当在类外部使用”isset()”函数来测定对象里面的私有成员是否被设定时,就会自动调用类里面的“__isset()”方法了帮我们完成这样的操作,“__isset()”方法也可以做成私有的。
--当对不可访问属性调用 unset() 时,__unset会被调用。
4、__unset()方法:看这个方法之前呢,我们也先来看一下“unset()”这个函数,“unset()”这个函数的作用是删除指定的变量且传回true,参数为要删除的变量。那么如果在一个对象外部去删除对象内部的成员属性用“unset()”函数可不可以呢,也是分两种情况,如果一个对象里面的成员属性是公有的,就可以使用这个函数在对象外面删除对象的公有属性,如果对象的成员属性是私有的,我使用这个函数就没有权限去删除,但同样如果你在一个对象里面加上“__unset()”这个方法,就可以在对象的外部去删除对象的私有成员属性了。在对象里面加上了“__unset()”这个方法之后,在对象外部使用“unset()”函数删除对象内部的私有成员属性时,自动调用“__unset()”函数来帮我们删除对象内部的私有成员属性,这个方法也可以在类的内部定义成私有的。
实例
<?php namespace _php; class Demo { protected $name; private $salary; public $counry; public function __construct($name,$salary) { $this->name=$name; $this->salary=$salary; } public function __get($name) { // if($name==='admin'){ // return $this->$name ; // }else{ // return '无权查看'; // } return ($this->name==='admin') ? $this->$name :'无权查看'; } public function __set($name,$value) { return $this->$name =$value ; } public function __isset($name) { return isset($this->$name); } public function __unset($name) { unset($this->$name); } } $query = new Demo('admin',9000); echo $query->salary; echo "<hr>"; echo $query->salary='6000'; echo "<hr>";
运行实例 »
点击 "运行实例" 按钮查看在线实例