资讯专栏INFORMATION COLUMN

ArrayAccess使用详解和实现配置化程序

李涛 / 620人阅读

摘要:简介数组式访问接口提供像访问数组一样访问对象的能力的接口。下面我带你们一起看看我是这么实现的在项目更目录下创建一个目录在目录下创建相应的配置文件,比如和。

简介

ArrayAccess(数组式访问)接口:提供像访问数组一样访问对象的能力的接口。

提供接口

</>复制代码

  1. ArrayAccess {
  2. //检查一个偏移位置是否存在
  3. abstract public boolean offsetExists ( mixed $offset );
  4. //获取一个偏移位置的值
  5. abstract public mixed offsetGet ( mixed $offset );
  6. //设置一个偏移位置的值
  7. abstract public void offsetSet ( mixed $offset , mixed $value );
  8. //复位一个偏移位置的值
  9. abstract public void offsetUnset ( mixed $offset );
  10. }

如果我们想像数组一样来访问你的PHP对象只需要实现ArrayAccess接口即可

实例运用

场景:假如我有一个User类,映射的是用户的信息,想通过数组的方式来访问和设置用户信息

</>复制代码

  1. data = [
  2. "name" => "moell",
  3. "sex" => "男",
  4. "email" => "moell@gmail.com"
  5. ];
  6. }
  7. /**
  8. * 检查指定字段数据是否存在
  9. *
  10. * @param $offset
  11. * @return bool
  12. */
  13. public function offsetExists($offset)
  14. {
  15. return isset($this->data[$offset]);
  16. }
  17. /**
  18. * 获取指定字段数据
  19. *
  20. * @param $offset
  21. * @return mixed
  22. */
  23. public function offsetGet($offset)
  24. {
  25. return $this->data[$offset];
  26. }
  27. /**
  28. * 设置指定字段数据
  29. *
  30. * @param $offset
  31. * @param $value
  32. * @return mixed
  33. */
  34. public function offsetSet($offset, $value)
  35. {
  36. return $this->data[$offset] = $value;
  37. }
  38. /**
  39. * 删除指定字段数据
  40. *
  41. * @param $offset
  42. */
  43. public function offsetUnset($offset)
  44. {
  45. unset($this->data[$offset]);
  46. }
  47. }
  48. $user = new User();
  49. //获取用户的email
  50. echo $user["email"].PHP_EOL; // moell@gmail.com
  51. //检查age是否存在
  52. var_dump(isset($user["age"])); // bool(false)
  53. //设置age
  54. $user["age"] = 18;
  55. echo $user["age"].PHP_EOL; //18
  56. //删除age
  57. unset($user["age"]);
  58. var_dump(isset($user["age"])); // bool(false)

我们的对象可以像数组一样操作了,是不是很神奇呢?


实现程序配置化

</>复制代码

  1. 在我们构建应用中,经常会通过一个配置文件变更程序的一个行为,通过ArrayAccess我们会更轻松的实现。

下面我带你们一起看看我是这么实现的

1. 在项目更目录下创建一个config目录
2. 在config目录下创建相应的配置文件,比如app.php 和 database.php。文件程序如下

app.php

</>复制代码

  1. "app name",
  2. "version" => "v1.0.0"
  3. ];

database.php

</>复制代码

  1. [
  2. "host" => "localhost",
  3. "user" => "root",
  4. "password" => "12345678"
  5. ]
  6. ];

3. Config.php实现ArrayAccess

</>复制代码

  1. path = __DIR__."/config/";
  2. }
  3. public static function instance()
  4. {
  5. if (!(self::$instance instanceof Config)) {
  6. self::$instance = new Config();
  7. }
  8. return self::$instance;
  9. }
  10. public function offsetExists($offset)
  11. {
  12. return isset($this->config[$offset]);
  13. }
  14. public function offsetGet($offset)
  15. {
  16. if (empty($this->config[$offset])) {
  17. $this->config[$offset] = require $this->path.$offset.".php";
  18. }
  19. return $this->config[$offset];
  20. }
  21. public function offsetSet($offset, $value)
  22. {
  23. throw new Exception("不提供设置配置");
  24. }
  25. public function offsetUnset($offset)
  26. {
  27. throw new Exception("不提供删除配置");
  28. }
  29. }
  30. $config = Config::instance();
  31. //获取app.php 文件的 name
  32. echo $config["app"]["name"].PHP_EOL; //app name
  33. //获取database.php文件mysql的user配置
  34. echo $config["database"]["mysql"]["user"].PHP_EOL; // root

如果你给我一样热爱PHP,欢迎加入QQ群:339803849一起讨论

声明

文章转载说明出处,本文地址:http://moell.cn/article/29

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21993.html

相关文章

  • 【PHP高级特性】ArrayAccess 接口

    摘要:提供了个常用的预定义接口,实现某些特定的能力。是啥如官方文档所述,它提供像访问数组一样访问对象的能力的接口。它提供了个接口我们实现这个接口,依次对应数组的读取,设置,操作。用上了它,可以让一个类即可以支持对象引用,也支持数组引用。 php提供了6个常用的预定义接口,实现某些特定的能力。其中最最常用的就是 ArrayAccess 了,像 Laravel 这种流行的框架都用到了它。 Arr...

    mrli2016 评论0 收藏0
  • 【SPL标准库专题(3)】Classes

    摘要:我把分为五个部分,,,,而其中是就是做一些类的介绍与相关的类在各自文章内,在介绍这些类之前,先介绍几个接口数组式访问接口只要实现了这个接口,就可以使得像那样操作。只有内部的类用写的类才可以直接实现接口代码中使用或接口来实现遍历。 我把SPL分为五个部分:Iterator,Classes,Exceptions,Datastructures,Function;而其中classes是就是做一...

    binaryTree 评论0 收藏0
  • Lumen框架“服务容器”源码解析

    摘要:下边是服务容器工作示意图服务容器的产生框架中,服务容器是由中类完成的,该类实现了服务容器的核心功能。并不是框架中所有的类都能实现自动依赖注入的功能只有服务容器创建的类实例才能实现依赖自动注入。框架中的服务容器是全局的,不需要 1.服务容器 服务容器是Lumen框架整个系统功能调度配置的核心,它提供了整个框架运行过程中的一系列服务。服务容器就是提供服务(服务可以理解为系统运行中需要的东西...

    ytwman 评论0 收藏0
  • 读 PHP - Pimple 源码笔记(上)

    摘要:也就是闲时为了写文章而写的一篇关于源码的阅读笔记。是标准库的缩写,一组旨在解决标准问题的接口和类的集合。提供了一套标准的数据结构,一组遍历对象的迭代器,一组接口,一组标准的异常,一系列用于处理文件的类,提供了一组函数,具体可以查看文档。 也就是闲时为了写文章而写的一篇关于 Pimple 源码的阅读笔记。Pimple 代码有两种编码方式,一种是以 PHP 编写的,另一种是以 C 扩展编写...

    cfanr 评论0 收藏0
  • PHP 依赖注入

    摘要:通常调用一个类里面的方法需要如何操作依赖注入模式用来减少程序间的耦合依赖注入共有三种模式方法注入着重说下方法注入并结合单例注册的服务数组访问接口测试邮件发送成功方式访问通过数组的方式访问也是通过该方式实现依赖 通常调用一个类里面的方法需要如何操作: $class = new class();$class->fun() 依赖注入模式用来减少程序间的耦合 依赖注入共有三种模式: sette...

    zengdongbao 评论0 收藏0

发表评论

0条评论

李涛

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<