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

相关文章

Spring Cache注解@Cacheable的九个属性详解

《SpringCache注解@Cacheable的九个属性详解》在@Cacheable注解的使用中,共有9个属性供我们来使用,这9个属性分别是:value、cacheNames、key、key... 目录1.value/cacheNames 属性2.key属性3.keyGeneratjavascriptor

Spring Boot 事务详解(事务传播行为、事务属性)

《SpringBoot事务详解(事务传播行为、事务属性)》SpringBoot提供了强大的事务管理功能,通过@Transactional注解可以方便地配置事务的传播行为和属性,本文将详细介绍Spr... 目录Spring Boot 事务详解引言声明式事务管理示例编程式事务管理示例事务传播行为1. REQUI

Python Selenium动态渲染页面和抓取的使用指南

《PythonSelenium动态渲染页面和抓取的使用指南》在Web数据采集领域,动态渲染页面已成为现代网站的主流形式,本文将从技术原理,环境配置,核心功能系统讲解Selenium在Python动态... 目录一、Selenium技术架构解析二、环境搭建与基础配置1. 组件安装2. 驱动配置3. 基础操作模

慢sql提前分析预警和动态sql替换-Mybatis-SQL

《慢sql提前分析预警和动态sql替换-Mybatis-SQL》为防止慢SQL问题而开发的MyBatis组件,该组件能够在开发、测试阶段自动分析SQL语句,并在出现慢SQL问题时通过Ducc配置实现动... 目录背景解决思路开源方案调研设计方案详细设计使用方法1、引入依赖jar包2、配置组件XML3、核心配

springboot使用Scheduling实现动态增删启停定时任务教程

《springboot使用Scheduling实现动态增删启停定时任务教程》:本文主要介绍springboot使用Scheduling实现动态增删启停定时任务教程,具有很好的参考价值,希望对大家有... 目录1、配置定时任务需要的线程池2、创建ScheduledFuture的包装类3、注册定时任务,增加、删

SpringBoot基于配置实现短信服务策略的动态切换

《SpringBoot基于配置实现短信服务策略的动态切换》这篇文章主要为大家详细介绍了SpringBoot在接入多个短信服务商(如阿里云、腾讯云、华为云)后,如何根据配置或环境切换使用不同的服务商,需... 目录目标功能示例配置(application.yml)配置类绑定短信发送策略接口示例:阿里云 & 腾

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 属性,用于告诉浏览器某个元素在未来可能会发生哪些变化。这可以帮助浏览器优化