例如:
<?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; ?>
内容版权声明:除非注明,否则皆为本站原创文章。