在Thinkphp5、Yii2、Laravel、Slim等框架中,模型中创建的对象都可以直接用数组的方式来取值或赋值,我们写个简单的代码来演示下:
class User{
此处省略N行代码;
}$user=new User();$user['name']='老文';
var_dump($user);
这段代码不但没有问题而且可以成功的往$user这个对象中添加一个name=“老文”的属性进去,那么它具体是怎么实现的呢?我需要用到PHP中6种预定义接口(Traversable、Iterator、IteratorAggregate、ArrayAccess、Serializable、Closure)中的ArrayAccess来实现。
ArrayAccess
ArrayAccess是PHP5新加入的一个接口, 可以让你像操作数组操作对象,它定义了必需要实现的4个方法:
{
abstract public offsetExists ($offset) //检查偏移位置是否存在
abstract public offsetGet ($offset) //获取一个偏移位置的值
abstract public void offsetSet ($offset ,$value) //设置一个偏移位置的值
abstract public void offsetUnset ($offset) //复位一个偏移位置的值
}
那么具体如何实现,看代码:
/*
* 声明一个User类并实现ArrayAccess接口
* */
class User implements ArrayAccess {
/*
* 实现ArrayAccess接口中offsetExists方法,
* 用来判断是否存在此属性
* */
public function offsetExists($offset)
{
return isset($this->$offset);
}
/*
* 实现ArrayAccess接口中offsetGet方法
* 用来获取属性值
* */
public function offsetGet($offset)
{
return $this->$offset;
}
/*
* 实现ArrayAccess接口中offsetSet方法
* 用来设置属性值
* */
public function offsetSet($offset, $value)
{
$this->$offset=$value;
}
/*
* 实现ArrayAccess接口中offsetUnset方法
* 用来删除属性
* */
public function offsetUnset($offset)
{
unset($this->$offset);
}
}
//实例化出一个对象$u=new User();//打印实例化出对象
var_dump($u);
//用数组的方法设置属性值
$u["name"]="好人";
var_dump($u);
echo $u['name'];
最后结果如图:
图片1.png (29.39 KB, 下载次数: 1713)
2017-6-21 14:31 上传