具有动态属性支持的通用空类: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

相关文章

MySQL中动态生成SQL语句去掉所有字段的空格的操作方法

《MySQL中动态生成SQL语句去掉所有字段的空格的操作方法》在数据库管理过程中,我们常常会遇到需要对表中字段进行清洗和整理的情况,本文将详细介绍如何在MySQL中动态生成SQL语句来去掉所有字段的空... 目录在mysql中动态生成SQL语句去掉所有字段的空格准备工作原理分析动态生成SQL语句在MySQL

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

CSS will-change 属性示例详解

《CSSwill-change属性示例详解》will-change是一个CSS属性,用于告诉浏览器某个元素在未来可能会发生哪些变化,本文给大家介绍CSSwill-change属性详解,感... will-change 是一个 css 属性,用于告诉浏览器某个元素在未来可能会发生哪些变化。这可以帮助浏览器优化

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

SpringKafka消息发布之KafkaTemplate与事务支持功能

《SpringKafka消息发布之KafkaTemplate与事务支持功能》通过本文介绍的基本用法、序列化选项、事务支持、错误处理和性能优化技术,开发者可以构建高效可靠的Kafka消息发布系统,事务支... 目录引言一、KafkaTemplate基础二、消息序列化三、事务支持机制四、错误处理与重试五、性能优

使用Java实现通用树形结构构建工具类

《使用Java实现通用树形结构构建工具类》这篇文章主要为大家详细介绍了如何使用Java实现通用树形结构构建工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录完整代码一、设计思想与核心功能二、核心实现原理1. 数据结构准备阶段2. 循环依赖检测算法3. 树形结构构建4. 搜索子

浅析CSS 中z - index属性的作用及在什么情况下会失效

《浅析CSS中z-index属性的作用及在什么情况下会失效》z-index属性用于控制元素的堆叠顺序,值越大,元素越显示在上层,它需要元素具有定位属性(如relative、absolute、fi... 目录1. z-index 属性的作用2. z-index 失效的情况2.1 元素没有定位属性2.2 元素处