PHP面向对象程序设计重载(overloading)操作详解(4)
运行结果为:
a1->p1:1
a1->p1:该属性不存在!
下面的例子中,声明一个Person类,并将所有的成员属性设置成private的。在类中添加自定义的“__isset()”和“__unset()”两个方法。在类外部使用“isset()”和“unset()”函数时,会自动调用这两个方法。代码如下:
<?php
class Person{
private $name; //此属性被封住
private $sex;
private $age;
function __construct($name='', $sex='男', $age){
$this->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 . "<br />";
}
}
$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 false
boolean true
boolean true
boolean false
名字:yeoman,性别:,年龄:
方法重载
当对一个对象不存在的实例方法进行“调用”时,会自动调用类中的__call()这个魔术方法;
当对一个类不存在的静态方法进行“调用”时,会自动调用类中的__callstatic()这个魔术方法。
例子:直接调用不存在的方法
<?php
ini_set('display_errors',1);
class A{
}
$a = new A();
$a->f1(); //不存在的方法
?>
会报错,报错内容为:
Fatal error: Uncaught Error: Call to undefined method A::f1()
对上面报错作“优雅处理”:
