例如:
<?php
class A{
public $p1 = 1;
}
$a1 = new A();
echo $a1->p1; //1
echo $a1->p2; //未定义$p2,会报错, Notice: Undefined property: A::$p2
?>
php的重载,使用__get()方法对上面的出错作“优雅处理”。
<?php
class A{
public $p1 = 1;
//private $p2 = 1; //这里将属性私有化,其实和未定义一样,对外部来说都相当于不存在
function __get($prop_name){
/*
//比如可以这样处理
echo "<br />{$prop_name}属性还未定义(不存在)!";
return ""; //也可以返回0,或false等
*/
//还可以这样处理
trigger_error("发生错误:属性不存在!", E_USER_ERROR);
die();
}
}
$a1 = new A();
echo $a1->p1; //1
echo $a1->p2; //未定义$p2,但经过"处理"
?>
这里举一个对所用私有属性获取的操作的例子。
例子:
<?php
class Person{
public $name;
public $sex;
private $age; //年龄私有化,类外不能直接访问这个属性
function __construct($name='', $sex='', $age){
$this->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";
?>
运行结果为:
name=yeoman, sex=男, age=23
__SET($属性名, 值):
当对一个对象不存在的属性进行“赋值”时,就会自动调用这个内部的魔术方法;其有2个形参,分别代表要对不存在的属性进行赋值的“属性名”和“属性值”。
这个方法,结合_GET方法,往往可以使我们定义的类,有一种可扩展的特性。即:类或对象的属性,可以更为方便自由。
例子:
<?php
class A{
//定义一个属性,
protected $prop_list = array(); //初始为空数组
//这个方法会在A的对象使用一个不存在的属性进行赋值时调用
function __set($p,$v){
//echo "使用不存在的属性!";
$this->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 "<br />输出这些“不存在的属性”的值:";
echo "<br />a1->p1:" . $a1->p1; //不存在的属性名取值,此时会调用_get(),并传过去"p1"
echo "<br />a1->p2:" . $a1->p2;
echo "<br />a1->ac:" . $a1->ac;
?>
内容版权声明:除非注明,否则皆为本站原创文章。
