首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

理解PHP中的stdClass类

相信大家跟我一样,会经常看到和下面很类似的PHP代码: 复制代码 $user = new stdClass(); $user->name = 'gouki'; 这样的代码,这是干嘛用的呢?...或者,我们可以又这么理解一下,正因为PHP5的对象的独特性,对象在任何地方被调用,都是引用地址型的,所以相对消耗的资源会少一点。在其它页面为它赋值时是直接修改,而不是引用一个拷贝。...所以,在PHP4的时候,都是这样使用: 复制代码 $myUser = & $user; 有人说,为什么不用数组呢?数组不是更方便吗?而且对于PHP这样的弱类型程序来说,用数组应该是最方便的。 确实。...数组在程序的使用中应该是最方便的,然而数组的每次被引用($a = $b),其实都是创建了一个副本,而且,数组被unset后,还是占用了内存(这个是听人说来的,我没有测试……也不知道怎么测试,如果有人知道...,请告诉我,谢谢 ) 不过SPL的标准类库里,还有一个函数arrayobject,可以直接将数组转化为对象这也是一个好办法哦。

1.1K90

3分钟短文 | PHP 空对象怎么用,3个例子教会你!

引言 我们已经习惯在框架里编写类库接口,使用面向对象的方式构建规模以上的应用程序。但是还有很多机会,时时刻刻与PHP数组打交道。 ? PHP版本迭代并加入的对象操作特性非常丰富。...PHP中自带了 stdClass 对象,声明空对象使用下面的方法: $x = new stdClass(); stdClass是默认的PHP对象。stdClass没有属性,方法或父级。...当将标量或数组转换为Object时,将获得stdClass的实例。只要需要通用对象实例,就可以使用stdClass。...所有类都是独立的,除非它们显式扩展了另一个类。在这方面,PHP与许多面向对象的语言不同。 你无法在代码中定义名为“ stdClass”的类。该名称已被系统使用。你可以定义一个名为“Object”的类。...也可以定义一个扩展stdClass的类,但不会获得任何好处,因为stdClass不执行任何操作。

61230
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    PHP系列 | PHP中的stdClass是什么?

    简介 stdClass 是 PHP 中的空类,用于将其他类型转换为对象。它类似于 Java 或 Python 对象。...stdClass 不是对象的基类 转换为对象 如果将一个对象转换成对象,它将不会有任何变化。如果其它任何类型的值被转换成对象,将会创建一个内置类 stdClass 的实例。...如果该值为 null,则新的实例为空。 array 转换成 object 将使键名成为属性名并具有相对应的值。注意:在这个例子里, 使用 PHP 7.2.0 之前的版本,数字键只能通过迭代访问。...stdClass 类的使用 1、存储数据 (1)数组存储 // 定义数组存储个人信息 $personal_array = [ "name" => "Tinywan", "home" =>...[address] => ZheJiang HangZhou ) 注意:数组到对象和对象到数组的类型转换是可能的。

    17410

    浅谈PHP8中的类型定义以及几个新特性

    随着PHP8的发布,作为动态类型语言的PHP也有了更大的进步。 此处浅谈一下PHP8中的类型定义以及几个新特性 本文仅介绍重点,详细内容可以参考 PHP 官方。...array 数组 [“hello”, “world”, 2, 0.1] object 对象 new Example(), (object) [‘hello’ => ‘world’] resource 资源...也可以不写 return } myFirstFunc(); // helloworld 范例:两字符串相加,回传字符串类型,第二个自变量预设 null,表示可以不传入。...请注意,mixed也可以用作参数或属性类型,而不仅仅是作为返回类型。 另请注意,由于mixed已包含null,因此不允许使其为空(nullable)。...->country; 对象获取类名 $object = new stdClass; var_dump($object::class); // "stdClass" static return type

    45710

    PHP的stdClass

    stdClass类是PHP的一个内部保留类,初始时没有成员变量也没成员方法,所有的魔术方法都被设置为NULL.凡是用new stdClass()的变量,都不可能会出现$a->test()这种方式的使用。...PHP5的对象的独特性,对象在任何地方被调用,都是引用地址型的,所以相对消耗的资源会少一点。在其它页面为它赋值时是直接修改,而不是引用一个拷贝。...我看到晚上一些人是这样解释的,以下代码 $a = new stdClass(); $b = $a; 这样 a b两个变量公用一个内存,$b=$a; 是引用赋值,而如果是数组的话,会拷贝整个数组对象。...在之后的方法b中再次获取此对象,如果你使用的是数组,那么尴尬了,调用方法S返回的数组,对其修改只是对局部变量的数组进行了修改,并没有达到想要的效果。...可以使用 get_object_vars($a) 方法讲stdClass对象转成数组,该方法会讲对象的属性转成数组。 至此,我也想到了stdClass的应用场景。

    1.2K10

    优雅地创建未定义类PHP对象

    优雅地创建未定义类PHP对象 在PHP中,如果没有事先准备好类,需要创建一个未定义类的对象,我们可以采用下面三种方式: new stdClass() new class{} (object)[] 首先是...1$b = new class{ 2 public $p = 1; 3}; 4var_dump($b); 最后我们来看到的是使用数组强转成对象的形式来生成一个对象。...1$c = (object)[ 2 'p' => 1 3]; 4var_dump($c); 很明显,数组强转的形式生成的对象和第一种对象是一个类型的,而且它可以带属性也可以不带。...数组强转方式生成的对象非常的直观好理解。如果只是属性对象的封装,使用这种方式会更加地优雅舒服。复杂的对象生成可以使用匿名类的方式进行生成。...而一些仅需要占位的对象,可以使用stdClass的方法,当然用空数组的方式也很方便。 需要注意的是,数组强转需要遵守类型转换的规则。比如数字下标的问题。

    2.8K10

    php的八种基本数据类型

    ; var_dump((bool)$h);//空字符串,或者字符串0,bool输出为false $arry=[]; var_dump((bool)$arry);//没有内容的数组,输出为false $num...任何具有 string 表达的标量变量,数组单元或对象属性都可使用此语法。只需简单地像在 string 以外的地方那样写出表达式,然后用花括号 { 和 } 把它括起来即可。...注意:数组顺序也是从0开始。 对象(object) 语法: $变量名=new stdclass(); 代码演示: <?...php $a=new stdclass();//对象初始化(object) var_dump($a);//输出a的数据类型,显示为object(stdClass)#1 (0) { },对象输出类型 ?...> 两种特殊类型: resource(资源) 由于资源类型变量保存有为打开文件、数据库连接、图形画布区域等的特殊句柄,因此将其它类型的值转换为资源没有意义。 例子: 代码如下: <?

    1.3K20

    PHP的SPL扩展库(一)数据结构

    在堆中,有大顶堆和小顶堆的概念,SPL 也为我们分别提供了这两种实现。...在 PHP 中,数组这个结构非常强大,它即可以是普通下标类型的数组,也可以 HashMap键值对 形式的数组,它的长度也是不受限制的,只要内存够就可以灵活地处理数组的长度。...它也可以直接从一个普通数组转换过来,不过需要注意的是,转换数组必须是数字下标类型的数组,字符串键的 HashMap 数组是不可以的哦。...最简单直接的理解其实就是把一个对象当成是 【键】,然后以这些键形成一个数组结构。...其中比较特别的是 detach() 方法是删除数据的,getHash() 则是获取这个对象在存储集合中的 Hash 值的,这个值也可以看做是这个对象在这个对象映射集合中的下标,我们其它的针对对象的操作判断其实是都是在内部转换成这个数组下标来进行操作的

    1K40

    PHP 引用是个坑,请慎用

    其主要目的是遵循『面对对象模式』:对象传参给函数或者方法后,这个函数发送一个指令给对象(例如调用了一个方法)以此来改变对象的状态(例如对象的属性)。因此传参进去的对象必须为同一个。...这很容易被误解为『引用』,但是『存储器的引用』与『引用』是完全不同的概念。下面的示例代码有助于我们更好地区分: <?...php // 创建一个对象和此对象的引用变量 $a = new stdclass; $b = $a; $c = &$a; // 对『对象』进行操作 $a->foo = 42; var_dump($a-...但是在最后区块的代码中,当我们修改 a 的类型时,引用的 c 发生了变化,而复制得到的变量 另一个人们使用『引用』的理由是 —— 这将让代码更快。...在 PHP 中,同一个函数可以返回不同数据类型。—— 因此,你可以在函数执行成功时返回一个字符串,而在失败时返回一个布尔值 false,PHP 也允许返回复杂的结构类型,比如数组和对象。

    1.2K20

    PHP 魔术方法、序列化与对象复制

    这是序列化字符串的结构分析,我们可以看到其中包含了序列化前变量的类型和所属的类名,因此,在通过 unserialize 方法进行反序列化时,实际上是通过序列化字符串中的类名对这个类进行实例化,如果当前作用域下恰好包含了该类的定义...而如果当前作用域下没有包含对应的类定义,也无法通过命名空间找到对应的类,则反序列化后的对象仅仅包含保存在序列化字符串中的属性,无法调用任何原来的对象方法,比如我们在一个不包含 Car 类定义的 php_learning...不可访问有两层意思,一层是属性的可见性不是 public,另一层是对应属性压根不存在,以 __set() 和 __get() 为例,在 magic.php 中,我们为 Car 新增保护属性 brand:...,需要借助一个额外的存储空间 data 数组,当我们设置不可见属性或者不存在属性时,会将其存储到 data 数组,然后在读取时从数组中获取即可: $car = new Car(); $car->brand...说到这里,我们先简单介绍下对象复制,与基本类型和数组不同,PHP 对象默认情况下通过引用传递(前者是值传递),因此,当我们将一个对象 A 赋值给另一个对象 B 时,B 的属性值修改会同步到对象 A,我们通过

    1.9K41

    彻底搞明白PHP的中引用的概念

    这也是现代语言的特性,不需要我们过多的关注过于底层的能力,而将更多的时间放在业务实现上。 引用在数组和对象中的使用 如果具有引用的数组被拷贝,其值不会解除引用。对于数组传值给函数也是如此。...在复制时没有引用的元素,以及在复制数组后分配给其他元素的引用,将正常工作(即独立于其他数组)。 不仅仅是数组,对象的引用也会有一些好玩的问题。...["a"]=> // string(2) "aa" // } var_dump($o3); // $o2修改了$a为'aa',$o3也变成了'aa' // object(stdClass)#1 (...)#1 (1) { // ["a"]=> // string(3) "aaa" // } 上面例子中有三个对象,$o1、$o2、$o3,其中,$o2是对$o1的引用,$o3是直接赋值为$o1。...引用的传递 关于引用在方法参数上的传递,最重要的是记住两点:一是方法内部修改了变量外部也会变,这是引用的特性嘛;二是只能传递变量、New 语句、从函数中返回的引用三种类型。

    62530

    从反序列化到类型混淆漏洞——记一次 ecshop 实例利用

    ---- 前几天偶然看到了一篇在Hackerone上提交的漏洞报告,在这个漏洞中,漏洞发现者提出了很有趣的利用,作者利用GMP的一个类型混淆漏洞,配合相应的利用链可以构造mybb的一次代码执行,这里我们就一起来看看这个漏洞...因此,攻击者可以将**object转化为整数型或者bool型的ZVAL,那么我们就可以通过Z_OBJ_P访问存储在对象储存中的任何对象,这也就意味着可以通过zend_hash_copy覆盖任何对象中的属性...)#3 (1) { ["aa"]=> int(2) } object(stdClass)#4 (0) { } 我成功修改了第一个声明的对象。...)#3 (1) { ["aa"]=> int(2) } object(stdClass)#4 (0) { } 但如果我们把ryat改为4,那么页面会直接返回500,因为我们修改了没有分配的对象空间...https://hackerone.com/reports/198734 这里我们不继续讨论这个漏洞,而是从头讨论一下在ecshop中的利用方式。

    1.2K30

    PHP 8 所有新特性一览和代码示例

    新增对联合类型的支持 联合类型允许一个变量拥有多个类型的值,而不是一个(参考 C 语言的联合类型很好理解)。 我们编写一段示例代码如下: 数组中做同样的事情,则仍然会持有该对象的引用,从而导致内存泄露。 我们编写一段示例代码如下: 类型,则会抛出该异常,在 PHP 8 之前,这样的操作会导致警告。 下面是示例代码: <?...php declare(strict_types=1); /** * 传递数组到 array_rand,类型正确,但是 array_rand 期望传入的是非空数组 * 所以会抛出 ValueError...-> 的支持 当该运算符的左侧评估为 null 时,整个代码链路的执行将会被终止并整体评估为 null。如果不为 null 的话,则和普通的 -> 运算符功能一致: <?

    1.2K61

    为何说PHP引用是个坑,要慎用

    其主要目的是遵循『面对对象模式』:对象传参给函数或者方法后,这个函数发送一个指令给对象(例如调用了一个方法)以此来改变对象的状态(例如对象的属性)。因此传参进去的对象必须为同一个。...php // 创建一个对象和此对象的引用变量 $a = new stdclass; $b = $a; $c = &$a; // 对『对象』进行操作 $a->foo = 42; var_dump...但是在最后区块的代码中,当我们修改 $a 的类型时,引用的 $c 发生了变化,而复制得到的变量 $b 不会发生改变,这是个大多数有面对对象经验的工程师所期待的。...但现在另一个问题是,案例中的这个开发者为了节省时间,传递了一个引用作为参数以显示自己的聪明。...—— 因此,你可以在函数执行成功时返回一个字符串,而在失败时返回一个布尔值 false,PHP 也允许返回复杂的结构类型,比如数组和对象。所以在需要返回很多东西的时候,可以将他们打包在一起。

    53920

    Laravel中的容器参考

    背景 惯例介绍下容器的背景,回答第一个问题:什么是容器? 顾名思义,容器即存放东西的地方,里面存放的可以是文本、数值,甚至是对象、接口、回调函数。 那通过容器,解决了什么问题呢?...了解了依赖注入,下面就到了我们今天的重点依赖反转。 3. 依赖反转 上面客户端在使用的时候,还是需要手动的创建OrderMysqlRepository,有没有可能将这个创建的逻辑也从客户端抽离出来呢?...看下面的代码 class Container { protected $binds; protected $instances; public function bind($...我们可以看到IoC核心就是通过事先将一些代码片段注册到容器中,当我们需要实例化类的时候,通过容器,自动的将对象需要的参数实例化出来,并注入进去。 4....this, $parameters); } $reflector = new ReflectionClass($concrete); 4.1.2 instance instance是将我们已经实例化出来的对象

    46320
    领券