具有动态属性支持的通用空类:stdClass

2023-10-12 13:12

本文主要是介绍具有动态属性支持的通用空类:stdClass,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 参考
  • 环境
  • stdClass
  • 容器
      • 数组转化为对象
      • 解析 JSON 数据
  • 动态属性
      • 概念
      • \_\_set()
          • \_\_set() 的默认行为
          • 还原 __set() 的默认行为
      • PHP8.2
          • 弃用
          • #[\AllowDynamicProperties] 注解
      • 天然的动态属性支持者 stdClass
          • stdClass 派生类

参考

项目描述
搜索引擎BingGoogle
AI 大模型文心一言通义千问讯飞星火认知大模型ChatGPT
PHP 官方PHP Manual
PHP 官方class.stdclass.php
PHP 官方class.allowdynamicproperties.php
PHP 官方language.oop5.magic.php

环境

项目描述
PHP5.5.05.6.87.0.07.2.57.4.98.0.08.2.9
PHP 编辑器PhpStorm 2023.1.1(专业版)

stdClass

stdClass 是 PHP 提供的一个 基础类,用于创建一个 没有预定义结构的空对象(stdClass 中没有定义任何成员)stdClass 的结构大致如此:

class stdClass {}

stdClass 提供了一种方式,允许开发者 在运行时动态地创建和管理对象属性,而不必预先定义一个完整的类。对此,请参考如下示例:

<?php// stdClass 属于 PHP 的基础类,
// 是 PHP 的一部分,可以直接进行使用。
$myClass = new stdClass();// 在 PHP 运行过程中动态的对属性进行创建与管理
$myClass -> name = "RedHeart";
$myClass -> nation = "BinaryMoon";
$myClass -> nation = "China";print_r($myClass);

执行效果

stdClass Object
([name] => RedHeart[nation] => China
)

容器

在 PHP 内部,stdClass 常作为一个 容器,用于存储 键值对(键值对是一种数据结构,通常用于将一个值与一个唯一标识符或键相关联。在对象中,键可以理解为属性,值可以理解为属性值)。当 PHP 需要为一些操作创建一个对象,但又 不需要特定的类结构时,就会使用 stdClass。

数组转化为对象

在 PHP 中,(object) 是一种 类型转换操作符,它用于 将一个值转换为对象,而转换后的结果对象便是 stdClass 类的实例。对此,请参考如下示例:

<?php# 创建一个关联数组
$arr = ["name" => "RedHeart", "nation" => "China"];# 通过 (object) 类型转化操作符将数组转化为对象
$obj = (object)$arr;print_r($obj);

执行效果

stdClass Object
([name] => RedHeart[nation] => China
)

解析 JSON 数据

当您使用 json_decode 函数尝试将 JSON 格式的字符串解析为对象时,解析成功的结果将为一个 stdClass 类的实例对象。对此,请参考如下示例:

<?php# 定义一个 JSON 格式的字符串
$json_string = '{"name": "RedHeart", "nation": "China"}';# 通过 json_decode 函数解析 JSON 字符串
$obj = json_decode($json_string);print_r($obj);

执行效果

stdClass Object
([name] => RedHeart[nation] => China
)

动态属性

概念

在 PHP 中,动态属性是一种 允许您在运行时向对象添加属性的特性。通常,对象的属性在定义类时就被预先声明,但 PHP 也提供了 动态属性机制,使你能够在不预先定义属性的情况下将它们添加到对象中。

__set()

__set() 是 PHP 中提供的一个 魔术方法(在特定场景中由 PHP 自动调用),用于处理对象的属性赋值。__set() 允许您在尝试访问或设置一个对象的 不存在或不可见属性(即没有直接访问权限的属性)时执行自定义的操作

当您尝试设置一个对象的不存在或不可见属性的属性值时,__set() 方法将会被自动调用。您可以在该方法中定义逻辑来规定如何执行。您必须为 __set() 魔术方法指定两个形参,其中第一个形参将用于接收尝试访问当前对象的不存在或不可见属性的 属性名称,第二个形参将用于接收尝试为该属性设置的 属性值

举个栗子

<?php# 创建一个没有任何成员属性的对象
class MyClass {# 定义 __get() 魔术方法,规定部分属性的访问逻辑function __set($name, $value) {print('Failed to set property value "' . $value . '" for property "' . $name . '".');}
};$myClass = new MyClass();# 尝试对 $myClass 对象中的属性设置属性值
$myClass -> nation = 'China';

执行效果

Failed to set property value "China" for property "nation".
__set() 的默认行为

当你没有明确规定 __set() 的执行逻辑(即没有在类中定义这个方法)并尝试为不存在或不可访问的属性设置属性值时,__set() 魔术方法的默认行为是为当前对象添加该属性并为其设置属性值。对此,请参考如下示例:

<?php$myClass = new stdClass();# 尝试为一个空对象设置属性值
$myClass -> name = "RedHeart";
$myClass -> nation = "China";print_r($myClass);

执行效果

stdClass Object
([name] => RedHeart[nation] => China
)
还原 __set() 的默认行为

我们可以通过定义 __set()复现该函数的默认逻辑,即通过定义 __set() 来实现该函数所提供的 默认功能 —— 为对象提供动态属性支持。对此,请参考如下示例:

<?phpclass MyClass
{# 尝试通过定义 __set() 来支持对象的动他属性功能function __set($name, $value) {# 在对象中,$this 变量指代当前对象$this -> $name = $value;}
}$myClass = new MyClass();$myClass -> name = "RedHeart";
$myClass -> nation = "China";print_r($myClass);

执行效果

MyClass Object
([name] => RedHeart[nation] => China
)

PHP8.2

弃用

自 PHP8.2 开始,PHP 不再支持动态属性功能,即使你通过规定 __set() 来实现动态属性功能,PHP 也将抛出 弃用提示信息。对此,请参考如下示例:

<?phpclass MyClass
{# 尝试通过定义 __set() 来支持对象的动他属性功能function __set($name, $value) {# 在对象中,$this 变量指代当前对象$this -> $name = $value;}
}$myClass = new MyClass();$myClass -> name = "RedHeart";
$myClass -> nation = "China";print_r($myClass);

执行效果

PHP8.2.9 中执行上述代码将得到如下内容:

PHP Deprecated:  Creation of dynamic property MyClass::$name is deprecated in C:\upload.php on line 9
PHP Deprecated:  Creation of dynamic property MyClass::$nation is deprecated in C:\upload.php on line 9
MyClass Object
([name] => RedHeart[nation] => China
)
#[\AllowDynamicProperties] 注解

PHP8.2.0 废弃动态属性机制的同时,PHP 提供了 #[\AllowDynamicProperties] 注解。通过将 #[\AllowDynamicProperties] 注解添加到 类定义之前,将 使得 PHP 支持该类使用动态属性并避免可能产生的 PHP 弃用提示信息的输出。对此,请参考如下示例:

<?php# 添加注解以使得 PHP 为该类提供动态属性机制
#[\AllowDynamicProperties]
class MyClass
{function __set($name, $value) {$this -> $name = $value;}
}$myClass = new MyClass();$myClass -> name = "RedHeart";
$myClass -> nation = "China";print_r($myClass);

执行效果

PHP8.2.9 中执行上述代码将得到如下内容:

MyClass Object
([nation] => China
)

天然的动态属性支持者 stdClass

在 PHP8.2.0 废弃动态属性后,stdClass 类仍旧支持动态属性机制,您并不需要尝试为 stdClass 添加 #[\AllowDynamicProperties] 注解。对此,请参考如下示例:

<?php$myClass = new stdClass();$myClass -> name = "RedHeart";
$myClass -> nation = "China";print_r($myClass);

执行效果

PHP8.2.9 中执行上述代码将得到如下内容:

stdClass Object
([name] => RedHeart[nation] => China
)
stdClass 派生类

通过 将新创建类继承自 stdClass 类,新创建的类也将获得动态属性支持,而无需使用 #[\AllowDynamicProperties] 注解。对此,请参考如下示例:

<?php# 创建一个继承自 stdClass 类的空类
class MyClass extends stdClass {};$myClass = new MyClass;$myClass -> name = "RedHeart";
$myClass -> nation = "China";print_r($myClass);

执行效果

PHP8.2.9 中执行上述代码将得到如下内容:

MyClass Object
([name] => RedHeart[nation] => China
)

这篇关于具有动态属性支持的通用空类:stdClass的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/196077

相关文章

JavaScript中的isTrusted属性及其应用场景详解

《JavaScript中的isTrusted属性及其应用场景详解》在现代Web开发中,JavaScript是构建交互式应用的核心语言,随着前端技术的不断发展,开发者需要处理越来越多的复杂场景,例如事件... 目录引言一、问题背景二、isTrusted 属性的来源与作用1. isTrusted 的定义2. 为

SpringBoot实现动态插拔的AOP的完整案例

《SpringBoot实现动态插拔的AOP的完整案例》在现代软件开发中,面向切面编程(AOP)是一种非常重要的技术,能够有效实现日志记录、安全控制、性能监控等横切关注点的分离,在传统的AOP实现中,切... 目录引言一、AOP 概述1.1 什么是 AOP1.2 AOP 的典型应用场景1.3 为什么需要动态插

Java如何通过反射机制获取数据类对象的属性及方法

《Java如何通过反射机制获取数据类对象的属性及方法》文章介绍了如何使用Java反射机制获取类对象的所有属性及其对应的get、set方法,以及如何通过反射机制实现类对象的实例化,感兴趣的朋友跟随小编一... 目录一、通过反射机制获取类对象的所有属性以及相应的get、set方法1.遍历类对象的所有属性2.获取

VUE动态绑定class类的三种常用方式及适用场景详解

《VUE动态绑定class类的三种常用方式及适用场景详解》文章介绍了在实际开发中动态绑定class的三种常见情况及其解决方案,包括根据不同的返回值渲染不同的class样式、给模块添加基础样式以及根据设... 目录前言1.动态选择class样式(对象添加:情景一)2.动态添加一个class样式(字符串添加:情

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

如何用Python绘制简易动态圣诞树

《如何用Python绘制简易动态圣诞树》这篇文章主要给大家介绍了关于如何用Python绘制简易动态圣诞树,文中讲解了如何通过编写代码来实现特定的效果,包括代码的编写技巧和效果的展示,需要的朋友可以参考... 目录代码:效果:总结 代码:import randomimport timefrom math

vue如何监听对象或者数组某个属性的变化详解

《vue如何监听对象或者数组某个属性的变化详解》这篇文章主要给大家介绍了关于vue如何监听对象或者数组某个属性的变化,在Vue.js中可以通过watch监听属性变化并动态修改其他属性的值,watch通... 目录前言用watch监听深度监听使用计算属性watch和计算属性的区别在vue 3中使用watchE

Java中JSON字符串反序列化(动态泛型)

《Java中JSON字符串反序列化(动态泛型)》文章讨论了在定时任务中使用反射调用目标对象时处理动态参数的问题,通过将方法参数存储为JSON字符串并进行反序列化,可以实现动态调用,然而,这种方式容易导... 需求:定时任务扫描,反射调用目标对象,但是,方法的传参不是固定的。方案一:将方法参数存成jsON字

详解Python中通用工具类与异常处理

《详解Python中通用工具类与异常处理》在Python开发中,编写可重用的工具类和通用的异常处理机制是提高代码质量和开发效率的关键,本文将介绍如何将特定的异常类改写为更通用的ValidationEx... 目录1. 通用异常类:ValidationException2. 通用工具类:Utils3. 示例文