霹雳狂风水上扶舟 發表於 2019-10-24 22:42:00

PHP的stdClass

<h2 id="概述">概述</h2>
<p>以下是百度百科对php中的 stdClass的描述:</p>
<blockquote>
<p>stdClass在PHP5才开始被流行。而stdClass也是zend的一个保留类。<strong>stdClass类是PHP的一个内部保留类,初始时没有成员变量也没成员方法,所有的魔术方法都被设置为NULL.</strong>凡是用new stdClass()的变量,都不可能会出现$a-&gt;test()这种方式的使用。PHP5的对象的独特性,对象在任何地方被调用,都是引用地址型的,所以相对消耗的资源会少一点。在其它页面为它赋值时是直接修改,而不是引用一个拷贝。</p>
</blockquote>
<p>在百度上搜索,有很多人写的文章中,提到了stdClass是所有类的基类,但是我试了一下:</p>
<pre><code class="language-php">class Test{}
$t = new Test();
var_dump($t instanceof stdClass);
</code></pre>
<p>输出结果:<code>bool(false)</code></p>
<p>显然,stdClass并不是Test的基类,也就是说stdClass不是所有类的基类。</p>
<p>那么stdClass到底是个什么呢?到底是干什么用的呢?</p>
<h2 id="解惑">解惑</h2>
<p>既然这个类没有成员变量也没有审核魔术方法,那么stdClass到底是个什么玩意?</p>
<pre><code class="language-php">$a = new stdClass();
$a-&gt;username = 'a';
$a-&gt;email = 'qq';
var_dump($a);
</code></pre>
<p>结果输出:</p>
<blockquote>
<p>class stdClass#1 (2) {<br>
public $username =&gt;<br>
string(1) "a"<br>
public $email =&gt;<br>
string(2) "qq"<br>
}</p>
</blockquote>
<p>显然,这完全就是个数据啊。</p>
<p>那么它和数组的区别是什么?我看到晚上一些人是这样解释的,以下代码</p>
<pre><code class="language-php">$a = new stdClass();
$b = $a;
</code></pre>
<p>这样 a b两个变量公用一个内存,<code>$b=$a;</code> 是引用赋值,而如果是数组的话,会拷贝整个数组对象。</p>
<p>但是,忘了取址符号了么? <code>$b=&amp;$a</code> , 同样也是引用赋值啊?有什么区别么? 显然,以上说法并没有说服我,stdClass 类的作用是什么呢?它存在的意义在哪里?</p>
<p>等等,引用传递?不需要使用取址符号?这不就完全可以在方法的参数和全局变量中使用么?</p>
<p>当然,在方法的参数中传递数组,在形参中使用 <code>&amp;$a</code> 也可以达到引用传递的效果,但如果函数没有使用取址符号,传递的时候就会复制一份,浪费内存。但是,同时也要承担对应的风险,复制数组的方法固然浪费了内存,但是无论方法内对数组如何操作,都不会反应到外边的数组中。如果使用 <code>stdClass</code> 类就不一样了,你传进去了,就要做好出来的时候属性面目全非的准备。</p>
<p><strong>全局变量</strong>, 如果在某个静态方法S中定义一个全局变量,这个变量向所有人提供,这时使用数组就很不地道了。你在方法a中获取了对象,并设置了对象的属性,以便于在后边使用。在之后的方法b中再次获取此对象,如果你使用的是数组,那么尴尬了,调用方法S返回的数组,对其修改只是对局部变量的数组进行了修改,并没有达到想要的效果。如果方法S返回的是stdClass对象,那就完全没有问题了啊。</p>
<p>举个栗子:</p>
<pre><code class="language-php">class Test{
    private static $user = [];
    public static function getUser(){
      return self::$user;
    }
}
$a = Test::getUser();
$a['username'] = 'name';
$b = Test::getUser();
var_dump($b);
</code></pre>
<p>结果输出:</p>
<blockquote>
<p>array(0) {<br>
}</p>
</blockquote>
<p>这时,使用stdClass,效果完全不同:</p>
<pre><code class="language-php">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-&gt;username = 'name';
$b = Test::getUser();
var_dump(get_object_vars($b));
</code></pre>
<p>输出结果:</p>
<blockquote>
<p>array(1) {<br>
'username' =&gt;<br>
string(4) "name"<br>
}</p>
</blockquote>
<p>完美~~</p>
<p><code>stdClass</code> 对于这种向全局提供的属性再适合不过了,其实也可以使用一个单例类来实现同样的方法,但是显然使用<code>stdClass</code>更加灵活,也更加简洁。</p>
<p>可以使用 <code>get_object_vars($a)</code> 方法讲stdClass对象转成数组,该方法会讲对象的属性转成数组。</p>
<hr>
<p>至此,我也想到了<code>stdClass</code>的应用场景。</p>
<p>我相信它还有更多的应用场景,毕竟是直接引用赋值,会对对象直接修改。但是我目前还没有想到更好的应用场景,唉,才疏学浅。</p>
<p>各位,告辞!!</p><br><br>
来源:https://www.cnblogs.com/hujingnb/p/11735542.html
頁: [1]
查看完整版本: PHP的stdClass