上周末和爸妈去了回古猗园。在拥挤的汽车上摇晃了一路,想起了咱的香必飘,为啥不在公交车上飘一下呢?
古猗园似乎经过了几次扩建,大了不少,已经不完全是原来的样子了。不过就我看到的来说,相比苏州的那几个园林,在造园的艺术上讲似乎要差不少。难道说古代的苏州人比上海人有钱?
逛完园子吃小笼,似乎也就一般般。那儿有好几家卖小笼包子的,也不晓得哪家才算正宗。
照片:
后来发现,set names latin1之后,查询出来的东西是正常的,于是试着给mysqldump加上--default-character-set=latin1 --set-charset参数。导出来的文件果然就正常了。之后,去掉sql文件中的那行latin1的东西,再导进新的库里,一切正常。
未来的php5.3多了许多新特性。上回pea活动,在ben那里的新特性列表里,发现一个原来忽略的。就是here doc现在可以不处理里面的字符串了。就像这样:
$code =<<<'END'
$a = 1;
echo "$a\n";
END;
echo $code;
这样有什么好处呢?本来,php是没有block或者lambda表达式这样的东西的。create_function由于那个参数是个字符串,也不怎么好使。现在可以更方便地用here doc来实现类似的功能了。比如这个:
class ArrayList {
private $arr;
function __construct($arr) {
$this->arr = $arr;
}
function each($call) {
foreach ($this->arr as $item) {
call_user_func($call, $item);
}
}
}
$a = new ArrayList(array(1,2,3,4,5));
$a->each(create_function('$item', <<<'END'
echo "[$item]\n";
END
));
虽然比起ruby来要丑陋多了,变量作用域也不一样。不过总算聊胜于无。
春天是花开的季节,春天是动物复苏的季节,春天也是生病的季节。所以,我就咳嗽起来了,好多天了。不爽啊~,我还想出去玩呢。现在就只能在家修养了。
最近开始玩豆瓣的群组,确实很好玩。基本上就和我设想的群组模式一样。如果和活动、博客结合得更紧密的话应该会更好玩吧。
我们应该怎样倾听
那来自天上的声音
是凝视自己身体里的呼应
还是追随北风呼啸的身影
黄昏的鸟鸣唤起遥远的乡情
丛林的吼声惊扰梦中的美景
那些声音的虚实远近
我们又应该怎样判定
或许直到终结把一切分清
我们才能确信我们的谛听
是通往地核深处的路径
还是敞开的另一只眼睛
这两天总想写点什么,但是写着写着就又不想发布出来了。恩,最近是有些郁闷了。我这是为什么呢?是害怕改变还是真有什么东西值得让我背离经济人的假设,不管逻辑做出决策?又或者是在等待一个答案?谁知道呢。
这点东西是用live writer写的。也试过Zoundry和ScribeFire,结果只有这个东西能连上bus的api。live writer还是挺好用的,只是安装过程和其他几个live一样让人不爽。漫长的下载时间只能把它晾在一边让它慢慢拖。
hash
在php中,许多东西都是hash表。除了显而易见的数组以外,其实对象的属性,函数入口表、变量的符号表等在php内部也都是使用hash表来保存的。事实上,hash表里可以放任何一种数据类型的指针,并不限于zval*。
hash表的C结构叫HashTable。如果要创建一个HashTable,一般的做法如下:
HashTable *ht;
ALLOC_HASHTABLE(ht);
这样就会创建一个HashTable,并把地址放在ht里。光有一个HashTable结构还是不行的,还需要初始化。这就需要用到zend_hash_init函数。声明如下:
int zend_hash_init(
HashTable *ht,
uint nSize,
hash_func_t pHashFunction,
dtor_func_t pDestructor,
zend_bool persistent
)
第一个参数就是一个HashTable指针,必须是已经分配好内存的。
nSize是初始大小,就是存放东西的个数。超过这个值时会自动扩展。如果这个值不是2的n次方,则会自动变成大于它的最小的2的n次方数。
pHashFunction是没用的,但为了向下兼容,这个参数还在那里。必须为NULL。
pDestructor是析构函数。一般使用ZVAL_PTR_DTOR。
最后那个参数persistent是表示是用emalloc还是pemalloc来分配内存。
php的hash表可以有整数和字符串两种键,然后就有了两套访问hash表的函数。hash相关函数都以zend_hash_开头。例如:
int zend_hash_update(HashTable *ht, char *arKey, uint nKeyLen, void *pData, uint nDataSize, void **pDest);
用来更新字符串键的值。arKey是键;nKenLen是键的长度,包括最后的'\0';pData是值数据的指针,nDataSize是数据指针的大小。最后一个参数是用来指定值数据指针的保存位置的,对于更新操作一般用NULL即可而对于读取操作,则用来放取出的值的指针。一个调用的例子:
zend_hash_update(pHash, "hello", sizeof("hello"), &pZval, sizeof(zval*), NULL);
其他几个hash操作函数也大同小异。
zend_hash_index_update用来更新整数键的值,zend_hash_find和zend_hash_index_find分别用来读取字符串键和整数键所对应的值;zend_hash_exists和zend_hash_index_exists用来判断指定的键是否存在;zend_hash_del和zend_hash_index_del用于删除。还有许多其他的hash操作函数。zend_hash_num_elements用于得到元素的个数;zend_hash_clean用于清除全部元素;zend_hash_destroy除了清除全部元素外,还会释放由zend_hash_init所分配的内存,彻底销毁hash表。