第二节 源码结构、阅读代码方法 PHP源码目录结构

俗话讲:重剑无锋,大巧不工。PHP的源码在结构上非常清晰。下面先简单介绍一下PHP源码的目录结构。

PHP的测试比较有意思,它使用PHP来测试PHP,测试php脚本在/run-tests。php,这个脚本读取tests目录中phpt文件。 读者可以打开这些看看,php定义了一套简单的规则来测试,例如一下的这个测试脚本/tests/basic/001。phpt:

--TEST--
Trivial "Hello World" test
--FILE--
<?php echo "Hello World"?>
--EXPECT--
Hello World

这段测试脚本很容易看懂,执行--FILE--下面的PHP文件,如果最终的输出是--EXPECT--所期望的结果则表示这个测试通过, 可能会有读者会想,如果测试的脚本不小心触发Fatal Error,或者抛出未被捕获的异常了,因为如果在同一个进程中执行, 测试就会停止,后面的测试也将无法执行,php中有很多将脚本隔离的方法比如: system(),exec()等函数,这样可以使用主测试进程服务调度被测脚本和检测测试结果,通过这些外部调用执行测试。 php测试使用了proc_open()函数,这样就可以保证测试脚本和被测试脚本之间能隔离开。

PHP源码阅读方法 使用VIM + Ctags查看源码

通常在Linux或其他*Nix环境我们都使用VIM作为代码编辑工具,在纯命令终端下,它几乎是无可替代的。 它具有非常强大的扩展机制,在文字编辑方面基本上无所不能。 不过Emacs用户请不要激动,笔者还没有真正使用Emacs,虽然我知道它甚至可以煮咖啡, 还是等笔者有时间了或许会试试煮杯咖啡边喝边写。

推荐在Linux下编写代码的读者或多或少的试一试ctags。 ctags支持非常多的语言,可以将源代码中的各种符号(如:函数、宏类等信息)抽取出来做上标记并保存到一个文件中, 供其他文本编辑工具(VIM,EMACS等)进行检索。 它保存的文件格式符合UNIX的哲学(小即是美), 使用也比较简洁:

#在PHP源码目录(假定为/server/php-src)执行:
$ cd /server/php-src
$ ctags -R
 
#小技巧:在当前目录生成的tags文件中使用的是相对路径,
#若改用 ctags -R /server/ ,可以生成包含完整路径的ctags,就可以随意放到任意文件夹中了。 
 
#在~/.vimrc中添加:
set tags+=/server/php-src/tags
#或者在vim中运行命令:
:set tags+=/server/php-src/tags

上面代码会在/sever/php-src目录下生成一个名为tags的文件,这个文件的格式如下

{tagname}<Tab>{tagfile}<Tab>{tagaddress}
 
EG  Zend/zend_globals_macros.h  /^# define EG(/;"   d

它的每行是上面的这样一个格式,第一列是符号名(如上例的EG宏),第二列是该符号的文件位置以及这个符号所在的位置。 VIM可以读取tags文件,当我们在符号上(可以是变量名之类)使用CTRL+]时VIM将尝试从tags文件中检索这个符号。 如果找到则根据该符号所在的文件以及该符号的位置打开该文件, 并将光标定位到符号定义所在的位置。 这样我们就能快速的寻找到符号的定义。

使用 Ctrl+] 就可以自动跳转至定义,Ctrl+t 可以返回上一次查看位置。这样就可以快速的在代码之间“游动”了。

习惯这种浏览代码的方式之后,大家会感觉很方便的。不过若你不习惯使用VIM这类编辑器,也可以看看下面介绍的IDE

如果你使用的Mac OS X,运行ctags程序可能会出错,因为Mac OS X自带的ctags程序有些问题, 所以需要自己下载安装ctags,笔者推荐使用homebrew来安装。

使用IDE查看代码

如果不习惯使用VIM来看代码,也可以使用一些功能较丰富的IDE,比如Windows下可以使用Visual Studio 2010 Express 。 或者使用跨平台的NetbeansEclipse来查看代码, 当然,这些工具都相对较重量级一些,不过这些工具不管是调试还是查看代码都相对较方便,

在Eclipse及Netbeans下查看符号定义的方式通常是将鼠标移到符号上,同时按住CTRL,然后单击,将会跳转到符号定义的位置。

而如果使用VS的话, 在win32目录下已经存在了可以直接打开的工程文件,如果由于版本原因无法打开, 可以在此源码目录上新建一个基于现有文件的Win32 Console Application工程。

常用快捷键

F12 转到定义
CTRL + F12转到声明
 
F3: 查找下一个
Shift+F3: 查找上一个
 
Ctrl+G: 转到指定行
 
CTRL + -向后定位
CTRL + SHIFT + -向前定位

对于一些搜索类型的操作,可以考虑使用Editplus或其它文本编辑工具进行,这样的搜索速度相对来说会快一些。 如果使用Editplus进行搜索,一般是选择 【搜索】 中的 【在文件中查找...】

看到这有什么想法或疑问?点击这里参与讨论吧!