PHP标准类库系列 arrayAccess

现在很多的 php 框架模型调取属性的时候可以按照数组的方式去调用,这是因为使用了arrayAccess这个接口

什么是 SPL?

SPL 是 Standard PHP Library 的缩写,是官方在 php5之后提供的一个标准类库,为 php 面向对象开发
提供了良好的支持

如何使用arrayAccess 接口

最好的学习就是使用啊,这是我写的一个 demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
<?php
class Demo implements \ArrayAccess{
public $name = 'demo';
protected $attributes = [];
/**
* Demo constructor.
* @param array $attribute
*/
public function __construct(array $attribute = [])
{
$this->attributes = $attribute;
}
/**
* @param mixed $offset
* @return bool
*/
public function offsetExists($offset)
{
return isset($this->{$offset});
}
/**
* @param mixed $offset
* @return mixed
*/
public function offsetGet($offset)
{
return $this->{$offset};
}
/**
* @param mixed $offset
* @param mixed $value
* @return mixed
*/
public function offsetSet($offset, $value)
{
return $this->{$offset} = $value;
}
/**
* @param mixed $offset
* @return bool
*/
public function offsetUnset($offset)
{
if($this->$offset){
$this->$offset = null;
return true;
}else{
return false;
}
}
/**
* @param $name
* @param $value
* @return mixed
*/
public function __set($name, $value)
{
return $this->attributes[$name] = $value;
}
/**
* @param $name
* @return mixed|null
*/
public function __get($name)
{
return array_key_exists($name,$this->attributes)? $this->attributes[$name] : null;
}
}
$arr = [
'height' => '180cm',
];
$demo = new Demo($arr);
echo $demo->name . PHP_EOL;
echo $demo['name'] . PHP_EOL;
echo $demo['height'] . PHP_EOL;
//删除
unset($demo['height']);
var_dump($demo['height']);
//新增
$demo['sex'] = 'man';
echo $demo->sex . PHP_EOL;
//修改
$demo['height'] = '2333cm';
echo $demo['height'] . PHP_EOL;
//打印这个类
var_dump($demo);

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
demo
demo
180cm
NULL
man
2333cm
object(Demo)#1 (2) {
["name"]=>
string(4) "demo"
["attributes":protected]=>
array(2) {
["height"]=>
string(6) "2333cm"
["sex"]=>
string(3) "man"
}
}

这里还用了__set__get,现在一些框架的关于数据模型的类也是类似的实现思路

这个博客有个赞赏功能,不试一下吗?