PHP变量引用计数,写时复制总结

学习自php-variables

在PHP的变量存储结构ZVAL中,有两个成员:refcount__gcis_ref_gc用于实现引用计数和写时复制,这样既能节省内存,又能减少计算量。

当执行如下代码时:

1
2
3
4
5
<?php
$a = "this is";
$b = "variable";
$c = 42;
?>

三个变量各自拥有一个ZVAL,如下图所示:
demo


Read more...

2014-01-28 PHP扩展

GRASP (object-oriented design)

翻译自维基百科GRASP (object-oriented design)

General Responsibility Assignment Software Patterns(通用职责分配软件模式),简写为GRASP,由面向对象设计中对类和对象的职责分配原则组成。

GRASP使用的模式和原则有:控制器、创建者、间接性、信息专家、高内聚、低耦合、多态、防止变异和纯虚构。所有这些模式都回答了一些软件设计问题,并且这些问题几乎在每一个软件开发项目中都会遇到。这些技术还没有被用来发明新的工作方式,而是为了改善文档和规范旧的开发方式,是在面向对象设计中不断尝试和测试的编程原则。

Larman说:“软件开发中最关键的设计工具是一个在设计原则上受过良好教育的头脑,而不是UML或者其它技术。”因此,GRASP是一个真正的思维工具,一个学习援助,在面向对象软件的设计中有所帮助。


Read more...

2014-01-25 设计模式

Pear编码标准 10、13

翻译自Coding Standards的10、13小节

文件头注释


在PEAR库的所有源代码文件都要包含一个“页面级”的注释在文件开头和每一个类的都要有“类级别”的注释。下面有一个例子:

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
50
51
52
53
54
55
56
57
58
<?php

/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */

/**
 * 关于本文件短的描述
 *
 * 详细的描述(如果需要的话……)
 *
 * PHP version 5版本
 *
 * 许可声明
 * LICENSE: This source file is subject to version 3.01 of the PHP license
 * that is available through the world-wide-web at the following URI:
 * http://www.php.net/license/3_01.txt.  If you did not receive a copy of
 * the PHP License and are unable to obtain it through the web, please
 * send a note to license@php.net so we can mail you a copy immediately.
 *
 * @category   CategoryName
 * @package    PackageName
 * @author     Original Author <author@example.com>
 * @author     Another Author <another@example.com>
 * @copyright  1997-2005 The PHP Group
 * @license    http://www.php.net/license/3_01.txt  PHP License 3.01
 * @version    SVN: $Id$
 * @link       http://pear.php.net/package/PackageName
 * @see        NetOther, Net_Sample::Net_Sample()
 * @since      File available since Release 1.2.0
 * @deprecated File deprecated in Release 2.0.0
 */

/*
* 将includes,constant defines和$_GLOBAL设置写在这里。
* 确保他们有合适的文档注释,以免phpDocumentor将它们当作“页面级”注释处理。
*/

/**
 * 关于类的简短描述
 *
 * 详细的描述(如果需要的话……)
 *
 * @category   CategoryName
 * @package    PackageName
 * @author     Original Author <author@example.com>
 * @author     Another Author <another@example.com>
 * @copyright  1997-2005 The PHP Group
 * @license    http://www.php.net/license/3_01.txt  PHP License 3.01
 * @version    Release: @package_version@
 * @link       http://pear.php.net/package/PackageName
 * @see        NetOther, Net_Sample::Net_Sample()
 * @since      Class available since Release 1.2.0
 * @deprecated Class deprecated in Release 2.0.0
 */
class Foo_Bar
{
}

?>

Read more...

2014-01-16 PHP编码规范

Pear编码标准 1-9

翻译自Coding Standards的1-9小节

缩进和行的长度


使用4个空格的缩进,且不含制表符。这有助于避免差别、补丁、SVN历史和注释带来的问题。为了增强代码的可读性,特别推荐每一行大约占75-85个字符长。 Paul M. Jones有关于这个限制的一些想法


Read more...

2014-01-06 PHP编码规范

PHP安全最佳实践

翻译自:PHP Security Best Practices

在这一篇博文中将会探讨一些关于PHP安全的最佳实践。

经常更新

如果可能,使用最新发布的稳定版PHP。因为它包含了一些安全的更新和BUG的修复。这能够让PHP应用更加安全,当然性能也会更好。


Read more...

2013-12-21 PHP安全

C语言使用JSON,cJSON库的使用

学习了点socket编程,发现通过TCP/UDP进行通信接收到的是连续的字节内容,于是想要传输有结构的数据,就想到了JSON,上网查了下,找到了从cJSON库,这个库简单易用,很不错。


Read more...

2013-12-21 C库

使用PHP进行网页数据抓取小结

抓取思路

  1. 通过CURL请求到页面html,假设URL是正确的,这一步需要注意的地方是服务器重定向问题、服务器检查请求的合法性(通常检查请求头,高级的还会通过动态的cookie值例如淘宝指数)。
  2. 将请求到的html(所获取的html是未经过js处理的)加载为DOM后,使用DOM库提供的方法从网页获取数据,同时也可以结合DOMXPath(获取网页数据XPath的路径可以使用chrome的控制台,在标签上右击鼠标,选择copy xpath,但注意这个xpath可能与你实际想要的有时会不同,注意禁止掉浏览器js运行)。另外一种方法就是使用php-simple-html-dom,这个库提供面向对象的方法像jquery那样从网页获取数据。

Read more...

2013-12-18 PHP应用