Connaissez-vous de bons outils pour bien formater du code PHP désordonné? De préférence, un script pour Aptana/Eclipse, mais un outil autonome fera aussi.
PHP Code Beautifier est un outil gratuit et utile qui devrait faire ce que vous voulez, bien que leur page de téléchargement nécessite qu'un compte soit créé.
L'outil a été décliné en 3 versions:
- Une version graphique permettant de traiter le fichier de manière visuelle.
- Une version en ligne de commande qui permet d’être mise en batch ou intégrée avec d’autres outils (CVS, Subversion, IDE ...).
- En tant qu'outil intégré de PHPEdit.
En gros, ça va tourner:
if($code == BAD){$action = REWRITE;}else{$action = KEEP;}
for($i=0; $i<10;$i++){while($j>0){$j++;doCall($i+$j);if($k){$k/=10;}}}
dans
if ($code == BAD) {
$action = REWRITE;
} else {
$action = KEEP;
}
for($i = 0; $i < 10;$i++) {
while ($j > 0) {
$j++;
doCall($i + $j);
if ($k) {
$k /= 10;
}
}
}
Eh bien voici mon script très basique et rudimentaire:
#!/usr/bin/php
<?php
class Token {
public $type;
public $contents;
public function __construct($rawToken) {
if (is_array($rawToken)) {
$this->type = $rawToken[0];
$this->contents = $rawToken[1];
} else {
$this->type = -1;
$this->contents = $rawToken;
}
}
}
$file = $argv[1];
$code = file_get_contents($file);
$rawTokens = token_get_all($code);
$tokens = array();
foreach ($rawTokens as $rawToken) {
$tokens[] = new Token($rawToken);
}
function skipWhitespace(&$tokens, &$i) {
global $lineNo;
$i++;
$token = $tokens[$i];
while ($token->type == T_WHITESPACE) {
$lineNo += substr($token->contents, "\n");
$i++;
$token = $tokens[$i];
}
}
function nextToken(&$j) {
global $tokens, $i;
$j = $i;
do {
$j++;
$token = $tokens[$j];
} while ($token->type == T_WHITESPACE);
return $token;
}
$OPERATORS = array('=', '.', '+', '-', '*', '/', '%', '||', '&&', '+=', '-=', '*=', '/=', '.=', '%=', '==', '!=', '<=', '>=', '<', '>', '===', '!==');
$IMPORT_STATEMENTS = array(T_REQUIRE, T_REQUIRE_ONCE, T_INCLUDE, T_INCLUDE_ONCE);
$CONTROL_STRUCTURES = array(T_IF, T_ELSEIF, T_FOREACH, T_FOR, T_WHILE, T_SWITCH, T_ELSE);
$WHITESPACE_BEFORE = array('?', '{', '=>');
$WHITESPACE_AFTER = array(',', '?', '=>');
foreach ($OPERATORS as $op) {
$WHITESPACE_BEFORE[] = $op;
$WHITESPACE_AFTER[] = $op;
}
$matchingTernary = false;
// First pass - filter out unwanted tokens
$filteredTokens = array();
for ($i = 0, $n = count($tokens); $i < $n; $i++) {
$token = $tokens[$i];
if ($token->contents == '?') {
$matchingTernary = true;
}
if (in_array($token->type, $IMPORT_STATEMENTS) && nextToken($j)->contents == '(') {
$filteredTokens[] = $token;
if ($tokens[$i + 1]->type != T_WHITESPACE) {
$filteredTokens[] = new Token(array(T_WHITESPACE, ' '));
}
$i = $j;
do {
$i++;
$token = $tokens[$i];
if ($token->contents != ')') {
$filteredTokens[] = $token;
}
} while ($token->contents != ')');
} elseif ($token->type == T_ELSE && nextToken($j)->type == T_IF) {
$i = $j;
$filteredTokens[] = new Token(array(T_ELSEIF, 'elseif'));
} elseif ($token->contents == ':') {
if ($matchingTernary) {
$matchingTernary = false;
} elseif ($tokens[$i - 1]->type == T_WHITESPACE) {
array_pop($filteredTokens); // Remove whitespace before
}
$filteredTokens[] = $token;
} else {
$filteredTokens[] = $token;
}
}
$tokens = $filteredTokens;
function isAssocArrayVariable($offset = 0) {
global $tokens, $i;
$j = $i + $offset;
return $tokens[$j]->type == T_VARIABLE &&
$tokens[$j + 1]->contents == '[' &&
$tokens[$j + 2]->type == T_STRING &&
preg_match('/[a-z_]+/', $tokens[$j + 2]->contents) &&
$tokens[$j + 3]->contents == ']';
}
// Second pass - add whitespace
$matchingTernary = false;
$doubleQuote = false;
for ($i = 0, $n = count($tokens); $i < $n; $i++) {
$token = $tokens[$i];
if ($token->contents == '?') {
$matchingTernary = true;
}
if ($token->contents == '"' && isAssocArrayVariable(1) && $tokens[$i + 5]->contents == '"') {
/*
* Handle case where the only thing quoted is the assoc array variable.
* Eg. "$value[key]"
*/
$quote = $tokens[$i++]->contents;
$var = $tokens[$i++]->contents;
$openSquareBracket = $tokens[$i++]->contents;
$str = $tokens[$i++]->contents;
$closeSquareBracket = $tokens[$i++]->contents;
$quote = $tokens[$i]->contents;
echo $var . "['" . $str . "']";
$doubleQuote = false;
continue;
}
if ($token->contents == '"') {
$doubleQuote = !$doubleQuote;
}
if ($doubleQuote && $token->contents == '"' && isAssocArrayVariable(1)) {
// don't echo "
} elseif ($doubleQuote && isAssocArrayVariable()) {
if ($tokens[$i - 1]->contents != '"') {
echo '" . ';
}
$var = $token->contents;
$openSquareBracket = $tokens[++$i]->contents;
$str = $tokens[++$i]->contents;
$closeSquareBracket = $tokens[++$i]->contents;
echo $var . "['" . $str . "']";
if ($tokens[$i + 1]->contents != '"') {
echo ' . "';
} else {
$i++; // process "
$doubleQuote = false;
}
} elseif ($token->type == T_STRING && $tokens[$i - 1]->contents == '[' && $tokens[$i + 1]->contents == ']') {
if (preg_match('/[a-z_]+/', $token->contents)) {
echo "'" . $token->contents . "'";
} else {
echo $token->contents;
}
} elseif ($token->type == T_ENCAPSED_AND_WHITESPACE || $token->type == T_STRING) {
echo $token->contents;
} elseif ($token->contents == '-' && in_array($tokens[$i + 1]->type, array(T_LNUMBER, T_DNUMBER))) {
echo '-';
} elseif (in_array($token->type, $CONTROL_STRUCTURES)) {
echo $token->contents;
if ($tokens[$i + 1]->type != T_WHITESPACE) {
echo ' ';
}
} elseif ($token->contents == '}' && in_array($tokens[$i + 1]->type, $CONTROL_STRUCTURES)) {
echo '} ';
} elseif ($token->contents == '=' && $tokens[$i + 1]->contents == '&') {
if ($tokens[$i - 1]->type != T_WHITESPACE) {
echo ' ';
}
$i++; // match &
echo '=&';
if ($tokens[$i + 1]->type != T_WHITESPACE) {
echo ' ';
}
} elseif ($token->contents == ':' && $matchingTernary) {
$matchingTernary = false;
if ($tokens[$i - 1]->type != T_WHITESPACE) {
echo ' ';
}
echo ':';
if ($tokens[$i + 1]->type != T_WHITESPACE) {
echo ' ';
}
} elseif (in_array($token->contents, $WHITESPACE_BEFORE) && $tokens[$i - 1]->type != T_WHITESPACE &&
in_array($token->contents, $WHITESPACE_AFTER) && $tokens[$i + 1]->type != T_WHITESPACE) {
echo ' ' . $token->contents . ' ';
} elseif (in_array($token->contents, $WHITESPACE_BEFORE) && $tokens[$i - 1]->type != T_WHITESPACE) {
echo ' ' . $token->contents;
} elseif (in_array($token->contents, $WHITESPACE_AFTER) && $tokens[$i + 1]->type != T_WHITESPACE) {
echo $token->contents . ' ';
} else {
echo $token->contents;
}
}
http://en.sourceforge.jp/projects/pdt-tools/
^^^ vous donnera un formateur CTRL + SHIFT + F approprié Eclipse/Aptana PHP comme Java.
Voir ici pour l’aide à l’installation.
Il existe un module pear qui formate votre code. PHP Beautifier
Si vous utilisez Zend Development Environment, vous pouvez utiliser la fonctionnalité Indent Code (Ctrl + Maj + F).
Voici une classe d'embellisseur de code php (PHP bien sûr):
http://www.codeassembly.com/A-php-code-beautifier-that-works/
et
démo en ligne:
Utilisez NetBeans PHP et appuyez sur alt + shift + f.
L'environnement de développement Zend est maintenant un plugin Eclipse, vous pourrez peut-être l'exécuter parallèlement à Aptana et utiliser simplement sa fonctionnalité Indent Code.
Je n'ai pas encore migré moi-même vers le plugin Eclipse, j'aime tellement le précédent ZDE. Bien que maintenant que j'ai commencé à utiliser Eclipse pour d'autres langues, je suis presque prêt à faire le saut.
La solution la plus simple consiste simplement à utiliser un IDE doté de cette fonctionnalité. Si vous écrivez du code régulièrement dans PHP, laissez simplement tomber $ 60 pour PHPStorm. Vous ne le regretterez pas.
http://www.jetbrains.com/phpstorm/
Il vous permet de formater votre code comme bon vous semble à l’aide d’un simple raccourci clavier au niveau du fichier ou du répertoire, et offre de nombreuses autres fonctionnalités intéressantes.
Qu'en est-il de celui-ci:
http://universalindent.sourceforge.net/
Il combine un grand nombre de formateurs et génère les scripts dont vous avez besoin pour que vous puissiez les distribuer et que les membres de votre équipe les utilisent avant de les valider la prochaine fois. inutilisable...
phpformatter.com fonctionne mieux
"Ce formateur en ligne gratuit PHP est conçu pour que vous puissiez embellir tout votre script PHP avec le style que vous préférez"
Notre PHP Formatter formatera votre code de manière fiable. Il utilise un système frontal basé sur un compilateur pour analyser le code afin d'éviter toute interprétation erronée du code. Par conséquent, sa sortie formatée toujours fonctionne.
Ceci est une excellente question. J'ai une application qui lit JSON et génère des sorties php, html et css. Je lance un programme et génère des dizaines (des centaines?) De fichiers. J'espère que la réponse ici est utile.
J'ai commencé mon projet en utilisant heredocs, des fichiers d'inclusion spéciaux, des méta-caractères, etc., mais cela est rapidement devenu un gâchis. Je voulais une solution autonome qui ne nécessite ni framework ni ide. J'ai donc supprimé tous les fichiers indésirables hérédoc et autres et créé une classe générique de mise en mémoire tampon du texte sans souci de formatage. Tout peut être une ligne pour tout ce qui m'importe. Pour le HTML, je fais tidy () intégré. Pour php, j'utilise phpstylist . phpstylist est plus vieux mais fonctionne toujours bien pour le format php.
Pour configurer les options de phpstylist j'avais utilisé UniversalIndent (mis à jour en janvier 2012) dans Windows gui.
UniversalStylist répertorie 24 (!) Programmes de formatage (c, php, ruby, html, ...). Il connaît spécifiquement les options de phpstylist et vous donne une actualisation en direct sur un fichier lorsque vous activez et désactivez les options. Très bien. Ensuite, lorsque vous avez votre style, il a une option pour enregistrer les options de ligne de commande et génère un script. Pour certaines options de formatage, vous devrez ajouter des chemins à Perl, python, etc.
Si vous utilisez Windows et que vous voulez essayer phpstylist avec UniversalIndent, ajoutez simplement un répertoire pour php.exe à votre chemin env. J'utilise ampps donc le mien est réglé sur c:\ampps\php.
Il n'a pas été très facile de trouver une bonne solution solide. Je souhaite également savoir ce que font les autres utilisateurs pour un formatage par lots aussi simple que possible des fichiers php/html générés automatiquement à des fins de révision du code et d'archivage.