`

php保留类stdClass

php 
阅读更多

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);
?>

 以上例子,涉及两步操作:

 

  1. 构建一个单纯的对象(stdClass类型);
  2. 在单纯对象上动态添加属性;

正是为了支持转对象、操作数据、反序列化等等,php需要一个高度抽象的空类,并且可以动态扩展,stdClass做到了。

 

 

以上还不足以阐述明白stdClass,再补充以下几点:

  1. stdClass虽然是高度抽象到空,但是并不能说他是基类、顶层基类。谈基类、父类、或者子类这些说法的基础场景就是继承,谁继承谁,谁被继承,必须有这些前提;stdClass未被其他任何类默认或者隐式继承,目前所有的php版本都没有隐式继承机制,这个不同于.NET平台的System.Object;
  2. 类对象动态添加属性的特性跟是否继承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 内部保留类

    在PHP5中,`stdClass`是一个特殊的内部保留类,它在PHP的面向对象编程中扮演着特定的角色。尽管它的存在可能会引发一些误解,但理解它的本质和用途对于深入理解PHP的面向对象特性至关重要。 首先,`stdClass`类并...

    php中stdClass的用法分析

    在PHP编程语言中,stdClass是一个特殊的类,用于创建没有预定义属性或方法的对象。这个类在PHP标准库(SPL)中定义,并且是语言提供的内置功能之一。由于stdClass是一个空类,它提供了一种灵活性,允许开发者在运行...

    从PHP的源码中深入了解stdClass类

    `stdClass`类在PHP编程语言中扮演着独特的角色,它是一个内部保留的基类,但并非所有类都直接继承自它。尽管在某些解释中提到`stdClass`是所有类的基类,但实际上并非如此。从PHP的源码我们可以更深入地理解这一点。...

    理解PHP中的stdClass类

    而stdClass也是zend的一个保留类。似乎没有其他作用。也几乎没有任何说明。或者,我们可以这么理解:stdClass是PHP的一个基类,所有的类几乎都继承这个类,所以任何时候都可以被new,可以让这个变量成为一个object。...

    php 保留字列表

    PHP保留字,也称作关键词(keywords),是PHP编程语言中的特殊词汇,它们被语言内部占用,用于执行特定功能或者用来表示特定的语法结构。保留字对于PHP来说具有特定意义,不能用作变量名、函数名、类名、方法名或...

    PHP应用JSON技巧讲解 中文WORD版

    当`json_decode()`将JSON对象转换为PHP时,它会默认创建一个stdClass对象。如果想要将JSON对象转换为关联数组,可以设置第二个参数为`true`: ```php $json_obj = '{"name":"John", "age":30}'; $json_array = json...

    在PHP语言中使用JSON

    当尝试将PHP类实例转换为JSON时,`json_encode()`会忽略私有和受保护的属性,只保留公共属性。例如: ```php class Foo { const ERROR_CODE = '404'; public $public_ex = 'this is public'; private $...

    ecshop基于php5.0版本以上的配置修改

    如果存在多个构造函数,则需要保留`__construct()`并删除其他构造函数。 **修改前**: ```php function cls_sql_dump(&$db, $max_size = 0) { $this-&gt;db =& $db; if ($max_size &gt; 0) { $this-&gt;max_size = $max_...

    PHP json_encode与json_decode.rar

    3. `json_decode`返回的PHP对象是stdClass类型的,如果想要得到关联数组,可以设置第二个参数`$assoc`为`true`。 4. `json_last_error_msg()`和`json_last_error()`可以用来检查JSON操作过程中是否发生了错误,从而...

    php中explode的负数limit用法分析

    - `stdClass` 是 PHP 内置的一个类,当你需要创建一个对象但没有具体的类定义时,可以使用这个类。例如,通过 `json_decode()` 函数解析 JSON 字符串时,如果没有指定第二个参数,返回的对象就是 `stdClass` 类的...

    在PHP语言中使用JSON和将json还原成数组的方法

    当尝试将一个PHP类转换为JSON时,只有类的公有属性会被保留,常量、私有属性、保护属性以及方法都不会被编码。例如: ```php class Foo { const ERROR_CODE = '404'; public $public_ex = 'this is public'; ...

    PHP 的比较运算与逻辑运算详解

    - 对象转换为数组时,数组的键将是对象的属性名,但某些属性(如方法、静态属性、类常量)会被忽略。 了解这些比较运算和逻辑运算的细节对于编写准确无误的PHP代码至关重要,尤其是在处理各种数据类型和条件判断时...

Global site tag (gtag.js) - Google Analytics