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类来创建一个自定义的Parameter类,当尝试获取不存在的数组键时抛出异常。这种方法简化了在处理大量表单参数时检查其存在的工作,特别是在内部系统中。博客还提到了尝试实现其他接口如SeekableIterator, ArrayAccess等未解决问题,而ArrayIterator成功解决了array_key_exists的问题。
2193

被折叠的 条评论
为什么被折叠?



