<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>潘锦的空间 &#187; stdClass类</title>
	<atom:link href="https://www.phppan.com/tag/stdclass%e7%b1%bb/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.phppan.com</link>
	<description>SaaS SaaS架构 团队管理 技术管理 技术架构 PHP 内核 扩展 项目管理</description>
	<lastBuildDate>Sat, 25 Apr 2026 00:56:17 +0000</lastBuildDate>
	<language>zh-CN</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=3.9.40</generator>
	<item>
		<title>理解PHP中的stdClass类</title>
		<link>https://www.phppan.com/2011/05/php-stdclass/</link>
		<comments>https://www.phppan.com/2011/05/php-stdclass/#comments</comments>
		<pubDate>Wed, 25 May 2011 01:50:19 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[PHP源码]]></category>
		<category><![CDATA[stdClass类]]></category>

		<guid isPermaLink="false">http://www.phppan.com/?p=1383</guid>
		<description><![CDATA[在百度百科中，对于stdClass的定义如下： stdClass在PHP5才开始被流行。而stdClass也是 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p style="text-indent: 2em;">在百度百科中，对于<a style="color: #1299da; text-decoration: underline;" href="http://baike.baidu.com/view/4418583.htm" target="_blank">stdClass</a>的定义如下：</p>
<pre style="background-color: #333333; color: #ffffff; font: normal normal normal 13px/normal 'Bitstream Vera Sans Mono', 'DejaVu Sans Mono', 'Courier New', monospace; overflow-x: auto; overflow-y: auto; padding: 10px;">stdClass在PHP5才开始被流行。而stdClass也是zend的一个保留类。stdClass是PHP的一个基类，
所有的类几乎都继承这个类，所以任何时候都可以被new，可以让这个变量成为一个object。同时，
这个基类又有一个特殊的地方，就是没有方法。凡是用new stdClass()的变量，
都不可能会出现$a-&gt;test()这种方式的使用。PHP5的对象的独特性，对象在任何地方被调用，
都是引用地址型的，所以相对消耗的资源会少一点。在其它页面为它赋值时是直接修改，而不是引用一个拷贝。</pre>
<p style="text-indent: 2em;">以上的定义大多数都是正确的，但是一个致命性的诊断错误: <span style="text-decoration: line-through;">stdClass是PHP的一个基类，所有的类几乎都继承这个类。</span> 看一个简单的例子：</p>
<pre style="background-color: #333333; color: #ffffff; font: normal normal normal 13px/normal 'Bitstream Vera Sans Mono', 'DejaVu Sans Mono', 'Courier New', monospace; overflow-x: auto; overflow-y: auto; padding: 10px;"><span style="color: #cc7833;">class</span> EmptyClass <span style="color: #ffffff;">{</span>

<span style="color: #ffffff;">}</span>

<span style="color: #6d9cbe;">$object</span> <span style="color: #e0882f;">=</span> <span style="color: #cc7833;">new</span> EmptyClass<span style="color: #ffffff;">(</span><span style="color: #ffffff;">)</span><span style="color: #e0882f;">;</span>
<span style="color: #ff8400;">if</span> <span style="color: #ffffff;">(</span><span style="color: #6d9cbe;">$object</span> instanceof stdClass<span style="color: #ffffff;">)</span> <span style="color: #ffffff;">{</span>
    <a style="color: #1299da; text-decoration: none;" href="http://www.php.net/echo"><span style="color: #e2392d;">echo</span></a> <span style="color: #56db3a;">'yes'</span><span style="color: #e0882f;">;</span>
<span style="color: #ffffff;">}</span><span style="color: #ff8400;">else</span><span style="color: #ffffff;">{</span>
    <a style="color: #1299da; text-decoration: none;" href="http://www.php.net/echo"><span style="color: #e2392d;">echo</span></a> <span style="color: #56db3a;">'no'</span><span style="color: #e0882f;">;</span>
<span style="color: #ffffff;">}</span></pre>
<p style="text-indent: 2em;">执行代码，输出&#8221;no&#8221;，这个例子充分说明了stdClass类并不是所有类的基类。它仅仅是PHP的一个保留类，或者说一个类似于strlen函数这样的一个角色。 我们从源码的维度看看stdClass类的实现，它注册的位置在 Zend/zend_builtin_functions.c文件中。如下：</p>
<pre style="background-color: #333333; color: #ffffff; font: normal normal normal 13px/normal 'Bitstream Vera Sans Mono', 'DejaVu Sans Mono', 'Courier New', monospace; overflow-x: auto; overflow-y: auto; padding: 10px;">ZEND_MINIT_FUNCTION<span style="color: #ffffff;">(</span>core<span style="color: #ffffff;">)</span> <span style="color: #ffffff;">{</span> <span style="color: #bd48b3; font-style: italic;">/* {{{ */</span>
    zend_class_entry class_entry<span style="color: #e0882f;">;</span>

    <span style="color: #bd48b3; font-style: italic;">/* 注册stdClass 类 */</span>
    INIT_CLASS_ENTRY<span style="color: #ffffff;">(</span>class_entry<span style="color: #e0882f;">,</span> <span style="color: #99ff00;">"stdClass"</span><span style="color: #e0882f;">,</span> <span style="color: #cc7833;">NULL</span><span style="color: #ffffff;">)</span><span style="color: #e0882f;">;</span>
    zend_standard_class_def <span style="color: #e0882f;">=</span> zend_register_internal_class<span style="color: #ffffff;">(</span><span style="color: #e0882f;">&amp;</span>class_entry TSRMLS_CC<span style="color: #ffffff;">)</span><span style="color: #e0882f;">;</span>

    <span style="color: #bd48b3; font-style: italic;">/* 注册默认类，接口，如Exception类，SPL中的一些类等 */</span>
    zend_register_default_classes<span style="color: #ffffff;">(</span>TSRMLS_C<span style="color: #ffffff;">)</span><span style="color: #e0882f;">;</span>    

    <span style="color: #ff8400;">return</span> SUCCESS<span style="color: #e0882f;">;</span>
<span style="color: #ffffff;">}</span>
<span style="color: #bd48b3; font-style: italic;">/* }}} */</span></pre>
<p style="text-indent: 2em;">这是zend_builtin_module的模块初始化函数，在PHP内核进行模块初始化操作时会自动加载这个函数， 这样，stdClass类的注册操作也就会被执行了。从这段代码可以看出，stdClass类是一个没有成员变量也没有成员方法的类。 它的所有的魔术方法，父类、接口等在初始化时都被设置成NULL。由于在PHP中对于一个类我们无法动态的添加方法， 所以这个类只能用来处理动态属性，这也是我们一种常见的用法。</p>
<p style="text-indent: 2em;">总结一下：</p>
<p style="text-indent: 2em;"><strong>stdClass类是PHP的一个内部保留类，初始时没有成员变量也没成员方法，所有的魔术方法都被设置为NULL，可以使用其传递变量参数，但是没有可以调用的方法。stdClass类可以被继承，只是这样做没有什么意义。</strong></p>
]]></content:encoded>
			<wfw:commentRss>https://www.phppan.com/2011/05/php-stdclass/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
