php中__get()和__set()用法介绍
class Person
{
private $__data = array();
public function __get($property)
{
if (isset($this->__data[$property]))
{
return $this->__data[$property];
}
else
{
return false;
}
}
public function __set($property, $value)
{
$this->__data[$property] = $value;
}
}
__set()和__get()方法是针对protect或private属性的,这样可以做到在外界不能直接访问属性,而通过public定义的__set()和__get()方法却可以轻易访问它,同事这两个方法对属性的操作通用性也比较高,也可以限制对象的属性的合法性,只有属于$__data数组中的属性,才可以进行设置,可以防止外界直接对属性进行设置。但是使用__set()和__get()也有些不足之处。第一,这两个方法只会捕捉私有或受保护的属性,即是外界没有访问权限的属性,这样php会报一个致命错误;第二,这两个方法破坏了属性的继承性。如果父对象中有一个__set()方法,而在子类中又实现了自己的__get()方法,那么对象就不会正常的运行,因为父对象的__get()方法是永远调不到的,而且要想检测重写的属性是否存在也不能得到的,因为它不会调用__get()方法。见到有人通过实现__isset()和__unset()来解决上面的问题。代码如下:
<table width="620" align="center" border="0" cellpadding="1" cellspacing="1" style="background:#FB7"> <tr> <td width="464" height="27" bgcolor="#FFE7CE"> 代码如下</td> <td width="109" align="center" bgcolor="#FFE7CE" style="cursor:pointer;" onclick="doCopy('copy1069')">复制代码</td> </tr> <tr> <td height="auto" colspan="2" valign="top" bgcolor="#FFFFFF" style="padding:10px;" class="copyclass" id=copy1069> public function __isset($property)
{
if (isset($this->data[$property]))
{
return true;
}
else
{
return false;
}
}
public function __unset($property)
{
if (isset($this->data[$property]))
{
return unset($this->data[$property]);
}
else
{
return false;
}
}
使用__isset()和__unset()则能保证属性是否真正存在,不过这两个方法只有在PHP5.1后才有效。
您可能感兴趣的文章:
php中__get()和__set魔术方法的用法举例
php中__get()和__set()用法介绍
php __call、__set 和 __get的用法介绍
php入门教程(十四) php面向对象中的魔术方法 __set()、__get()、__isset() 与 __unset()
魔术方法__get()和__set()详解
PHP5面向对象详解 - (10) __set() __get() __isset() __unset()四个方法
php魔术方法介绍
PHP中的Magic Methods (魔术函数)
php 魔术方法使用说明
PHP5试用(二)