PHP stdClass 应用

November 07, 2010

最近在某源码中发现了这个类:stdClass,发现该源码中并没有声明过这个类,再查手册也没发现,于是上网找下资料,原来stdClass在PHP5才开始被流行。而stdClass也是zend的一个保留类。也可以理解为stdClass是PHP的一个基类,所有的类几乎都继承这个类,所以任何时候都可以被new,可以让这个变量成为一个object。同时,这个基类又有一个特殊的地方,就是没有方法。
当我们声明一个数组时候:

$arrTemp = array();
$arrTemp[‘a’] = 1;
$arrTemp[‘b’] = 2;
$arrTemp[‘c’] = 3;

如果声明一个对象,操作就多了一些

$arrTemp = array(); $objTemp = (object)$arrTemp;
$objTemp->a = 1;
$objTemp->b = 2;
$objTemp->c = 3;

新建空数组只要$arrTemp = array();
新建空对像却要先有个class obj{}
倘若使用 stdClass

$user = new stdClass();
$user->name = ‘gouki’;
$user->id = ‘12’; $user->group = ‘manager’

我们可以这么理解一下,正因为PHP5的对象的独特性,对象在任何地方被调用,都是引用地址型的,所以相对消耗的资源会少一点。在其它页面为它赋值时是直接修改,而不是引用一个拷贝。
例如:

$user = new stdClass();
$user->name = ‘gouki’;
$myUser = $user;
$myUser->name = ‘flypig’;

如果在PHP4时代,这样的代码就是在消耗系统资源。因为:

$myUser = $user;

这是创建了一个拷贝。所以,在PHP4的时候,都是这样使用:

$myUser = & $user;

但这又与数组有什么差别呢?然而数组的每次被引用($a = $b),其实都是创建了一个副本。无论如何都多占了一次内存。

Nginx 自动禁止爬虫IP采集

### 背景最近我们有一个公开服务提供给客户查询关键词的热度值,由于这个API做在官方网站上,自然没有用户登陆,也没有很高查询成本,所以设计上没有任何鉴权无法进行身份认定,于是就被一个爬虫开了超高并发请求,直接后端的AWS Tomcat CPU被用尽,导致无法响应。爬虫显然...… Continue reading

Redis原子性事务Lua应用

Published on June 28, 2020