转/stdClass的介绍

@Ta 2011-10-04 3219点击
参考参考
一维数组,我现在特别喜欢把它写成对象,因为键盘打起来比较顺手,看起来也顺眼,如
$andy=array();
$andy['a']=1;
$andy['b']=2;
$andy['c']=3;
我喜欢把它变成这样
$andy=array();
$andy=(object)$andy;
$andy->a=1;
$andy->b=2;
$andy->c=3;
新建空数组只要
$andy = array();
新建空对像却要
$andy = new Andy; 
而且还得先有个
class Andy{}
或者得2行
$andy = array();
$andy = (object)$andy;
用array直接改类型成object有点别扭,今天找到了答案,顺便转一下stdClass的介绍:
$user=new stdClass();
$user->name='gouki';
这样的代码,这是干嘛用的呢?翻开手册,搜索stdClass,你会发现,手册上几乎没有介绍,如果你再次搜索google,看到的也几乎全是英文解释。其实,stdClass在PHP5才开始被流行。而stdClass也是zend的一个保留类。似乎没有其他作用。也几乎没有任何说明。或者,我们可以这么理解:stdClass是PHP的一个基类,所有的类几乎都继承这个类,所以任何时候都可以被new,可以让这个变量成为一个object。同时,这个基类又有一个特殊的地方,就是没有方法。凡时用new stdClass()的变量,都不可能会出现$a->test()这种方式的使用。或者,我们可以又这么理解一下,正因为PHP5的对象的独特性,对象在任何地方被调用,都是引用地址型的,所以相对消耗的资源会少一点。在其它页面为它赋值时是直接修改,而不是引用一个拷贝。例如:
$user=newstdClass();
$user->name='gouki';
$myUser=$user;
$myUser->name='flypig';
如果在PHP4时代,这样的代码就是在消耗系统资源。因为:
$myUser = $user;
这是创建了一个拷贝。所以,在PHP4的时候,都是这样使用:
$myUser = & $user;
有人说,为什么不用数组呢?数组不是更方便吗?而且对于PHP这样的弱类型程序来说,用数组应该是最方便的。确实。数组在程序的使用中应该是最方便的,然而数组的每次被引用($a = $b),其实都是创建了一个副本,而且,数组被unset后,还是占用了内存(这个是听人说来的,我没有测试……也不知道怎么测试,如果有人知道,请告诉我,谢谢 )不过SPL的标准类库里,还有一个函数arrayobject,可以直接将数组转化为对象这也是一个好办法哦。
回复列表(4|隐藏机器人聊天)
  • @Ta / 2011-10-04 / /
    虎绿林的session类利用一系列SPL接口,实现了像数组那样操作对象:
    $s=new session(…);
    $s['a']='wgmdwmdg';
    foreach($s as $key=>$value)
    {

    }
    echo count($s);
  • @Ta / 2011-10-04 / /
    PHP5的“写时拷贝”机制:只有修改数据时,才重新分配内存。
    $a=array(…);
    $b=$a; //此时$b和$a指向同一块内存
    $b[0]=5; //此时才重新分配内存、复制并修改
  • @Ta / 2011-10-04 / /
    PHP5的垃圾回收机制:
    任何数据unset之后,内存都不会被立即释放,而是放在那里等待被重新分配。
    只有程序结束时内存才释放。
    因此php程序的内存占用只会增大而不会减少。php程序在某一时刻占用的内存,与曾经占用的内存峰值相同,虽然这些内存有很多都是闲置的。
  • @Ta / 2011-10-04 / /
    PHP5数据访问效率:
    局部变量>全局变量>数组>静态类属性>Object属性>ArrayAccess接口对象操作
    所以虎绿林的session方式效率最差--.
添加新回复
回复需要登录