概述

以下是百度百科对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“Cannot use object of type stdClass as array”

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

  2. php 读取stdclass,json - 在php中读取stdclass的问题?

    例如: array(3) { [0]=> object(stdClass)#6 (2) { ["id"]=> string(1) "1" [&quo ...

  3. php类对象无法转还子符串问题,php – 类stdClass的对象无法转换为字符串

    我目前遇到PHP问题,我收到此错误, 无法将类stdClass的对象转换为字符串,当我在我的站点中运行此部分代码时,会发生错误, function myaccount() { $data['user_ ...

  4. PHP5中的stdClass

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

  5. 无法将stdClass类型的对象用作数组?

    本文翻译自:Cannot use object of type stdClass as array? I get a strange error using json_decode() . 我使用js ...

  6. PHP中把stdClass Object转array的几个方法

    2019独角兽企业重金招聘Python工程师标准>>> 方法一: //PHP stdClass Object转array function object_array($array) ...

  7. php引用类失败,php – 致命错误:调用未定义的方法stdClass

    我得到一个错误说 Fatal error: Call to undefined method stdClass::mysql_con() in ---./-/includes/script/impor ...

  8. php 文件迭代对象,通过PHP中的stdClass对象进行迭代

    我有一个这样的对象: stdClass Object ( [_count] => 10 [_start] => 0 [_total] => 37 [values] => Arr ...

  9. php stdclass,php – 处理stdClass对象

    谷歌搜索了一段时间后,我发现我可以使用此代码进行谷歌搜索: $text=$_GET['text']; $results=file_get_contents("http://ajax.goog ...

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

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

最新文章

  1. 世博会、新三国、新红楼
  2. DHCP服务器的搭建
  3. 【iOS与EV3混合机器人编程一系列五个】iOS_WiFi_EV3_Library 解剖连接EV3
  4. C语言输出素数简单,for语句计算输出10000以内最大素数怎么搞最简单??各位大神们...
  5. java优先队列PriorityQueue修改队列内元素排序问题
  6. fetch + async await 使用原生JS发送网络请求
  7. NLP分析小说人物关系,找找主人公的真爱。
  8. python getchar功能_getchar函数
  9. Navigation Drawer介绍
  10. 世界上最震撼的地质景观,你认识多少?
  11. (十九)java多线程之ForkJoinPool
  12. identifier __ldg is undefined
  13. IDirect3DDevice9::SetClipPlane
  14. 做一个聪明的前端开发者
  15. cisco交换机MAC/CAW***防范
  16. FLASH+XML:构建简单易更新网站
  17. Win7电脑遇到蓝屏,并报错:IRQL NOT LESS OR EQUAL
  18. C# 原始的方法写入xml文件的代码
  19. 『转』VC 开机自动启动程序代码
  20. [P1919 【模板】A*B Problem升级版(FFT快速傅里叶)(高精乘板子,FFT板子)

热门文章

  1. 使用Eclipse进行Makefile项目
  2. [前台]---js+jquery校验姓名,手机号,身份证号
  3. 现代软件工程 作业 2 结对项目
  4. android设备报警推送,Firebase推送通知未送达所有android设备
  5. php 分布式数据库查询,分布式数据库
  6. docker portainer_「实战篇」开源项目docker化运维部署-Portainer管理集群部署(十)...
  7. python处理字典的方法_python字典的常用操作方法小结
  8. jsp工程防止外部注入_XPATH注入详解|OWASP Top 10安全风险实践(五)
  9. 【LeetCode笔记】117.填充每个节点的下一个右侧节点指针 II(二叉树、DFS)
  10. 【LeetCode笔记】17.电话号码的字母组合(Java、DFS)