当前位置:首页 > PHP > 正文内容

PHP中的ArrayAccess用法详解

高老师7年前 (2018-12-17)PHP2422

php arrayaccess 官方的说法是让你能以数组的形式访问对象,对于这种php内置接口一直不太明白有什么用,坚持多看文章,终于理解,特来分享,思路不同,更易于理解。

(1).创建一个学生类,并且实现arrayaccess 接口。

<?php

class  student implements ArrayAccess
{
    public $name = '小美';
    
    private $age = 17;


    public function offsetExists($offset)
    {
        // TODO: Implement offsetExists() method.
    }

    public function offsetGet($offset)
    {
        // TODO: Implement offsetGet() method.
    }

    public function offsetSet($offset, $value)
    {
        // TODO: Implement offsetSet() method.
    }

    public function offsetUnset($offset)
    {
        // TODO: Implement offsetUnset() method.
    }
}

//实例化一个学生小美
$student = new student();

//用对象的方式去访问学生姓名
echo $student->name.PHP_EOL;

//用对象的方式给学生重新起名字
$student->name = '小茜';

//用对象的方式去访问学生姓名
echo $student->name,PHP_EOL;

上面是个很简单的类,初始化这个学生叫小美,然后通过对象的方式去访问和修改对象的属性,修改了学生的姓名。以上代码分别输出:

小美
小茜

(2).既然这里要讲以数组的方式访问对象,那就来试试数组访问对象属性,访问学生的姓名

class  student implements ArrayAccess
{
    public $name = '小美';

    private $age = 17;


    public function offsetExists($offset)
    {
        // TODO: Implement offsetExists() method.
    }

    public function offsetGet($offset)
    {
        var_dump($offset);
    }

    public function offsetSet($offset, $value)
    {
        // TODO: Implement offsetSet() method.
    }

    public function offsetUnset($offset)
    {
        // TODO: Implement offsetUnset() method.
    }
}

//实例化一个学生小美
$student = new student();

//数组方式访问学生的姓名
echo $student['name'];

我们直接输出$student['name']人家并没有输出学生小美的名字,而是调用内部的offsetGet方法,并将我传递的name下标传递进去。也就是说实现了ArrayAccess接口的类,如果用数组的方式访问对象,PHP底层先会调用offsetGet方法,并且将数组的下标传递进去。那么问题来了,我怎么用数组的方式去获取学生的名字呢?其实PHP只提供了我们访问数组形式访问对象的能力,但是具体的实现要我们来实现。如果真的只是简单的用数组形式访问对象,那么我们完全可以通过方法将对象转换为数组。PHP仅仅只提供我们这个能力,实现交由我们开发者,发挥的空间更大。完全可以自定义。

(3)通过上面我们知道一个类实现了ArrayAccess接口,当用数组形式访问它,它会自动调用offsetGet方法,那么用数组形式赋值,它就应该会调用offsetSet方法,使用empty方法检测数组的key是否存在,它就应该会自动调用offsetExists方法,使用unset方法删除数组的key是否存在,它就应该会自动调用offsetUnset方法,

class  student implements ArrayAccess
{
    public $name = '小美';

    private $age = 17;


    public function offsetExists($offset)
    {
        return property_exists('student', $offset);
    }

    public function offsetGet($offset)
    {
        return $this->$offset;
    }

    public function offsetSet($offset, $value)
    {
        $this->$offset = $value;
    }

    public function offsetUnset($offset)
    {
        $this->$offset = '';
    }
}

//实例化一个学生小美
$student = new student();

//数组方式访问学生的姓名
echo $student['name'].PHP_EOL;

//数组方式重新给学生起名字,改年龄
$student['name'] = '小倩';
$student['age'] = 12;

//数组方式访问姓名和年龄
echo $student['name'].PHP_EOL;
echo $student['age'].PHP_EOL;

那么这个接口还能做什么,有哪些应用场景,下篇文章继续讲

扫描二维码推送至手机访问。

版权声明:本文由高久峰个人博客发布,如需转载请注明出处。

本文链接:https://blog.20230611.cn/post/72.html

分享给朋友:

“PHP中的ArrayAccess用法详解” 的相关文章

PHP获取站点根目录,PHP获取应用根目录,cgi和cli都支持

PHP获取站点根目录,PHP获取应用根目录,cgi和cli都支持

重构框架的时候想要考虑支持下cli模式,于是参考了thinkphp的底层。/**  * 获取应用根目录  * @return string  */ public static function getRootP...

【二】PHP多进程学习-进程信号管理

【二】PHP多进程学习-进程信号管理

(1).学习目标:    了解常见信号类型(百度PHP支持的信号类型),(2).相关函数学习:    (2.1).pcntl_signal函数用于设置一个信号管理器接收进程信号,参数1:信号类型,参数2:回调函数,用于在接收到参数1类型的信...

cookie跨域,cookie p3p跨域

cookie跨域,cookie p3p跨域

最近在公司开发一个新的项目假设项目域名是a.com,需要接入b.com的单点登陆系统。(1).首先我们会在a.com的登陆页面用iframe引入b.com来显示登陆界面,实际上登陆验证操作都是在b.com上面(2).当b.com验证通过,会在前端ajax请求a.com的回调地址,这个回调地址目的就是...

PHP最快方式模拟curl,PHP最快爬虫模拟方法

PHP最快方式模拟curl,PHP最快爬虫模拟方法

有时候我们需要爬一个接口,但是这个接口需要很多参数,包括header和cookie要去编写,使用php curl模拟实在太慢。我们可以通过浏览器的network来复制请求为curl命令。例如我需要模拟请求接口地址:https://www.xkmz.cc/Ajax/Debug/delly,我们只需要在...

php elasticsearch基础使用

php elasticsearch基础使用

elasticsearch的操作都是基于http协议的,已经有现成的php类库,composer安装即可。{     "require": {        &...

php event异常处理,php set_exception_handler无效

php event异常处理,php set_exception_handler无效

(1).今天遇到一件奇怪的事情,在event事件中是无法自定义异常处理,例如我们使用set_exception_handler来统一处理异常。例如下面的代码:<?php error_reporting(E_ALL); set_error_handler(function ($errn...