PHP 预定义类 ArrayAccess接口的使用

小白兔晒黑了 / 2024-09-01 / 原文

1 何为预定义

php中的预定义是指的是被视为全局可用的内置常量、变量、函数、类、接口,这些内容不需要特别的引入或申明,本身就存在于php语言中。

php 预定义类目录:https://www.php.net/manual/zh/reserved.classes.php

2  ArrayAccess接口 简介

ArrayAccess接口可以让你在操纵对象中的数据时,使用与操纵数组中的数据相同的一套约定。

https://www.php.net/manual/zh/class.arrayaccess.php

 

这样做的好处是:能够充分利用面向对象设计的好处,例如使用基于类的继承,或者在对象(数组)中实现额外的方法;

 

要实现ArrayAccess接口,必须实现四个方法:

public offsetExists(mixed $offset): bool      用于标识一个元素是否已定义
public offsetGet(mixed $offset): mixed      用于返回一个元素的值
public offsetSet(mixed $offset, mixed $value): void 用于为一个元素设置新值
public offsetUnset(mixed $offset): void 用于删除一个元素和相应的值。
当你用数组的语法操作用ArrayAccess接口的对象中的数据时,会自动调用以上方法。
 
创建一个类 FakeArray 实现这个接口
class FakeArray implements ArrayAccess
{
    private $elements;

    public function __construct(){
        $this->elements = array();
    }

    public function offsetExists($offset): bool {
        return isset($this->elements[$offset]);
    }

    public function offsetGet($offset): mixed {
        return isset($this->elements[$offset]) ? $this->elements[$offset] : null;
    }
     public function offsetSet($offset, $value): void {
        if (is_null($offset)) {
            $this->elements[] = $value;
        } else {
            $this->elements[$offset] = $value;
        }
    }
    public function offsetUnset($offset): void {
        unset($this->elements[$offset]);
    }

}

 

3 ArrayAccess的使用

就跟使用数组一样方便

$array = new FakeArray();
$array['animal'] = '兔子';
if(isset($array['animal'] ) && $array['animal']=='兔子'){
    echo "你有一只兔子了 \n";
}

unset($array['animal']);
if(!isset($array['animal'] )){
    echo "你没有宠物了!\n";
}

 

class FakeArray2 extends FakeArray
{
    
    public function  givePet()
    {
        echo '你要一只狗吗?';
    }
}

$array = new FakeArray2();
$array->givePet();
$array['animal'] = '狗子';
var_dump($array['animal']);