现在很多的 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,现在一些框架的关于数据模型的类也是类似的实现思路