概述

以下是百度百科对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. STM32F407外部晶体改为25M后检测不到芯片的解决办法

    问题描述 分享一个之前遇到的STM32F4晶体频率问题,导致单片机死机的解决办法.使用一款新的F4开发板,直接使用的正点原子STM32F407工程模板代码,管脚配置正确,下载到外部晶体为25MHz的开 ...

  2. C#版本与.NET版本对应关系以及各版本的特性

    C#版本 .NET版本 发布日期 特性 C# 1.0 .NET Framework 1.0 2002-02-13 委托.事件 C# 1.1 .NET Framework 1.1 2003-04-24 ...

  3. php配置文件说明

    php-fpm.conf是PHP-FPM进程管理器的配置文件: php.ini是PHP解析器的配置文件: www.conf是php.ini的扩展文件

  4. Localize UI Elements 汉化界面(本地化)

    In this lesson, you will learn the basics of localizing visible UI elements. By default, the applica ...

  5. ELK日志分析系统(1)-基本环境搭建

    1. 概述 ELK = Elasticsearch + Logstash + Kibana Elasticsearch是实时全文搜索和分析引擎,提供搜集.分析.存储数据三大功能:是一套开放REST和J ...

  6. 使用Docker Compose 部署Nexus后初次登录账号密码不正确,并且在nexus-data下没有admin,password

    场景 Ubuntu Server 上使用Docker Compose 部署Nexus(图文教程): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/ ...

  7. 龙芯电脑上Electron应用开发

    背景 最近在一台龙芯电脑(系统是中兴新支点,Linux)上开发electron应用. PS:龙芯是国产的cpu,采用是mips架构,类似x86.arm. 安装NodeJS 安装步骤请查看:https: ...

  8. 记,NSProxy需要实现哪些方法?

    转注出:https://www.cnblogs.com/xiaobajiu/p/10799962.html 使用NSProxy做替身,代理,多继承,本质上都是用它来转发消息给真身. 观察头文件,NSP ...

  9. ActiveMQ下载与安装(消息中间件JMS)

    下载 官方网站下载:http://activemq.apache.org/ 1.3.2安装(Linux) (1)将apache-activemq-5.12.0-bin.tar.gz 上传至服务器 (2 ...

  10. [转载]MGR变量group_replication_primary_member

    组复制的状态变量只有一个,目前在8.0.17这个版本上还是存在的,未来会被废弃掉,我们在单主的模式下,可以用来查看哪个节点是读写节点. mysql: [Warning] Using a passwor ...