百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

php 用数组语法访问对象属性(php获取数组key)

ccwgpt 2025-06-10 13:34 2 浏览 0 评论

对象有时候当数组来访问有时候挺方便的,访问一个对象的属性,语法是$obj->属性名称,但其实可以使用$obj['属性名称']来访问属性

实现原理

对象要实现ArrayAccess接口,其中要实现的方法有

  • public boolean offsetExists ( mixed $offset ) 实现isset($obj['key'])的判断

  • public mixed offsetGet ( mixed $offset ) 实现$value = $obj['key']取值

  • public void offsetSet ( mixed $offset , mixed $value ) 实现$obj['key'] = 'value' 实现向指定的key赋值

  • public void offsetUnset ( mixed $offset ) 实现unset($obj['key']) 实现把指定的key销毁

示例代码

以下代码不是正常的逻辑,只是为了展示如何实现数组方式的属性操作而已

class User implements ArrayAccess{

public $name = '';

public $age = 0;

public function offsetExists($key){

return (bool)$this->{$key}; //name非空为当作存在吧

}

public function offsetGet($key){

return $this->{$key}; //直接把name返回吧,管它取什么key

}

public function offsetSet($key, $value){

$this->{$key} = $value; //任何key的数据赋值都存给name吧

}

public function offsetUnset($key){

$this->{$key} = ''; //将name设为空

}

}

$user = new User();

echo '<h1>name的测试</h1>';

echo 'name键为空:' . $user['name'] . '<br/>';

echo 'name属性为空:' . $user->name . '<br/>';

$user['name'] = 'jay';

echo 'name键的值:' . $user['name'] . '<br/>';

echo 'name属性的值:' . $user->name . '<br/><br/>';

echo isset($user['name']) ? 'name键存在<br/>' : 'name键不存在<br/>';

echo $user->name ? 'name属性有值<br/>' : 'name属性没值<br/>';

$user['name'] = '';

echo isset($user['name']) ? 'name键存在<br/>' : 'name键不存在<br/>';

echo $user->name ? 'name属性有值<br/>' : 'name属性没值<br/>';

echo '<br/><br/><h1>age的测试</h1>';

echo 'age键为空:' . $user['age'] . '<br/>';

echo 'age属性为空:' . $user->age . '<br/>';

$user['age'] = 99;

echo 'age键的值:' . $user['age'] . '<br/>';

echo 'age属性的值:' . $user->age . '<br/><br/>';

echo isset($user['age']) ? 'age键存在<br/>' : 'age键不存在<br/>';

echo $user->age ? 'age属性有值<br/>' : 'age属性没值<br/>';

$user['age'] = '';

echo isset($user['age']) ? 'age键存在<br/>' : 'age键不存在<br/>';

echo $user->age ? 'age属性有值<br/>' : 'age属性没值<br/>';

正确代码

通常如果要实现用数组语法访问对象属性,那么赋值和取值时一般不是向对象的属性取值,而是向一个私有的数据容器(下例中的$_data)取值赋值:

class User implements ArrayAccess{

private $_data = [];

public function offsetExists($key){

return isset($this->_data[$key]);

}

public function offsetGet($key){

return $this->_data[$key];

}

public function offsetSet($key, $value){

$this->_data[$key] = $value;

}

public function offsetUnset($offset){

unset($this->_data[$key]);

}

public function test(){

echo 'method';

}

}

$user = new User();

$user->test();

$user['xx'] = 1111;

echo $user['xx'];

echo '<br/><br/>' . $user['yyy']; //undefined

总结

一般平时写代码不经常用到这个知识,多数用于框架的封装和一些特殊场合,但你偶尔会遇到这类代码,此时知道它原理就好了,不要误认为那是个数组,其实是个对象

实际中可以看到的就是Yii2这个框架的ORM实现是应用了这个技术的,实现了既可将模型转换成JSON,也能调用模型的业务逻辑,代码类似这样:

$user = User::findOne(['email' => 'admin@xx.com']); //查询表记录并返回ORM模型对象

if(!$user->allow('manage_user')){

throw new \Exception('您无法删除用户');

}

//表字段:id,name,email,permissions

//echo $user['name'];

Yii::$app->response->format = \yii\web\Reponse::FORMAT_JSON;

Yii::$app->response->data = $user;

//Yii::$app->response->data = $user->toArray(['id', 'name']); //返回一个包含指定key的数组

则前端收到一个JSON类似这样:

{"id":1,"name":"Jay","email":"admin@xx.com"...}

但要注意,这个对象还不能放在for循环里进行遍历哦!,要用在for循环上就要实现Iterator接口了

相关推荐

Dify-Plus:一个定制化的Dify二开开发

Dify是一个开源平台,专注于大语言模型(LLM)应用的开发。它结合了后端即服务(BaaS)和LLMOps的概念,致力于为开发者提供高效工具,使其能够快速构建并部署生产级的生成式AI应用。在...

部署dubbo运维平台dubbo-admin(最新版)

dubbo服务注册到注册中心之后,有一个工具可以使我们方便的管理服务,比如查看服务是否注册成功,修改负载均衡策略,修改接口权重,配置路由规则,服务接口文档生成,服务测试,服务调用统计过等功能,这...

niucloud-admin应用和插件的区别是什么?

应用和插件的区分通常的,我们可以把业务相对独立的一个完整的功能,开发为插件。开发插件的好处是系统具有非常好的扩展性。基于niucloud-admin框架体系而言,我们一般的把一个功能单元定义为两个类型...

基于 Vue3 / Vite / Pinia 等主流技术栈打造的免费开源中后台管理系统

有一段时间没有推荐admin管理系统了,今天推荐一个完整度很高,教程详细,很容易上手的admin框架。关于PureAdminPureAdmin是一款开源免费且开箱即用的中后台管理系统模...

C# 开发 NET8.0 Blazor Admin 管理系统

BlazorAdmin管理系统软件使用C#开发NET8.0VS2022使用体验地址http://ba.4je.cn/登录Admin:123789框架文件结构名称说明类Plugins插件...

FastAdmin 任意文件读取漏洞,利用方法异常简单,一条命令就可以

2025年了,没有修补这个漏洞的网站估计依然有百分之四十以上,成功率极高。CVE-2024-7928指的是FastAdmin框架中存在的一个路径遍历(PathTraversal)漏洞。该漏洞允...

【推荐】一款 100% 开源无加密、前后端分离的商城系统

如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!项目介绍NIUSHOPV6是一款基于NIUCLOUD-ADMIN底层框架设计的企业级应用软件系统,专注于商城系...

「补发」基于Furion/.NET开发的前后端分离通用管理平台

昨天说到了小诺VUE美中不足今天补发一个后端使用.net前端使用VUE开发的框架Admin.NET前后端分离架构,开箱即用,紧随前沿技术概述基于.NET5实现的通用管理平台。整合最新技术,模块...

2025年流行admin前端框架展望(web前端流行框架)

一、Vite的核心设计:重新定义前端开发范式Vite的核心理念是**“无打包开发”**,通过原生ES模块(ESM)实现按需编译,彻底解决了传统打包工具(如Webpack)在大型项目中启动和热更新慢的问...

Google Test开发者使用指南:打造高质量C++测试的必备工具

1.GoogleTest简介GoogleTest(简称gtest)是由Google开发的一个开源C++测试框架,它提供了丰富的测试工具和断言机制,使开发者能够轻松编写结构化的单元测试。作为业界最...

JUnit5:Java单元测试框架的新宠儿

JUnit5:Java单元测试框架的新宠儿嘿!今天咱们来聊聊JUnit家族的最新成员——JUnit5。这可是Java开发者们翘首以盼的一次升级,它不仅带来了更强大的功能,还彻底改变了我们编写和运行单元...

Github 10.1K star,突破 Web 自动化瓶颈,小白亦能成测试大神!

SeleniumBase是一款全功能的浏览器自动化框架,专为Web测试、爬虫、数据抓取和"隐身"操作设计。它构建在SeleniumWebDriver的基础上,但提供了更简洁的API和...

鸿蒙操作系统的核心组件(三):驱动框架

HarmonyOS驱动框架(HDF,HardwareDriverFoundation)是HarmonyOS/OpenHarmony生态中实现硬件设备统一管理的核心组件。它以跨平台、弹性化架构为核心...

NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

本文共同第一作者为新加坡国立大学博士生铁宸睿和多伦多大学研究助理/本科生孙圣翔。合作者为朱锦轩、刘益伟、郭京翔、胡越、陈浩楠、陈俊廷、吴睿海。通讯作者为新加坡国立大学计算机学院助理教授邵林,研究方向为...

首个多模态扩散大语言模型MMaDA发布,同时实现强推理与高可控性

近年来,大型语言模型(LLM)在多模态任务中展现出强大潜力,但现有模型在架构统一性与后训练(Post-Training)方法上仍面临显著挑战。传统多模态大模型多基于自回归(Autoregressive...

取消回复欢迎 发表评论: