PHP中的源代码签名(PHP源码学习快速方法)
2011-11-11 11:46 AnyKoro 阅读(449) 评论(0) 编辑 收藏 举报E文地址:http://www.codediesel.com/php/source-code-signatures-in-php/
这篇文章是基于Ward Cunningham的名为Signature Survey: A Method for Browsing Unfamiliar Code 的文章的。Ward建议,当学习新的、不熟悉的源码时,对代码结构获取直观的感受是很重要的。Ward建议了一种方法,通过从每个源文件中逐行获取标点进行总结。他称此为文件签名。这将会帮助开发者考量代码基础的复杂性。
例如,如果我们只考虑使用\'{}\'和\';\'——PHP编程中的公共标点元素。程序员可以对源文件的结构有个了解。在php中括号划定了函数或块的范围,在其他许多语言中也大多如此,所以这将告诉程序员该代码块或函数的尺寸大小(长还是短)。
以Wordpress系统的源文件为例,以括号和分号作为选择标点字符,WordPress的签名通过以下方法得到:
样本WordPress源文件——wp-blog-header.php:
<?php
/**
* Loads the WordPress environment and template.
*
* @package WordPress
*/
if ( !isset($wp_did_header) ) {
$wp_did_header = true;
require_once( dirname(__FILE__) . \'/wp-load.php\' );
wp();
require_once( ABSPATH . WPINC . \'/template-loader.php\' );
}
?>
得到的上面代码的签名如下:
wp-blog-header.php : {;;;;}
这说明了该文件有一个块部分(可以是函数,类或其他的),包含了四条语句。如果我们在签名中还包含圆括号\'()\'的话,我们会获得以下的。但是,这看上去一点复杂,并且也不如前一个直观。
wp-blog-header.php : (()){;(());();();}
下面我们给出更多的WordPress根文件的签名:
index.php : ;; wp-atom.php : ;;; wp-blog-header.php : {;;;;} wp-comments-post.php : {;;;;};;;;{;;};;{;;}{;;}{;;}{;;}{;};;;;;{;;;; {{;;}}}{;};{;;};;;;;{;;;;};;;; wp-commentsrss2.php : ;;; wp-config-sample.php : {};;;;;;{};;;;;;;;;;;;; wp-config.php : ;{};;;;;;{}}{{{;{};;{;;{;{};{{{;{;}{;;;;;; wp-cron.php : ;;;{;};;;;{;{{;{;;};;}}}; wp-feed.php : ;;; wp-links-opml.php : ;;;;{;;};;;;;;;;;;;;;;;; xmlrpc.php : ;;{;};;{;;;;};;;;;;{;{;;;;;};};;;;; wp-load.php : ;;{;}{;}{;;;;;;;;;;;;} wp-pass.php : ;;;;; wp-rdf.php : ;;; wp-register.php : ;;; wp-rss.php : ;;; wp-rss2.php : ;;; wp-login.php : ;{{;;}{;;}}{;;;;;;;;;;;;;;;;{;;;;{;}{;}}{{;}};;{;;;}{;; ;};;{;;}{;;{;{;;}};;}}{;;;{;;}{};;;}{;;{;{;}{;{;;}}};{;}{;}{;;{{;};}{{ ;;}{}}}{;;;;;};}{;;;{;;}{;;};;{;;};;;;;;;;{;;;};;;;;;;;;;;;;}{;;;;;;;} {;;;}{;;;{;}{;;}{;}{;}{;;;}{;};;;;;{;;;};;;};;;;;;;{;;;};;;;;{;;;;;;{; {;;;}};;;;;;;;;;;;;{;;};{;}{;;;;};;;;;;;;;;;{;;}{;;};;{;;;{;;;}};;;;;; ;;;;;{;{{;;}}}{;;}{;};;;;{{;;{};;;}{;;;};;};;;;;;;;;;;;;;;;;;{}{;}{;}{ {{{;;}{;{;}};;}{}};}{;};;;} wp-mail.php : ;;;;;;;;;;;;;;{;;;};;{;;;;;;;;;;{;{;}{{;;;;{;;};}{;;;;;} {;;;}{;;{;}{;};;}{;;;{;;{;}{;;}}{;}}{;;{;};;;;;;;;;;{{;}};;;;;}}}{;;}{ ;};{;;{;;};};;{;}{;};;;;;;;;;;;;;;;{;;;}{;}}; wp-settings.php : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;{;;}{;};;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;{;;;};{;};{{;};};;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;{; ;};;;;;{{;;};}; wp-signup.php : ;;;{;;}{;};{;}{;;}{;;};{{;;}{;}{;;;;;}{;;;}{;;}{;;;;}{; }{;;;;;}};;;{;;;{};;{;;;}{};;{};{};;}{;;;}{;{;};;;{}{;};}{;}{;;{;};;;;; {;};;{{;;}};;;}{;;;;;{;;};;;;;;}{{}{}{};;;}{;;;;;;;;;;;{}{}{}}{;;{;;}{; ;};;;}{;;}{;;;;;;;;;;}{;;{;;};;{;;};;;;;;}{{}{}{};;;;;};;;;;;;;;;;;{;}{ ;;;;}{;{;;;;;;;;;;;;;;{;;;};}};; wp-trackback.php : {;;}{;;{;;;;;;}{;;;;}};{;;};;;;;;;;{;;;};;;;;{;;}{;; ;;;;;;;;;;;;;;;} wp-activate.php : ;;;{;;};;{;};{{;}{;;}{;}{;}{;;;;;}};;{;}{;;{{;;;{;; ;}{;;;};}{;;}}{;;;;;;;;;;}};;;
产生签名除了Ward在其文中提到的perl脚本,还可以使用一下的shell脚本或php程序。
Shell脚本
for i in *.php; do
echo -n "$i: "
sed \'s/[^{};]//g\' $i | tr -d \'\n\'
echo
done
PHP程序实现函数签名
<?php
/* Get all PHP files in the current directory */
$dir = \'./*.php\';
/* Use the SPL Iterator class */
$files = new GlobIterator($dir);
/* Get the signature of each file */
foreach ($files as $file) {
$data = file_get_contents($file);
preg_match_all(\'/[{};]/\',$data,$out);
$signature = \'\';
foreach($out[0] as $line) {
$signature .= $line;
}
echo $file->getFilename() . " : " . $signature . "\n";
}
此外,我们还可以通过输出成HTML,并带有每个源文件的链接,来使得输出更吸引人、更友好。