💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、豆包、星火、月之暗面及文生图、文生视频 广告
# ArrayAccess(数组式访问)接口 ## **ArrayAccess** > 将对象当做数组一样操作 **最简单的一个例子:** ``` <pre class="calibre10">``` class <span class="token4">Test</span> implements <span class="token4"><span class="token3">\</span>ArrayAccess</span><span class="token3">{</span> private $configs<span class="token3">;</span> public <span class="token5">function</span> <span class="token4">offsetExists</span><span class="token3">(</span>$key<span class="token3">)</span> <span class="token3">{</span> <span class="token5">return</span> <span class="token4">isset</span><span class="token3">(</span>$this<span class="token1">-</span><span class="token1">></span>configs<span class="token3">[</span>$key<span class="token3">]</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> public <span class="token5">function</span> <span class="token4">offsetSet</span><span class="token3">(</span>$key<span class="token3">,</span> $value<span class="token3">)</span> <span class="token3">{</span> $this<span class="token1">-</span><span class="token1">></span>configs<span class="token3">[</span>$key<span class="token3">]</span> <span class="token1">=</span> $value<span class="token3">;</span> <span class="token3">}</span> public <span class="token5">function</span> <span class="token4">offsetGet</span><span class="token3">(</span>$key<span class="token3">)</span> <span class="token3">{</span> <span class="token5">return</span> $this<span class="token1">-</span><span class="token1">></span>configs<span class="token3">[</span>$key<span class="token3">]</span><span class="token3">;</span> <span class="token3">}</span> public <span class="token5">function</span> <span class="token4">offsetUnset</span><span class="token3">(</span>$key<span class="token3">)</span> <span class="token3">{</span> <span class="token4">unset</span><span class="token3">(</span>$this<span class="token1">-</span><span class="token1">></span>configs<span class="token3">[</span>$key<span class="token3">]</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> $obj <span class="token1">=</span> <span class="token5">new</span> <span class="token4">Test</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> $data<span class="token1">=</span><span class="token2">'data'</span><span class="token3">;</span> <span class="token">//自动调用offsetSet方法 </span> $obj<span class="token3">[</span><span class="token2">'data'</span><span class="token3">]</span> <span class="token1">=</span> $data<span class="token3">;</span> <span class="token">//自动调用offsetExists </span> <span class="token5">if</span><span class="token3">(</span><span class="token4">isset</span><span class="token3">(</span>$obj<span class="token3">[</span><span class="token2">'data'</span><span class="token3">]</span><span class="token3">)</span><span class="token3">)</span><span class="token3">{</span> echo <span class="token2">'has setting!'</span><span class="token3">;</span> <span class="token3">}</span> <span class="token">//自动调用offsetGet</span> <span class="token4">var_dump</span><span class="token3">(</span>$obj<span class="token3">[</span><span class="token2">'data'</span><span class="token3">]</span><span class="token3">)</span><span class="token3">;</span> <span class="token">//自动调用offsetUnset </span> <span class="token4">unset</span><span class="token3">(</span>$obj<span class="token3">[</span><span class="token2">'data'</span><span class="token3">]</span><span class="token3">)</span><span class="token3">;</span> <span class="token4">var_dump</span><span class="token3">(</span>$obj<span class="token3">[</span><span class="token2">'data'</span><span class="token3">]</span><span class="token3">)</span><span class="token3">;</span><span class="token">//自动调用offsetExists </span> <span class="token">//输出: </span> <span class="token">//has setting! </span> <span class="token">//data</span> <span class="token">//null</span> ``` ``` **自动加载缓存文件类** ``` <pre class="calibre10">``` class <span class="token4">AutoCache</span> implements <span class="token4"><span class="token3">\</span>ArrayAccess</span> <span class="token3">{</span> protected $path<span class="token3">;</span> protected $cachedir <span class="token1">=</span> <span class="token4">array</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> <span class="token">/** * 析构函数初始化缓存文件路径 */</span> <span class="token5">function</span> <span class="token4">__construct</span><span class="token3">(</span>$path<span class="token3">)</span> <span class="token3">{</span> $this<span class="token1">-</span><span class="token1">></span>path <span class="token1">=</span> $path<span class="token3">;</span> <span class="token3">}</span> <span class="token">/** * * 获取一个偏移位置的值 * 例子:$cache=new Config($dirpath); * 调用此方法的写法:$cache[$key] */</span> <span class="token5">function</span> <span class="token4">offsetGet</span><span class="token3">(</span>$key<span class="token3">)</span> <span class="token3">{</span> <span class="token5">if</span> <span class="token3">(</span><span class="token4">empty</span><span class="token3">(</span>$this<span class="token1">-</span><span class="token1">></span>cachedir<span class="token3">[</span>$key<span class="token3">]</span><span class="token3">)</span><span class="token3">)</span> <span class="token3">{</span> $file_path <span class="token1">=</span> $this<span class="token1">-</span><span class="token1">></span>path<span class="token3">.</span><span class="token2">'/'</span><span class="token3">.</span>$key<span class="token3">.</span><span class="token2">'.php'</span><span class="token3">;</span> $cachefile <span class="token1">=</span> require $file_path<span class="token3">;</span> $this<span class="token1">-</span><span class="token1">></span>cachedir<span class="token3">[</span>$key<span class="token3">]</span> <span class="token1">=</span> $cachefile<span class="token3">;</span> <span class="token3">}</span> <span class="token5">return</span> $this<span class="token1">-</span><span class="token1">></span>cachedir<span class="token3">[</span>$key<span class="token3">]</span><span class="token3">;</span> <span class="token3">}</span> <span class="token">/** * 设置一个偏移位置的值 * 例子:$cache=new Config($dirpath); * 调用此方法的写法:$cache[$key]='modules'; */</span> <span class="token5">function</span> <span class="token4">offsetSet</span><span class="token3">(</span>$key<span class="token3">,</span> $value<span class="token3">)</span> <span class="token3">{</span> <span class="token5">if</span> <span class="token3">(</span><span class="token4">is_null</span><span class="token3">(</span>$key<span class="token3">)</span><span class="token3">)</span> <span class="token3">{</span> <span class="token5">throw</span> <span class="token5">new</span> <span class="token4"><span class="token3">\</span>Exception</span><span class="token3">(</span><span class="token2">"请为你的缓存数据的文件起个文件名吧"</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token">//文件还未被缓存过</span> <span class="token5">if</span> <span class="token3">(</span><span class="token4">empty</span><span class="token3">(</span>$this<span class="token1">-</span><span class="token1">></span>cachedir<span class="token3">[</span>$key<span class="token3">]</span><span class="token3">)</span><span class="token3">)</span> <span class="token3">{</span> $file<span class="token1">=</span> $this<span class="token1">-</span><span class="token1">></span>path<span class="token3">.</span><span class="token2">'/'</span><span class="token3">.</span>$key<span class="token3">.</span><span class="token2">'.php'</span><span class="token3">;</span> $array<span class="token1">=</span><span class="token4">object_array</span><span class="token3">(</span>$value<span class="token3">)</span><span class="token3">;</span> $aaa<span class="token1">=</span><span class="token4">file_put_contents</span><span class="token3">(</span>$file<span class="token3">,</span><span class="token2">"<?php \r\n \$arr="</span><span class="token3">.</span><span class="token4">var_export</span><span class="token3">(</span>$array<span class="token3">,</span> <span class="token6">true</span><span class="token3">)</span><span class="token3">.</span><span class="token2">"; \r\n return \$arr;"</span><span class="token3">)</span><span class="token3">;</span> <span class="token">//加var_export的原因是file_put_contents不支持多维数组的数据</span> <span class="token5">if</span><span class="token3">(</span>$aaa<span class="token3">)</span><span class="token3">{</span> $cachefile <span class="token1">=</span> require $file<span class="token3">;</span> <span class="token">//var_dump($cachefile); </span> $this<span class="token1">-</span><span class="token1">></span>cachedir<span class="token3">[</span>$key<span class="token3">]</span> <span class="token1">=</span> $cachefile<span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> <span class="token5">return</span> $this<span class="token1">-</span><span class="token1">></span>cachedir<span class="token3">[</span>$key<span class="token3">]</span><span class="token3">;</span> <span class="token3">}</span> <span class="token">/** * 检查一个偏移位置是否存在 * 例子:$cache=new Config($dirpath); * 调用此方法的写法:isset($cache[$key]); */</span> <span class="token5">function</span> <span class="token4">offsetExists</span><span class="token3">(</span>$key<span class="token3">)</span> <span class="token3">{</span> <span class="token5">if</span> <span class="token3">(</span><span class="token4">empty</span><span class="token3">(</span>$this<span class="token1">-</span><span class="token1">></span>cachedir<span class="token3">[</span>$key<span class="token3">]</span><span class="token3">)</span><span class="token3">)</span> <span class="token3">{</span> echo<span class="token2">'meiyou'</span><span class="token3">;</span> <span class="token">//加载文件后设置偏移位置,然后在判断 </span> $file_path <span class="token1">=</span> $this<span class="token1">-</span><span class="token1">></span>path<span class="token3">.</span><span class="token2">'/'</span><span class="token3">.</span>$key<span class="token3">.</span><span class="token2">'.php'</span><span class="token3">;</span> <span class="token4">var_dump</span><span class="token3">(</span>$file_path<span class="token3">)</span><span class="token3">;</span> <span class="token5">if</span><span class="token3">(</span><span class="token4">file_exists</span><span class="token3">(</span>$file_path<span class="token3">)</span><span class="token3">)</span><span class="token3">{</span> $cachefile <span class="token1">=</span> require $file_path<span class="token3">;</span> $this<span class="token1">-</span><span class="token1">></span>cachedir<span class="token3">[</span>$key<span class="token3">]</span> <span class="token1">=</span> $cachefile<span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> echo <span class="token2">'调用了判断存在的方法offsetExists <br>'</span><span class="token3">;</span> <span class="token4">var_dump</span><span class="token3">(</span><span class="token4">isset</span><span class="token3">(</span>$this<span class="token1">-</span><span class="token1">></span>cachedir<span class="token3">[</span>$key<span class="token3">]</span><span class="token3">)</span><span class="token3">)</span><span class="token3">;</span> echo<span class="token2">'<br />'</span><span class="token3">;</span> <span class="token5">return</span> <span class="token4">isset</span><span class="token3">(</span>$this<span class="token1">-</span><span class="token1">></span>cachedir<span class="token3">[</span>$key<span class="token3">]</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token">/** * 复位一个偏移位置的值 * 例子:$cache=new Config($dirpath); * 调用此方法的写法:isset($cache[$key]); */</span> <span class="token5">function</span> <span class="token4">offsetUnset</span><span class="token3">(</span>$key<span class="token3">)</span> <span class="token3">{</span> echo <span class="token2">'调用了删除的方法offsetUnset <br>'</span><span class="token3">;</span> $file_path <span class="token1">=</span> $this<span class="token1">-</span><span class="token1">></span>path<span class="token3">.</span><span class="token2">'/'</span><span class="token3">.</span>$key<span class="token3">.</span><span class="token2">'.php'</span><span class="token3">;</span> <span class="token5">if</span><span class="token3">(</span><span class="token4">unlink</span><span class="token3">(</span>$file_path<span class="token3">)</span><span class="token3">)</span> <span class="token3">{</span> <span class="token4">unset</span><span class="token3">(</span>$this<span class="token1">-</span><span class="token1">></span>cachedir<span class="token3">[</span>$key<span class="token3">]</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> <span class="token3">}</span> ``` ``` **可以用于读取网站的配置文件:** database.php内容: ``` <pre class="calibre10">``` <span class="token5">return</span> <span class="token3">[</span> <span class="token2">'mysql'</span> <span class="token1">=</span><span class="token1">></span> <span class="token3">[</span> <span class="token2">'host'</span> <span class="token1">=</span><span class="token1">></span> <span class="token2">'localhost'</span><span class="token3">,</span> <span class="token2">'user'</span> <span class="token1">=</span><span class="token1">></span> <span class="token2">'root'</span><span class="token3">,</span> <span class="token2">'password'</span> <span class="token1">=</span><span class="token1">></span> <span class="token2">'12345678'</span> <span class="token3">]</span> <span class="token3">]</span><span class="token3">;</span> ``` ``` moudles.php的内容: ``` <pre class="calibre10">``` $config <span class="token1">=</span> <span class="token4">array</span><span class="token3">(</span> <span class="token2">'home'</span> <span class="token1">=</span><span class="token1">></span> <span class="token4">array</span><span class="token3">(</span> <span class="token2">'decorator'</span> <span class="token1">=</span><span class="token1">></span> <span class="token4">array</span><span class="token3">(</span> <span class="token2">'App\Decorator\Login'</span><span class="token3">,</span> <span class="token2">'App\Decorator\Template'</span><span class="token3">,</span> <span class="token2">'App\Decorator\Json'</span><span class="token3">,</span> <span class="token3">)</span><span class="token3">,</span> <span class="token3">)</span><span class="token3">,</span> <span class="token2">'default'</span> <span class="token1">=</span><span class="token1">></span> <span class="token2">'hello world'</span><span class="token3">,</span> <span class="token3">)</span><span class="token3">;</span> <span class="token5">return</span> $config<span class="token3">;</span> ``` ``` ``` <pre class="calibre10">``` namespace Config<span class="token3">;</span> class <span class="token4">Config</span> implements <span class="token4"><span class="token3">\</span>ArrayAccess</span> <span class="token3">{</span> private $config <span class="token1">=</span> <span class="token3">[</span><span class="token3">]</span><span class="token3">;</span> private static $instance<span class="token3">;</span> private $path<span class="token3">;</span> <span class="token">//配置文件路径并存放进$path变量</span> private <span class="token5">function</span> <span class="token4">__construct</span><span class="token3">(</span><span class="token3">)</span> <span class="token3">{</span> $this<span class="token1">-</span><span class="token1">></span>path <span class="token1">=</span> __DIR__<span class="token3">.</span><span class="token2">"/configs/"</span><span class="token3">;</span> <span class="token3">}</span> public static <span class="token5">function</span> <span class="token4">instance</span><span class="token3">(</span><span class="token3">)</span> <span class="token3">{</span> <span class="token5">if</span> <span class="token3">(</span><span class="token1">!</span><span class="token3">(</span>self<span class="token3">:</span><span class="token3">:</span>$instance <span class="token5">instanceof</span> <span class="token4">Config</span><span class="token3">)</span><span class="token3">)</span> <span class="token3">{</span> self<span class="token3">:</span><span class="token3">:</span>$instance <span class="token1">=</span> <span class="token5">new</span> <span class="token4">Config</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token5">return</span> self<span class="token3">:</span><span class="token3">:</span>$instance<span class="token3">;</span> <span class="token3">}</span> public <span class="token5">function</span> <span class="token4">offsetExists</span><span class="token3">(</span>$key<span class="token3">)</span> <span class="token3">{</span> <span class="token5">return</span> <span class="token4">isset</span><span class="token3">(</span>$this<span class="token1">-</span><span class="token1">></span>config<span class="token3">[</span>$key<span class="token3">]</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> public <span class="token5">function</span> <span class="token4">offsetGet</span><span class="token3">(</span>$key<span class="token3">)</span> <span class="token3">{</span> <span class="token5">if</span> <span class="token3">(</span><span class="token4">empty</span><span class="token3">(</span>$this<span class="token1">-</span><span class="token1">></span>config<span class="token3">[</span>$key<span class="token3">]</span><span class="token3">)</span><span class="token3">)</span> <span class="token3">{</span> <span class="token">//键对应的值为空则设置值</span> $this<span class="token1">-</span><span class="token1">></span>config<span class="token3">[</span>$key<span class="token3">]</span> <span class="token1">=</span> require $this<span class="token1">-</span><span class="token1">></span>path<span class="token3">.</span>$key<span class="token3">.</span><span class="token2">".php"</span><span class="token3">;</span> <span class="token3">}</span> <span class="token5">return</span> $this<span class="token1">-</span><span class="token1">></span>config<span class="token3">[</span>$key<span class="token3">]</span><span class="token3">;</span> <span class="token3">}</span> public <span class="token5">function</span> <span class="token4">offsetSet</span><span class="token3">(</span>$key<span class="token3">,</span> $value<span class="token3">)</span> <span class="token3">{</span> <span class="token5">throw</span> <span class="token5">new</span> <span class="token4"><span class="token3">\</span>Exception</span><span class="token3">(</span><span class="token2">'不提供设置配置'</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> public <span class="token5">function</span> <span class="token4">offsetUnset</span><span class="token3">(</span>$key<span class="token3">)</span> <span class="token3">{</span> <span class="token5">throw</span> <span class="token5">new</span> <span class="token4"><span class="token3">\</span>Exception</span><span class="token3">(</span><span class="token2">'不提供删除配置'</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> ``` ``` 使用: ``` <pre class="calibre17">``` $config <span class="token1">=</span> Config<span class="token3">:</span><span class="token3">:</span><span class="token4">instance</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> <span class="token">//获取database.php文件mysql的user配置</span> echo $config<span class="token3">[</span><span class="token2">'database'</span><span class="token3">]</span><span class="token3">[</span><span class="token2">'mysql'</span><span class="token3">]</span><span class="token3">[</span><span class="token2">'user'</span><span class="token3">]</span><span class="token3">.</span>PHP_EOL<span class="token3">;</span> <span class="token">// root</span> <span class="token">//获取database.php文件mysql的user配置</span> echo $config<span class="token3">[</span><span class="token2">'moudles'</span><span class="token3">]</span><span class="token3">[</span><span class="token2">'default'</span><span class="token3">]</span><span class="token3">.</span>PHP_EOL<span class="token3">;</span> <span class="token">// PHP_EOL:换行符</span> ``` ```