IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> 用ArrayIterator 定制PHP数组,实现参数自动检查 -> 正文阅读

[PHP知识库]用ArrayIterator 定制PHP数组,实现参数自动检查

php数组很强大,有很多功能。用ArrayIterator 可添加更多的功能。

比如说在cakephp框架中,request的query参数就是一个数组,可以通过key来获取不同的参数,但是当试图获取数据中不存在的key时,并不会报错,只是返回null。

浏览器表单输入数据,传到后台后,理论上需要重新检查,参数是否有,长度,类型等等,这是个比较繁琐的工作,特别是修改比较多的时候,前后台都要改。因此,对于要求不高的内部系统来说,后台可以不用检查长度,类型等等,但是参数是否存在应该要检查。

对于表单项目多的时候,这个检查仍然很繁琐,通常用下面的办法来检查

array_key_exists('项目a',$query)

isset($query['项目a']) 这个不推荐,如果项目为null的时候,会误判

对于几十上百的参数,有没有简单的办法来检查呢?于是我们想到了如果使用的时候,如果项目不存在直接报错就好了,比如下面

$query=['aaa'=>'bbb'];

$test = $query['ccc'];

如果'ccc'不存在,抛出异常和事务联动,就达到了检查的目的。

要实现这个目标,需要定制php数组,继承ArrayIterator类,可以很简单实现定制数组。对于上面这个问题,代码如下

<?php
namespace App\Utils;

class Parameter extends \ArrayIterator {

    public function __construct(array $array = [], int $flags = 0){
        parent::__construct($array,$flags);
	}

    public function offsetGet($var) {
        if(!array_key_exists($var,$this)) throw new ParameterException($var);

        return parent::offsetGet($var);
    }
}

对于上面的$test = $query['ccc'];会触发ParameterException

使用方法

$query = new Parameter($this->request->query);

$query就具备数组的全部功能,另外具备当获取不存在key的时候,发出异常的功能。

当然还可以实现其他的功能,比如说保存或读取数组的时候,触发其他操作等等。

下面说一下解决这个问题遇到的坑,当初准备实装SeekableIterator,?ArrayAccess,?Serializable,?Countable

这些接口来实现,后来发现即使实装了这些接口,对array_key_exists不起作用,在网上查了半天都没有解决, 网上说?ArrayAccess这个接口是无法解决这个问题,array_key_exists只能对原生的数组起作用,后台发现继承ArrayIterator类后,可以达到原生同等的效果。

PHP: ArrayIterator - Manual

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2022-03-08 22:08:09  更:2022-03-08 22:09:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 1:23:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码