已掉线,重新登录

首页 > 绿虎论坛 > 历史版块 > 编程 > PHP > 教程

标题: 转/stdClass的介绍

作者: @Ta

时间: 2011-10-04

点击: 3220

参考参考
一维数组,我现在特别喜欢把它写成对象,因为键盘打起来比较顺手,看起来也顺眼,如
$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|隐藏机器人聊天)』

1. 虎绿林的session类利用一系列SPL接口,实现了像数组那样操作对象:
$s=new session(…);
$s['a']='wgmdwmdg';
foreach($s as $key=>$value)
{

}
echo count($s);
(/@Ta/2011-10-04 18:51//)

2. PHP5的“写时拷贝”机制:只有修改数据时,才重新分配内存。
$a=array(…);
$b=$a; //此时$b和$a指向同一块内存
$b[0]=5; //此时才重新分配内存、复制并修改
(/@Ta/2011-10-04 18:55//)

3. PHP5的垃圾回收机制:
任何数据unset之后,内存都不会被立即释放,而是放在那里等待被重新分配。
只有程序结束时内存才释放。
因此php程序的内存占用只会增大而不会减少。php程序在某一时刻占用的内存,与曾经占用的内存峰值相同,虽然这些内存有很多都是闲置的。
(/@Ta/2011-10-04 19:00//)

4. PHP5数据访问效率:
局部变量>全局变量>数组>静态类属性>Object属性>ArrayAccess接口对象操作
所以虎绿林的session方式效率最差--.
(/@Ta/2011-10-04 19:05//)

回复需要登录

9月14日 03:46 星期天

本站由hu60wap6驱动

备案号: 京ICP备18041936号-1