概述

以下是百度百科对php中的 stdClass的描述:

stdClass在PHP5才开始被流行。而stdClass也是zend的一个保留类。stdClass类是PHP的一个内部保留类,初始时没有成员变量也没成员方法,所有的魔术方法都被设置为NULL.凡是用new stdClass()的变量,都不可能会出现$a->test()这种方式的使用。PHP5的对象的独特性,对象在任何地方被调用,都是引用地址型的,所以相对消耗的资源会少一点。在其它页面为它赋值时是直接修改,而不是引用一个拷贝。

在百度上搜索,有很多人写的文章中,提到了stdClass是所有类的基类,但是我试了一下:

class Test{}
$t = new Test();
var_dump($t instanceof stdClass);

输出结果:bool(false)

显然,stdClass并不是Test的基类,也就是说stdClass不是所有类的基类。

那么stdClass到底是个什么呢?到底是干什么用的呢?

解惑

既然这个类没有成员变量也没有审核魔术方法,那么stdClass到底是个什么玩意?

$a = new stdClass();
$a->username = 'a';
$a->email = 'qq';
var_dump($a);

结果输出:

class stdClass#1 (2) {

public $username =>

string(1) "a"

public $email =>

string(2) "qq"

}

显然,这完全就是个数据啊。

那么它和数组的区别是什么?我看到晚上一些人是这样解释的,以下代码

$a = new stdClass();
$b = $a;

这样 a b两个变量公用一个内存,$b=$a; 是引用赋值,而如果是数组的话,会拷贝整个数组对象。

但是,忘了取址符号了么? $b=&$a , 同样也是引用赋值啊?有什么区别么? 显然,以上说法并没有说服我,stdClass 类的作用是什么呢?它存在的意义在哪里?

等等,引用传递?不需要使用取址符号?这不就完全可以在方法的参数和全局变量中使用么?

当然,在方法的参数中传递数组,在形参中使用 &$a 也可以达到引用传递的效果,但如果函数没有使用取址符号,传递的时候就会复制一份,浪费内存。但是,同时也要承担对应的风险,复制数组的方法固然浪费了内存,但是无论方法内对数组如何操作,都不会反应到外边的数组中。如果使用 stdClass 类就不一样了,你传进去了,就要做好出来的时候属性面目全非的准备。

全局变量, 如果在某个静态方法S中定义一个全局变量,这个变量向所有人提供,这时使用数组就很不地道了。你在方法a中获取了对象,并设置了对象的属性,以便于在后边使用。在之后的方法b中再次获取此对象,如果你使用的是数组,那么尴尬了,调用方法S返回的数组,对其修改只是对局部变量的数组进行了修改,并没有达到想要的效果。如果方法S返回的是stdClass对象,那就完全没有问题了啊。

举个栗子:

class Test{
private static $user = [];
public static function getUser(){
return self::$user;
}
}
$a = Test::getUser();
$a['username'] = 'name';
$b = Test::getUser();
var_dump($b);

结果输出:

array(0) {

}

这时,使用stdClass,效果完全不同:

class Test{
private static $user = null;
public static function getUser(){
if(self::$user === null){
self::$user = new stdClass();
}
return self::$user;
}
}
$a = Test::getUser();
$a->username = 'name';
$b = Test::getUser();
var_dump(get_object_vars($b));

输出结果:

array(1) {

'username' =>

string(4) "name"

}

完美~~

stdClass 对于这种向全局提供的属性再适合不过了,其实也可以使用一个单例类来实现同样的方法,但是显然使用stdClass更加灵活,也更加简洁。

可以使用 get_object_vars($a) 方法讲stdClass对象转成数组,该方法会讲对象的属性转成数组。


至此,我也想到了stdClass的应用场景。

我相信它还有更多的应用场景,毕竟是直接引用赋值,会对对象直接修改。但是我目前还没有想到更好的应用场景,唉,才疏学浅。

各位,告辞!!

PHP的stdClass的更多相关文章

  1. php stdclass转数组

    打印输出是这样 object(stdClass)[11] //object public 'xx' => string 'xxxxxx' (length=21)可用函数处理 get_object ...

  2. PHP5中的stdClass

    PHP5中新增stdClass 官方手册参考:http://www.php.net/manual/en/language.oop5.basic.php#92123 stdClass类是PHP的一个内部 ...

  3. php如何遍历多维的stdClass Object 对象,php的转换成数组的函数只能转换外面一丛数组

    php如何遍历多维的stdClass Object 对象,php的转换成数组的函数只能转换外面一丛数组 (2012-09-10 19:58:49) 标签: 杂谈 分类: 网页基础知识 php如何遍历多 ...

  4. PHP“Cannot use object of type stdClass as array” (php在调用json_decode从字符串对象生成json对象时的报错)

    php再调用json_decode从字符串对象生成json对象时,如果使用[]操作符取数据,会得到下面的错误 错误:Cannot use object of type stdClass as arra ...

  5. PHP json_decode object时报错Cannot use object of type stdClass as array

    PHP json_decode object时报错Cannot use object of type stdClass as array php再调用json_decode从字符串对象生成json对象 ...

  6. php stdClass Object 问题

    Array ( [0] => stdClass Object ( [term_id] => 3 [name] => apache [slug] => apache [term_ ...

  7. php的stdClass类

    在PHP内核进行模块初始化操作时会自动加载这个函数, 这样,stdClass类的注册操作也就会被执行了.stdClass类是一个没有成员变量也没有成员方法的类. 它的所有的魔术方法,父类.接口等在初始 ...

  8. PHP中遍历stdclass object 及 json 总结[中国航天神舟十号以json形式向地面返回数据]

    $test=Array ( [0] => stdClass Object ( [tags] => 最快的车,Bloodhound,SSC [id] => 48326888 11 从网 ...

  9. PHP中遍历stdclass object 及 json

    原文:PHP中遍历stdclass object 及 json (从网上找的模拟实例)需要操作的数据: $test=Array ( [0] => stdClass Object ( [tags] ...

  10. php stdClass类的用法

    stdClass是PHP的一个基类,所有的类几乎都继承这个类,所以任何时候任何地方都可以被new,可以让这个变量成为一个object.同时,这个基类又有一个特殊的地方,就是没有方法.凡时用new st ...

随机推荐

  1. Jmeter性能测试分布式技术

    一.什么是分布式测试 分布式测试是指通过局域网和Internet,把分布于不同地点.独立完成特定功能的测试计算机连接起来,以达到测试资源共享.分散操作.集中管理.协同工作.负载均衡.测试过程监控等目的 ...

  2. JavaWeb学习——web.xml文件说明

    JavaWeb学习——web.xml文件说明 摘要:本文主要学习了web.xml文件的作用以及如果配置. 是什么 web.xml文件是用来在JavaWeb项目里面初始化配置信息的,比如:访问的首页.S ...

  3. SpringBoot集成swagger2.0

    最近项目里要用到SpringBoot + swagger,查了其他小伙伴们的资料,或多或少有点问题,在此我再梳理一遍. 1.maven依赖 <parent> <groupId> ...

  4. SpringCloud(八):springcloud遇到的坑总结

    spring boot 版本演信息: 文章链接:https://github.com/spring-projects/spring-boot/releases?after=v2.0.0.M3 http ...

  5. 探索Dynamics 365 用户能够登录使用的最小权限需求

    我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...

  6. SQL Server解惑——为什么你的查询结果超出了查询时间范围

    废话少说,直接上SQL代码(有兴趣的测试验证一下),下面这个查询语句为什么将2008-11-27的记录查询出来了呢?这个是同事遇到的一个问题,个人设计了一个例子. USE AdventureWorks ...

  7. 设置自动获取IP和DNS

    问题阐述 设置ipv4的自动获取时遇到一个问题,ip和dns自动获取可以确认设置,但是全局时就是报错,回头去看ipv4的ip和dns也还是原来的样子 由于一直使用的都是自动获取,很少会有主动设置ip或 ...

  8. Python语法速查:目录

    1. 数据类型与内置函数 2. 列表.元组.字典.集合操作 3. 字符串格式化 4. 字符串常用操作 5. 运算符.math模块.表达式 6. 循环与迭代 7. 函数基础 8. 类与对象 9. 函数进 ...

  9. R-5 相关分析-卡方分析

    本节内容: 1:相关分析 2:卡方分析 一.相关分析 相关系数: 皮尔逊相关系数:一般用来计算两个连续型变量的相关系数. 肯德尔相关系数:一个连续一个分类(最好是定序变量) 斯皮尔曼相关系数:2个变量 ...

  10. Ubuntu16.04 GTX750安装CUDA9.0,Pytorch,Anaconda教程

    Ubuntu16 GTX750安装CUDA9.0,Pytorch,Anaconda教程 安装前警告 不要使用Ubuntu18! 不要使用Ubuntu18! 不要使用Ubuntu18! 务必重装成Ubu ...