本文实例讲述了PHP面向对象程序设计重载(overloading)操作。分享给大家供大家参考,具体如下:重载未定义或不可见的类属性或方法时,重载方法会被调用。是通过魔术方法(magic methods)来实现的。
通俗一点来说,重载在php中的含义是指,当一个对象或类使用其未定义或不可见的属性和方法时,其中的一些“处理机制”。属性重载取值:赋值:判断(isset):销毁(unset):魔术方法__GET($属性名):
p1; //1
echo $a1->p2; //未定义$p2,会报错, Notice: Undefined property: A::$p2
?>
{$prop_name}属性还未定义(不存在)!";
return ""; //也可以返回0,或false等
*/
//还可以这样处理
trigger_error("发生错误:属性不存在!", E_USER_ERROR);
die();
}
}
$a1 = new A();
echo $a1->p1; //1
echo $a1->p2; //未定义$p2,但经过"处理"
?>
name = $name;
$this->sex = $sex;
$this->age = $age;
}
private function __get($propertyName){ //这里要用private修饰,防止类外部调用
if($propertyName == 'age'){
return $this->age;
}
}
}
$p = new Person('yeoman', '男',23);
$v1 = $p->name;
$v2 = $p->sex;
$v3 = $p->age; //自动调用了__get()方法获取私有属性age(函数定义里面返回)
echo "name=$v1, sex=$v2, age=$v3";
?>
__SET($属性名, 值):
prop_list[$p] = $v;
}
function __get($p){
return $this->prop_list[$p];
}
}
$a1 = new A();
$a1->p1 = 1; //不存在的属性名赋值,此时会调用_set(),并传过去"p1"和1
$a1->p2 = 2;
$a1->ac = 'avc';
echo "
输出这些“不存在的属性”的值:";
echo "
a1->p1:" . $a1->p1; //不存在的属性名取值,此时会调用_get(),并传过去"p1"
echo "
a1->p2:" . $a1->p2;
echo "
a1->ac:" . $a1->ac;
?>
a1->p2:2
a1->ac:avc__ISSET($属性名):
$v1 = isset($对象->不存在的属性); //此时会调用这个对象所属类中的魔术方法:isset()
prop_list[$p] = $v;
}
function __get($p){
if($this->prop_list[$p]){
return $this->prop_list[$p];
}else{
return "该属性不存在!";
}
}
function __isset($prop){ //__isset()是自定义的方法, isset()是系统函数
$re = isset($this->prop_list[$prop]);
return $re;
}
}
$a1 = new A();
$a1->p1 = 1;//不存在的属性名赋值,此时会调用_set(),并传过去"p1"和1
$a1->p2 = 2;
$a1->ac = 'avc';
echo "
输出这些“不存在的属性”的值";
echo "
a1->p1:" . $a1->p1;//不存在的属性名取值,此时会调用_get(),并传过去"p1"
echo "
a1->p2:" . $a1->p2;
echo "
a1->ac:" . $a1->ac;
//下面演示isset判断不存在的属性
$v1 = isset($a1->p1); //存在
$v2 = isset($a1->ppp1); //不存在
var_dump($v1);
echo "
";
var_dump($v2);
?>
a1->p2:2
a1->ac:avc
boolean true
boolean false__UNSET($属性名)
prop_list[$p] = $v;
}
function __get($p){
if($this->prop_list[$p]){
return $this->prop_list[$p];
}else{
return "该属性不存在!";
}
}
function __unset($prop){
unset($this->prop_list[$prop]);
}
}
$a1 = new A();
$a1->p1 = 1;//不存在的属性名赋值,此时会调用_set(),并传过去"p1"和1
echo "
a1->p1:" . $a1->p1;//不存在的属性名取值,此时会调用_get(),并传过去"p1"
//下面演示unset销毁一个不存在的属性
unset($a1->p1);
echo "
a1->p1:" . $a1->p1;
?>
a1->p1:该属性不存在!__isset()
name = $name;
$this->sex = $sex;
$this->age = $age;
}
private function __isset($propertyName){ //需要一个参数,是测定的私有属性的名称
if($propertyName == 'name'){
return false; //返回假,不允许在类外部测定name属性
}
return isset($this->$propertyName); //这里propertyName要加$符,因为这是参数,不是属性
}
private function __unset($propertyName){
if($propertyName == 'name')
return; //退出方法,不允许删除对象中的name属性
unset($this->$propertyName); //这里propertyName要加$符
}
public function say(){
echo "名字:" . $this->name . ",性别:" . $this->sex . ",年龄:" . $this->age . "
";
}
}
$person = new Person("yeoman", "男", 23);
var_dump(isset($person->name)); //输出bool(false),不允许测定name属性
var_dump(isset($person->sex)); //输出bool(true),存在sex私有属性
var_dump(isset($person->age)); //输出bool(true),存在age私有属性
var_dump(isset($person->id)); //输出bool(false),测定对象中不存在id属性
unset($person->name); //删除私有属性name,但在 __unset()中不允许删除
unset($person->sex); //删除对象中的私有属性sex,删除成功
unset($person->age);
$person->say(); //对象中的sex和age属性被删除,输出:名字:yeoman,性别:,年龄:
?>
boolean true
boolean true
boolean false
名字:yeoman,性别:,年龄:方法重载这个魔术方法;这个魔术方法。
f1(); //不存在的方法
?>
f1(); //不存在的方法,但经过处理
?>
这个魔术方法。和上面的处理类似。php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。