- <?php
- /**
- * @author xiaoxiao <[email protected]> 2011-1-12
- * @link http://xiaoyaoxia.cnblogs.com/
- * @license
- * 統計目錄下的文件行數及總文件數··去除注釋
- */
- $obj = new CaculateFiles();
- //如果設置為false,這不會顯示每個文件的信息,否則顯示
- $obj->setShowFlag(false);
- //會跳過所有All開頭的文件
- $obj->setFileSkip(array('All'));
- $obj->run("D:\PHPAPP\php\_tests");
- //所有文件,(默認格式為.php)
- $obj->setFileSkip(array());
- $obj->run("D:\PHPAPP\php");
- $obj->setShowFlag(true);
- //跳過所有I和A開頭的文件,(比如接口和抽象類開頭)
- $obj->setFileSkip(array('I', 'A'));
- $obj->run("D:\PHPAPP\php");
- /**
- * 執行目錄中文件的統計(包括文件數及總行數
- *
- * 1、跳過文件的時候:
- * 匹配的規則只是從文件名上著手,匹配的規則也僅限在開頭。
- * 2、跳過文件中的注釋行:
- * 匹配的規則只是從注釋段落的頭部匹配,如果出現// 及 *及 #及/*開頭的行及空行會被跳過。所以類似/*這種多汗注釋,每行的開頭都必須加上*號,否則無法匹配到這種的注釋。
- * 3、目錄過濾:
- * 匹配的規則是從目錄名的全名匹配
- */
- class CaculateFiles {
- /**
- * 統計的后綴
- */
- private $ext = ".php";
- /**
- * 是否顯示每個文件的統計數
- */
- private $showEveryFile = true;
- /**
- * 文件的的跳過規則
- */
- private $fileSkip = array();
- /**
- * 統計的跳過行規則
- */
- private $lineSkip = array("*", "/*", "//", "#");
- /**
- * 統計跳過的目錄規則
- */
- private $dirSkip = array(".", "..", '.svn');
- public function __construct($ext = '', $dir = '', $showEveryFile = true, $dirSkip = array(), $lineSkip = array(), $fileSkip = array()) {
- $this->setExt($ext);
- $this->setDirSkip($dirSkip);
- $this->setFileSkip($fileSkip);
- $this->setLineSkip($lineSkip);
- $this->setShowFlag($showEveryFile);
- $this->run($dir);
- }
- public function setExt($ext) {
- trim($ext) && $this->ext = strtolower(trim($ext));
- }
- public function setShowFlag($flag = true) {
- $this->showEveryFile = $flag;
- }
- public function setDirSkip($dirSkip) {
- $dirSkip && is_array($dirSkip) && $this->dirSkip = $dirSkip;
- }
- public function setFileSkip($fileSkip) {
- $this->fileSkip = $fileSkip;
- }
- public function setLineSkip($lineSkip) {
- $lineSkip && is_array($lineSkip) && $this->lineSkip = array_merge($this->lineSkip, $lineSkip);
- }
- /**
- * 執行統計
- * @param string $dir 統計的目錄
- */
- public function run($dir = '') {
- if ($dir == '') return;
- if (!is_dir($dir)) exit('Path error!');
- $this->dump($dir, $this->readDir($dir));
- }
- /**
- * 顯示統計結果
- * @param string $dir 目錄
- * @param array $result 統計結果(包含總行數,有效函數,總文件數
- */
- private function dump($dir, $result) {
- $totalLine = $result['totalLine'];
- $lineNum = $result['lineNum'];
- $fileNum = $result['fileNum'];
- echo "*************************************************************\r\n<br/>";
- echo $dir . ":\r\n<br/>";
- echo "TotalLine: " . $totalLine . "\r\n<br/>";
- echo "TotalLine with no comment and empty: " . $lineNum . "\r\n<br/>";
- echo 'TotalFiles:' . $fileNum . "\r\n<br/>";
- }
- /**
- * 讀取目錄
- * @param string $dir 目錄
- */
- private function readDir($dir) {
- $num = array('totalLine' => 0, 'lineNum' => 0, 'fileNum' => 0);
- if ($dh = opendir($dir)) {
- while (($file = readdir($dh)) !== false) {
- if ($this->skipDir($file)) continue;
- if (is_dir($dir . '/' . $file)) {
- $result = $this->readDir($dir . '/' . $file);
- $num['totalLine'] += $result['totalLine'];
- $num['lineNum'] += $result['lineNum'];
- $num['fileNum'] += $result['fileNum'];
- } else {
- if ($this->skipFile($file)) continue;
- list($num1, $num2) = $this->readfiles($dir . '/' . $file);
- $num['totalLine'] += $num1;
- $num['lineNum'] += $num2;
- $num['fileNum']++;
- }
- }
- closedir($dh);
- } else {
- echo 'open dir <' . $dir . '> error!' . "\r";
- }
- return $num;
- }
- /**
- * 讀取文件
- * @param string $file 文件
- */
- private function readfiles($file) {
- $str = file($file);
- $linenum = 0;
- foreach ($str as $value) {
- if ($this->skipLine(trim($value))) continue;
- $linenum++;
- }
- $totalnum = count(file($file));
- if (!$this->showEveryFile) return array($totalnum, $linenum);
- echo $file . "\r\n";
- echo 'TotalLine in the file:' . $totalnum . "\r\n";
- echo 'TotalLine with no comment and empty in the file:' . $linenum . "\r\n";
- return array($totalnum, $linenum);
- }
- /**
- * 執行跳過的目錄規則
- * @param string $dir 目錄名
- */
- private function skipDir($dir) {
- if (in_array($dir, $this->dirSkip)) return true;
- return false;
- }
- /**
- * 執行跳過的文件規則
- * @param string $file 文件名
- */
- private function skipFile($file) {
- if (strtolower(strrchr($file, '.')) != $this->ext) return true;
- if (!$this->fileSkip) return false;
- foreach ($this->fileSkip as $skip) {
- if (strpos($file, $skip) === 0) return true;
- }
- return false;
- }
- /**
- * 執行文件中行的跳過規則
- * @param string $string 行內容
- */
- private function skipLine($string) {
- if ($string == '') return true;
- foreach ($this->lineSkip as $tag) {
- if (strpos($string, $tag) === 0) return true;
- }
- return false;
- }
- }
PHP統計目錄下的文件總數及代碼行數(去除注釋及空行)
2019-11-16 13:24PHP教程網 PHP教程
在開發的時候,為了統計開發出的代碼總行數及文件總數,在沒有使用工具的時候,總是要去一個文件一個文件的查找,文件夾層次少還行,層次多的時候就累死人了
延伸 · 閱讀
- 2022-03-10簡單談談centos7中配置php
- 2022-03-06Ubuntu14.04服務器環境下配置PHP7.0+Apache2+Mysql5.7的方
- 2022-03-05centos yum php 7.x 無需刪除升級的方法
- 2022-03-05Centos7下PHP安裝gd庫的實例講解
- 2022-03-03linux環境下安裝PHP的OpenSSL擴展的方法講解
- 2022-03-03C語言實現統計100以內所有素數的個數
- PHP教程
php實現的支持imagemagick及gd庫兩種處理的縮略圖生成類
這篇文章主要介紹了php實現的支持imagemagick及gd庫兩種處理的縮略圖生成類,包含了用法的詳細描述,非常實用,需要的朋友可以參考下...
- PHP教程
php全角字符轉換為半角函數
這篇文章主要介紹了PHP全角半角轉換函數,把目前能找到的所有全角都列出來了一個個替換吧,需要的朋友可以參考下 ...
- PHP教程
php學習之數據類型之間的轉換介紹
php學習之數據類型之間的轉換介紹,學習php的朋友可以參考下。 ...
- PHP教程
PHP中讀取文件的8種方法和代碼實例
這篇文章主要介紹了PHP中讀取文件的8種方法和代碼實例,本文總結了PHP中讀取文件的8個函數,每一個都附有使用例子及注意事項等,需要的朋友可以參考下...
- PHP教程
php學習筆記 數組的常用函數
只要一個變量,需要在多個方法使用,就將這個變量聲明為成員屬性,可以直接在這個對象中的所有方法中使用 成員屬性,相當于這個對象中的全局變量...
- PHP教程
PHP常量DIRECTORY_SEPARATOR原理及用法解析
這篇文章主要介紹了PHP常量DIRECTORY_SEPARATOR原理及用法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友...
- PHP教程
php htmlentities()函數的定義和用法
下面小編就為大家帶來一篇php htmlentities()函數的定義和用法。小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧...
- PHP教程
PHP變量的定義、可變變量、變量引用、銷毀方法
這篇文章主要介紹了PHP變量的定義、可變變量、變量引用、銷毀方法,需要的朋友可以參考下 ...