2010-12-02 5 views
1

Je dois compter le nombre de lignes de code dans mon application (en PHP, pas en ligne de commande), et puisque les extraits sur le web n'ont pas beaucoup aidé, J'ai décidé de demander ici. Merci pour toute réponse!PHP - Comment compter les lignes de code dans une application

EDIT

En fait, je besoin de l'extrait complet pour la numérisation et les lignes de comptage dans un dossier donné. J'utilise cette méthode dans CakePHP, donc j'apprécierais une intégration transparente.

+2

Voulez-vous que les lignes réelles de code? Y compris/excluant les commentaires? Inc/Exc blanks? Inc/Exc cordes multilignes? Il y a beaucoup de définitions différentes de "ligne" quand il s'agit de code source. –

+0

Toutes les lignes, qu'elles contiennent du code, des commentaires ou sont vides. – linkyndy

Répondre

5

Pour ce faire sur un répertoire, j'utiliser un itérateur.

function countLines($path, $extensions = array('php')) { 
    $it = new RecursiveIteratorIterator(
     new RecursiveDirectoryIterator($path) 
    ); 
    $files = array(); 
    foreach ($it as $file) { 
     if ($file->isDir() || $file->isDot()) { 
      continue; 
     } 
     $parts = explode('.', $file->getFilename()); 
     $extension = end($parts); 
     if (in_array($extension, $extensions)) { 
      $files[$file->getPathname()] = count(file($file->getPathname())); 
     } 
    } 
    return $files; 
} 

Cela retournera un tableau avec chaque fichier comme clé et le nombre de lignes comme valeur. Ensuite, si vous voulez seulement un total, il suffit de faire array_sum(countLines($path)); ...

+0

Merci pour votre réponse. Je n'ai pas vraiment compris ce que fait la classe RecursiveIteratorIterator et si elle pourrait être remplacée par quelque chose qui pourrait facilement s'intégrer avec CakePHP (Comme je l'ai mentionné dans la question, j'apprécierais de ne pas inclure d'autres classes étrangères dans mon application). – linkyndy

+0

La classe 'foreign' fait partie de PHP elle-même. En ce qui concerne l'intégration avec Cake, vous ne pouvez pas obtenir beaucoup plus simple que copier-coller cette fonction. – salathe

+0

@linkyndy: 'RecursiveIteratorIterator' et' RecursiveDirectoryIterator' sont tous deux [core PHP classes] (http://us.php.net/manual/en/spl.iterators.php) depuis 'PHP 5.0.0'. Il n'y a pas besoin d'inclure des classes étrangères. Il suffit de copier et de dépasser le code ci-dessus et cela fonctionnera pour n'importe quel framework (puisqu'il ne s'agit que de PHP brut) ... – ircmaxell

4

Vous pouvez utiliser la fonction file pour lire le fichier, puis count:

$c = count(file('filename.php')); 
+0

+1 Testé et essayé! – systemovich

+0

J'ai modifié la question car elle n'était pas très claire :) – linkyndy

0

un peu sale, mais vous pouvez également utiliser le système/exec/passthru wc -l *

+0

J'ai mentionné que j'avais besoin d'un extrait PHP, pas d'une ligne de commande. Pardon! – linkyndy

1

classes PHP a une classe agréable pour les lignes de comptage pour les fichiers php dans un répertoire:

http://www.phpclasses.org/package/1091-PHP-Calculates-the-total-lines-of-code-in-a-directory.html

Vous Vous pouvez spécifier les types de fichiers que vous voulez vérifier en haut de la classe.

+0

Nous vous remercions de votre suggestion, mais puisque j'intègre cette fonction dans CakePHP, il serait plus approprié de ne pas importer une classe séparée pour y parvenir :) – linkyndy

+0

Vous pouvez toujours regarder le code et implémenter les parties que vous voulez, c'est assez petit :-) – wajiw

2
 
$fp = "file.php"; 
$lines = file($fp); 
echo count($lines); 
+0

J'ai édité la question car elle n'était pas très claire :) – linkyndy

3

En utilisant le code de ircmaxell, j'ai fait une classe simple hors de lui, il fonctionne très bien pour moi maintenant

<?php 
class Line_Counter 
{ 
    private $filepath; 
    private $files = array(); 

    public function __construct($filepath) 
    { 
     $this->filepath = $filepath; 
    } 

    public function countLines($extensions = array('php')) 
    { 
     $it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($this->filepath)); 
     foreach ($it as $file) 
     { 
      // if ($file->isDir() || $file->isDot()) 
      if ($file->isDir()) 
      { 
       continue; 
      } 
      $parts = explode('.', $file->getFilename()); 
      $extension = end($parts); 
      if (in_array($extension, $extensions)) 
      { 
       $files[$file->getPathname()] = count(file($file->getPathname())); 
      } 
     } 
     return $files; 
    } 

    public function showLines() 
    { 
     echo '<pre>'; 
     print_r($this->countLines()); 
     echo '</pre>'; 
    } 

    public function totalLines() 
    { 
     return array_sum($this->countLines()); 
    } 

} 

// Get all files with line count for each into an array 
$loc = new Line_Counter('E:\Server\htdocs\myframework'); 
$loc->showLines(); 

echo '<br><br> Total Lines of code: '; 
echo $loc->totalLines(); 

?> 
+0

Merci pour le partage! – linkyndy

+0

D'accord, merci de partager cela! – Andrew

Questions connexes