php核心定义了一些保留类型,stdClass就是其中之一。看到网上许多php开发者对这个保留类的认识很模糊,不知道有什么用、怎么用,鉴于此,在这里一起整理分析下。欢迎拍砖提意见。
- 普遍困惑的两点:
stdClass怎么是个空类,里边没有任何成员?
stdClass这个空类有什么用?
- 普遍错误理解的几点:
stdClass是php的顶层基类,其他保留类或自定义类都默认继承stdClass;
继承了stdClass的类可以动态添加属性;
一切php变量都是stdClass的实例。
要正确理解一个架构、框架、设计、技术细节等等,首先得从提出的历史情境出发。
- stdClass的历史情境:
stdClass是php面向对象的产物;
面向对象有些语法特性需要高度抽象支持,stdClass为此而生,未封装任何成员,只是为了保留一份“单纯”,构造一个“单纯”的类对象,告诉开发者:“我只是个空对象,很纯,白纸一张,无污染”。
<?php $arg = 1; $obj = (object)$vag; ?>
<?php $arr = array('name'=>'zxp','gender'=>'男'); $obj = (object)$arr; ?>
<?php $dataSet = mysql_query($query,$link); $dataObj = mysql_fetch_object($dataSet); ?>
以上例子,涉及两步操作:
- 构建一个单纯的对象(stdClass类型);
- 在单纯对象上动态添加属性;
正是为了支持转对象、操作数据、反序列化等等,php需要一个高度抽象的空类,并且可以动态扩展,stdClass做到了。
以上还不足以阐述明白stdClass,再补充以下几点:
- stdClass虽然是高度抽象到空,但是并不能说他是基类、顶层基类。谈基类、父类、或者子类这些说法的基础场景就是继承,谁继承谁,谁被继承,必须有这些前提;stdClass未被其他任何类默认或者隐式继承,目前所有的php版本都没有隐式继承机制,这个不同于.NET平台的System.Object;
- 类对象动态添加属性的特性跟是否继承stdClass没有本质关系。stdClass构建的对象可以动态添加属性,任何自定义类(不继承stdClass)构建的对象也可以动态添加属性;
例:
<?php class Test { public $arg1 = 1; public $arg2 = 'abc'; var $arg3 = 'def'; private function func1() { ; } } $obj = new Test(); $obj->arg4 = 'zxp'; var_dump($obj); ?>
输出:
object(Test)[1] public 'arg1' => int 1 public 'arg2' => string 'abc' (length=3) public 'arg3' => string 'def' (length=3) public 'arg4' => string 'zxp' (length=3)
3. stdClass可以被开发者显式继承,但是这样做没有多大意义。
相关推荐
在PHP5中,`stdClass`是一个特殊的内部保留类,它在PHP的面向对象编程中扮演着特定的角色。尽管它的存在可能会引发一些误解,但理解它的本质和用途对于深入理解PHP的面向对象特性至关重要。 首先,`stdClass`类并...
在PHP编程语言中,stdClass是一个特殊的类,用于创建没有预定义属性或方法的对象。这个类在PHP标准库(SPL)中定义,并且是语言提供的内置功能之一。由于stdClass是一个空类,它提供了一种灵活性,允许开发者在运行...
`stdClass`类在PHP编程语言中扮演着独特的角色,它是一个内部保留的基类,但并非所有类都直接继承自它。尽管在某些解释中提到`stdClass`是所有类的基类,但实际上并非如此。从PHP的源码我们可以更深入地理解这一点。...
而stdClass也是zend的一个保留类。似乎没有其他作用。也几乎没有任何说明。或者,我们可以这么理解:stdClass是PHP的一个基类,所有的类几乎都继承这个类,所以任何时候都可以被new,可以让这个变量成为一个object。...
PHP保留字,也称作关键词(keywords),是PHP编程语言中的特殊词汇,它们被语言内部占用,用于执行特定功能或者用来表示特定的语法结构。保留字对于PHP来说具有特定意义,不能用作变量名、函数名、类名、方法名或...
当`json_decode()`将JSON对象转换为PHP时,它会默认创建一个stdClass对象。如果想要将JSON对象转换为关联数组,可以设置第二个参数为`true`: ```php $json_obj = '{"name":"John", "age":30}'; $json_array = json...
当尝试将PHP类实例转换为JSON时,`json_encode()`会忽略私有和受保护的属性,只保留公共属性。例如: ```php class Foo { const ERROR_CODE = '404'; public $public_ex = 'this is public'; private $...
如果存在多个构造函数,则需要保留`__construct()`并删除其他构造函数。 **修改前**: ```php function cls_sql_dump(&$db, $max_size = 0) { $this->db =& $db; if ($max_size > 0) { $this->max_size = $max_...
3. `json_decode`返回的PHP对象是stdClass类型的,如果想要得到关联数组,可以设置第二个参数`$assoc`为`true`。 4. `json_last_error_msg()`和`json_last_error()`可以用来检查JSON操作过程中是否发生了错误,从而...
- `stdClass` 是 PHP 内置的一个类,当你需要创建一个对象但没有具体的类定义时,可以使用这个类。例如,通过 `json_decode()` 函数解析 JSON 字符串时,如果没有指定第二个参数,返回的对象就是 `stdClass` 类的...
当尝试将一个PHP类转换为JSON时,只有类的公有属性会被保留,常量、私有属性、保护属性以及方法都不会被编码。例如: ```php class Foo { const ERROR_CODE = '404'; public $public_ex = 'this is public'; ...
- 对象转换为数组时,数组的键将是对象的属性名,但某些属性(如方法、静态属性、类常量)会被忽略。 了解这些比较运算和逻辑运算的细节对于编写准确无误的PHP代码至关重要,尤其是在处理各种数据类型和条件判断时...