PHP中的源代码签名(PHP源码学习快速方法)

it2022-05-08  9

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,并带有每个源文件的链接,来使得输出更吸引人、更友好。

 

 

 

转载于:https://www.cnblogs.com/JosephLiu/archive/2011/11/11/2245487.html

相关资源:PHP和MySQL Web开发第4版pdf以及源码

最新回复(0)