作者归档:admin

PHP in Action Objects, Design, Agility读后总结

PHP in Action Objects, Design, Agility读后总结

经过了一个月的辛苦,终于把这本书看完了,觉得受益良多!
觉得自己对PHP5中的一些以前没有注意到的细节有了更多的了解,例如PHP4和php5中的对于对象复制的问题,PHP中的方法重载,访问控制,类方法,虚类和虚方法,类提示及接口等
另外就PHP中面向对象的what,how,why有了更清楚的认识,特别是一些设计原则的应用有了更深刻的认识
但是对于第二部分的测试和重构,觉得说得有些浅,至少我觉得有些用不上,
特别需要提到的是第三部分,构建WEB页面,其中就模板引擎,表单验证,MVC模式,数据抽象进行了详细的说明
这一章,让我对于那些框架性的东西有了更深层次的理解,
比如,对于数据抽象,可以联想到yii框架中的数据库类,很好的做到了书中提到的几个观点;
比如,模板引擎,让我对于正在使用的框架模板有了更清楚的认识。
比如,表单验证,对比黑夜路人的TMPHP框架中的那些工具类等等
特别是对于控制器的说明:让我明白自己正在使用的框架中对于控制器的错误使用;
总体来说:这是一本好书,值得一看。应该不止看一遍。

第一章:PHP and modern software development(PHP与现代软件开发)
简单介绍了PHP的一些历史和特点,PHP 5中的面向对象,设计模式,重构、敏捷开发以及测试驱动开发等等
第二章:Objects in PHP(PHP中的对象)
本章首先稍微详细的介绍了PHP中的面向对象,以及一些简单的DEMO,然后是PHP中的异常处理,以及PHP4和php5中的对于对象复制的问题和PHP中的方法重载,
在这一章中对于PHP的面向对象知识有一些补充;
第三章:Using PHP classes effectively(有效使用PHP类)
本章就PHP类的使用作了详细介绍,其中包括访问控制,类方法,虚类和虚方法,类提示及接口,
在这里对PHP中的类和接口的相关知识作了详细介绍,如果基础不好,可以多看几遍
第四章:Understanding objects and classes(理解对象和类)
本章就使用对象和类的 why,how,what作了介绍,其中说明了面向对象的优点,设计原则,以及使用的地方
如果有时间希望可以再看一遍

EOF

在nokia s60中使用python将收件箱中的内容导出保存为文本

在nokia s60中使用python将收件箱中的内容导出保存为文本

由于手机收到139邮箱的邮件信息比较多,想把它删除,但是又不能全选后全部删除
所以使用python写了一个简单的程序读取收件箱的内容,并将其存储到指定位置
并且根据联系人的手机号码分别创建文件

【程序说明】
此程序是根据s60提供的python API实现
其中用到了inbox和contacts

1、程序取收件箱的所有短信,
2、遍历,针对每条短信,
3、通过contacts对象取出联系人的电话,
4、将短信内容写入以联系人电话命名的txt文件中
5、删除短信

【代码】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
 
import inbox
from datetime import datetime
import time
import contacts
 
def get_mobile_number_by_name(db, name):
    found = db.find(name)
 
    #如果在联系人中可以找到,则返回号码,否则直接返回name
    mobile_number = found[0].find('mobile_number')[0].value if len(found)  > 0 else name
    return mobile_number
 
 
def write_mess(name, mess):
    filename = 'e:/data/inbox/' + name + '.txt'
    f = open(filename, 'a+')
    f.write(mess.encode('utf-8'))
    f.close()
 
inbox_obj = inbox.Inbox()
m = inbox_obj.sms_messages()
db = contacts.open()
 
k = 0
for i in m:
    k += 1
    name = inbox_obj.address(i)
    content = inbox_obj.content(i)
 
    #格式化时间
    format = '%Y-%m-%d %H:%M:%S'
    result = datetime.fromtimestamp(inbox_obj.time(i))
    ltime = result.strftime(format)
 
    #输出内容,调试用
    print name, content, ltime
    mobile_number = get_mobile_number_by_name(db, name)
 
    #对于
    if (mobile_number[0:6] != '106581'):
        write_mess(mobile_number, ltime + content + "\r\n")
 
    # 删除短信
    inbox_obj.delete(i)
 
    #一次执行10条,此处为测试用
    if k > 10:
        break

注意:此程序为个人所用,会删除收件箱内的所有短信,如果出现问题本人概不负责^_^!
此程序在nokia e63型号机器上测试通过,使用python1.9.7 for s60

EOF

PHP源码阅读笔记二十二:array_splice函数

PHP源码阅读笔记二十二:array_splice函数
array_splice
(PHP 4, PHP 5)

array_splice — 把数组中的一部分去掉并用其它值取代
说明
array array_splice ( array &input, int offset [, int length [, array replacement]] )

array_splice() 把 input 数组中由 offset 和 length 指定的单元去掉,如果提供了 replacement 参数,则用 replacement 数组中的单元取代。返回一个包含有被移除单元的数组。注意 input 中的数字键名不被保留。

如果 offset 为正,则从 input 数组中该值指定的偏移量开始移除。如果 offset 为负,则从 input 末尾倒数该值指定的偏移量开始移除。

如果省略 length,则移除数组中从 offset 到结尾的所有部分。如果指定了 length 并且为正值,则移除这么多单元。如果指定了 length 并且为负值,则移除从 offset 到数组末尾倒数 length 为止中间所有的单元。小窍门:当给出了 replacement 时要移除从 offset 到数组末尾所有单元时,用 count($input) 作为 length。

如果给出了 replacement 数组,则被移除的单元被此数组中的单元替代。如果 offset 和 length 的组合结果是不会移除任何值,则 replacement 数组中的单元将被插入到 offset 指定的位置。注意替换数组中的键名不保留。如果用来替换的值只是一个单元,那么不需要给它加上 array(),除非该单元本身就是一个数组

array_splice函数调用的是php_splice函数,对于此函数的主要代码说明如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/* 创建并初始化返回数组,此返回数组为php_splice的返回数组,并非array_splice的返回数组(array_splice的返回数组为removed)*/
ALLOC_HASHTABLE(out_hash);    
zend_hash_init(out_hash, 0, NULL, ZVAL_PTR_DTOR, 0);
/*将数组中从开始到offset的元素拷贝到返回数组中 */
for (pos=0, p=in_hash->pListHead; pos<offset && p ; pos++, p=p->pListNext) {
 
    entry = *((zval **)p->pData);
    entry->refcount++;
/*更新返回数组 */
if (p->nKeyLength)
    zend_hash_quick_update(out_hash, p->arKey, p->nKeyLength, p->h, &entry, sizeof(zval *), NULL);
else
    zend_hash_next_index_insert(out_hash, &entry, sizeof(zval *), NULL);
}
/* 将需要移除的元素赋值给removed,即array_splice的返回数组 */
if (removed != NULL) {
    for ( ; pos<offset+length && p; pos++, p=p->pListNext) {
    entry = *((zval **)p->pData);
    entry->refcount++;
    if (p->nKeyLength)
        zend_hash_quick_update(*removed, p->arKey, p->nKeyLength, p->h, &entry, sizeof(zval *), NULL);
    else
        zend_hash_next_index_insert(*removed, &entry, sizeof(zval *), NULL);
    }
} else /* 其它情况,跳过这些元素 */
    for ( ; pos<offset+length && p; pos++, p=p->pListNext);
/* 如果有元素需要插入,即有replacement参数 */
if (list != NULL) {
/* 对于每个元素,创建新的zval,拷贝并将它写入到返回数组中*/
    for (i=0; i<list_count; i++) {
        entry = *list[i];
        entry->refcount++;
        zend_hash_next_index_insert(out_hash, &entry, sizeof(zval *), NULL);
    }
}
/* 拷贝剩下的元素 */
for ( ; p ; p=p->pListNext) {
    entry = *((zval **)p->pData);
    entry->refcount++;
    if (p->nKeyLength)
        zend_hash_quick_update(out_hash, p->arKey, p->nKeyLength, p->h, &entry, sizeof(zval *), NULL);
    else
        zend_hash_next_index_insert(out_hash, &entry, sizeof(zval *), NULL);
}
 
/* 重置数组的游标,相当于reset函数*/
zend_hash_internal_pointer_reset(out_hash);

整个过程:
1、拷贝从开始到offset的元素到返回数组
2、移除从offset开始到offset+length的元素
3、如果有替换的元素,将新元素插入到offset后面的位置
4、将offset+length后面的函数插入到返回数组后面
5、重置数组游标

EOF