概述

以下是百度百科对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. vue中Enter触发登录事件和javascript中Enter触发点击事件

    created(){ window.addEventListener('keydown', this.handleKeyDown, true)//开启监听键盘按下事件 } 在methods中当keyC ...

  2. WPF数据可视化-趋势图

    环境: 系统: Window 7以上: 工具:VS2013及以上. 研发语言及工程: C# WPF 应用程序 效果: ​ ​ 简介: 不需要调用第三方Dll, 仅仅在WPF中使用贝塞尔曲线,不到500 ...

  3. 微信wxid搜索用户不存在,怎么加好友?

    点击上方↑↑↑蓝字[协议分析与还原]关注我们 " 根据wxid微信号找到用户的方法及周边资料大全." 最近经常会收到好友请求的消息提醒,但却不是通过搜索好友和群聊来添加的,因此研究 ...

  4. JS Navigator

    JS Navigator window.navigator 对象包含有关访问者浏览器的信息. Window Navigator window.navigator 对象在编写时可不使用 window 这 ...

  5. MySQL数据库:子查询的应用

    子查询 子查询是一种常用计算机语言SELECT-SQL语言中嵌套查询下层的程序模块.当一个查询是另一个查询的条件时,称之为子查询. # 子查询的用法 # 在字段 select (select cNam ...

  6. selenium原理应用 - 利用requests模拟selenium驱动浏览器

    前言 selenium是一个web自动化测试的开源框架,它支持多语言:python/java/c#… 前面也有一篇文章说明了,selenium+浏览器的环境搭建. selenium支持多语言,是因为s ...

  7. 计算机网络知识之TCP/IP协议簇

    OSI参考模型 OSI的来源         OSI(Open System Interconnect),即开放式系统互联. 一般都叫OSI参考模型,是ISO(国际标准化组织)组织在1985年研究的网 ...

  8. 从壹开始[做贡献]之二 || 推荐VSCode多语言开发,支持一键JAVA

    缘起 哈喽大家周一好!好久不见鸭,最近在看一本书,很好,<人类简史>,适合夏日星空,仰观宇宙之大

  9. C语言程序设计100例之(24):数制转换

    例24   数制转换 题目描述 请你编一程序实现两种不同进制之间的数据转换. 输入格式 共三行,第一行是一个正整数,表示需要转换的数的进制n(2≤n≤16),第二行是一个n进制数,若n>10则用 ...

  10. 织女星开发板启动模式修改——从ARM M4核启动

    前言 刚开始玩织女星开发板的时候,想先从熟悉的ARM核入手,连上Jlink,打开MDK版本的Demo程序,编译OK,却检测不到芯片,仔细看了一下文档,原来RV32M1芯片默认从RISC-V核启动,如果 ...