Maison  >  Article  >  développement back-end  >  Façons d'améliorer la qualité du code PHP

Façons d'améliorer la qualité du code PHP

小云云
小云云original
2018-03-08 14:27:121681parcourir

En tant que programmeur PHP, j'espère bien sûr que la qualité de mon code PHP est très élevée. Cet article partage principalement avec vous des méthodes pour améliorer la qualité du code PHP, dans l'espoir d'aider tout le monde.

1. N'utilisez pas de chemins relatifs

Vous voyez souvent :

require_once('../../lib/some_class.php');

Cette méthode présente de nombreux défauts :

Il recherche d'abord le chemin d'inclusion php spécifié, puis recherche le répertoire actuel

Donc, trop de chemins seront vérifiés

Si le script est inclus par un script. dans un autre répertoire, c'est essentiellement Le répertoire devient le répertoire où se trouve un autre script.

Autre problème, lorsque la tâche planifiée exécute le script, son répertoire parent peut ne pas être le répertoire de travail.

Le meilleur choix est donc Utiliser des chemins absolus :

define('ROOT' , '/var/www/project/');require_once(ROOT . '../../lib/some_class.php');//rest of the code

Nous avons défini un chemin absolu et la valeur est codée en dur. Nous pouvons également l'améliorer. Le chemin /var/www/project peut également changer, donc nous devons le faire à chaque fois Le changer ? Non, nous pouvons utiliser la constante __FILE__, comme :

//suppose your script is /var/www/project/index.php//Then __FILE__ will always have that full path.define('ROOT' , pathinfo(__FILE__, PATHINFO_DIRNAME));require_once(ROOT . '../../lib/some_class.php');//rest of the code

Maintenant, quel que soit le répertoire vers lequel vous vous déplacez, comme le déplacement vers un serveur externe, le code n'a pas besoin d'être modifié. Exécutez correctement.

2. N'utilisez pas directement require, include, include_once, require_once

Vous pouvez introduire plusieurs fichiers en tête du script, tels que comme les bibliothèques de classes, les fichiers d'outils et les fonctions d'assistance, telles que :

require_once('lib/Database.php');require_once('lib/Mail.php');require_once('helpers/utitlity_functions.php');

Cette utilisation est assez primitive. Elle devrait être plus flexible. Un fichier d'inclusion de fonction d'assistance doit être écrit par exemple :

<.>
function load_class($class_name){    //path to the class file
    $path = ROOT . &#39;/lib/&#39; . $class_name . &#39;.php&#39;);    require_once( $path );
}

load_class(&#39;Database&#39;);
load_class(&#39;Mail&#39;);
Y a-t-il une différence ? Ce code est plus fiable. Lisibilité.

Vous pouvez étendre cette fonction si nécessaire à l'avenir, par exemple :

function load_class($class_name){    //path to the class file
    $path = ROOT . &#39;/lib/&#39; . $class_name . &#39;.php&#39;);    if(file_exists($path))
    {        require_once( $path );
    }
}
Vous pouvez également le faire plus :

Trouver plusieurs répertoires pour le même fichier

Le répertoire dans lequel sont placés les fichiers de classe peut être facilement modifié sans modifier le code un par un

Vous pouvez utiliser des fichiers similaires. fonctions pour charger des fichiers, tels que du contenu HTML.

3 . Conservez le code de débogage pour votre application

Dans l'environnement de développement, nous imprimons les requêtes de base de données, vidons les valeurs de variables problématiques et une fois le problème résolu. résolus, nous les commentons ou les supprimons. Cependant, une meilleure approche consiste à continuer à déboguer le code.

Dans l'environnement de développement, vous pouvez :

define(&#39;ENVIRONMENT&#39; , &#39;development&#39;);if(! $db->query( $query )
{    if(ENVIRONMENT == &#39;development&#39;)
    {        echo "$query failed";
    }    else
    {        echo "Database error. Please contact administrator";
    }
}
Dans le serveur, vous pouvez :

define(&#39;ENVIRONMENT&#39; , &#39;production&#39;);if(! $db->query( $query )
{    if(ENVIRONMENT == &#39;development&#39;)
    {        echo "$query failed";
    }    else
    {        echo "Database error. Please contact administrator";
    }
}
4. Utiliser les commandes d'exécution de fonctions multiplateformes

system, exec, passthru, shell_exec Ces 4 fonctions peuvent être utilisées pour exécuter des commandes système. Le comportement de chacune est légèrement différent. Le problème est que dans un hébergement partagé, certaines fonctions peuvent être désactivées de manière sélective. La plupart des débutants ont tendance à vérifier d'abord quelle fonction est disponible à chaque fois avant de l'utiliser

Une meilleure solution consiste à encapsuler la fonction dans une multiplateforme. function.

/**
	Method to execute a command in the terminal
	Uses :	1. system
	2. passthru	3. exec
	4. shell_exec

*/
function terminal($command)
{
	//system
	if(function_exists(&#39;system&#39;))
	{
		ob_start();
		system($command , $return_var);
		$output = ob_get_contents();
		ob_end_clean();
	}
	//passthru
	else if(function_exists(&#39;passthru&#39;))
	{
		ob_start();
		passthru($command , $return_var);
		$output = ob_get_contents();
		ob_end_clean();
	}

	//exec
	else if(function_exists(&#39;exec&#39;))
	{
		exec($command , $output , $return_var);
		$output = implode("\n" , $output);
	}

	//shell_exec
	else if(function_exists(&#39;shell_exec&#39;))
	{
		$output = shell_exec($command) ;
	}

	else
	{
		$output = &#39;Command execution not possible on this system&#39;;
		$return_var = 1;
	}

	return array(&#39;output&#39; => $output , &#39;status&#39; => $return_var);
}

terminal(&#39;ls&#39;);
La fonction ci-dessus exécutera la commande shell tant qu'une fonction système est disponible, qui maintient la cohérence du code

5. 🎜>

Utilisez la fonction ci-dessus pour ajouter un seul élément . Et lors de l'ajout d'éléments à la liste, faut-il créer une autre fonction Non, à condition de faire un peu attention aux différents types de paramètres ? , ce sera plus flexible. Par exemple :
function add_to_cart($item_id , $qty){
    $_SESSION[&#39;cart&#39;][&#39;item_id&#39;] = $qty;
}

add_to_cart( &#39;IPHONE3&#39; , 2 );

Maintenant, la même fonction peut traiter différents types de paramètres d'entrée. Vous pouvez vous référer à l'exemple ci-dessus pour refactoriser plusieurs de vos codes afin de les rendre plus intelligents. .
function add_to_cart($item_id , $qty){    if(!is_array($item_id))
    {
        $_SESSION[&#39;cart&#39;][&#39;item_id&#39;] = $qty;
    }    else
    {        foreach($item_id as $i_id => $qty)
        {
            $_SESSION[&#39;cart&#39;][&#39;i_id&#39;] = $qty;
        }
    }
}

add_to_cart( &#39;IPHONE3&#39; , 2 );
add_to_cart( array(&#39;IPHONE3&#39; => 2 , &#39;IPAD&#39; => 5) );

6. Ignorer délibérément la balise de fermeture php

Je veux vraiment savoir pourquoi Tant d'articles de blog sur les conseils php ne le mentionnent pas.

Ceci vous fera gagner beaucoup de temps. Donnons un exemple :
<?phpecho "Hello";//Now dont close this tag

Un fichier super_class.php

index.php
<?phpclass super_class{    function super_function()
    {        //super code
    }
}?>//super extra character after the closing tag

Dans ce cas, vous Vous obtiendrez une erreur Headers déjà envoyé. Pourquoi ? Parce que le « caractère super supplémentaire » a été affiché. Cela prendra beaucoup de temps pour trouver l'emplacement du super supplémentaire. Prenez donc l'habitude d'omettre le caractère de clôture :
require_once(&#39;super_class.php&#39;);//echo an image or pdf , or set the cookies or session data

Ce sera mieux.

7. Collectez toutes les entrées quelque part et envoyez-les immédiatement au navigateur
<?phpclass super_class{    function super_function()
    {        //super code
    }
}//No closing tag

C'est ce qu'on appelle la mise en mémoire tampon de sortie. Si vous avez du contenu de sortie dans différentes fonctions :

Alternativement, collectez la sortie de manière centralisée quelque part. Vous pouvez la stocker dans une variable locale de la fonction, ou vous pouvez utiliser ob_start et ob_end_clean comme suit :

function print_header(){    echo "<p id=&#39;header&#39;>Site Log and Login links</p>";
}function print_footer(){    echo "<p id=&#39;footer&#39;>Site was made by me</p>";
}

print_header();for($i = 0 ; $i < 100; $i++)
{    echo "I is : $i <br />&#39;;
}
print_footer();
Pourquoi la mise en mémoire tampon de sortie est nécessaire :

<.>>>Vous pouvez modifier la sortie avant de l'envoyer au navigateur. Par exemple, la fonction str_replaces ou peut-être preg_replaces ou ajouter du contenu HTML de surveillance/débogage.

function print_header(){
    $o = "<p id=&#39;header&#39;>Site Log and Login links</p>";    return $o;
}function print_footer(){
    $o = "<p id=&#39;footer&#39;>Site was made by me</p>";    return $o;
}echo print_header();for($i = 0 ; $i < 100; $i++)
{    echo "I is : $i <br />&#39;;
}
echo print_footer();
>>Sortie vers le navigateur. et faites-le en même temps. Le traitement de PHP est terrible. Vous auriez dû voir des messages d'erreur apparaître dans la barre latérale ou au milieu de certains sites. Une idée de pourquoi cela se produit car le traitement et la sortie sont mélangés.

8. les informations d'en-tête de type MIME correctes, si vous produisez du contenu non HTML

Sortie du XML

Fonctionne bien

. Faites attention à la ligne d'en-tête. Cette ligne indique au navigateur que ce qui est envoyé est un contenu de type XML. De nombreuses bibliothèques javascript s'appuient également sur les informations d'en-tête.
$xml = &#39;<?xml version="1.0" encoding="utf-8" standalone="yes"?>&#39;;
$xml = "<response>
  <code>0</code>
</response>";//Send xml dataecho $xml;

Les bibliothèques similaires incluent javascript, css. , image jpg, image png :

$xml = &#39;<?xml version="1.0" encoding="utf-8" standalone="yes"?>&#39;;
$xml = "<response>
  <code>0</code>
</response>";//Send xml dataheader("content-type: text/xml");echo $xml;
JavaScript

CSS

J'ai rencontré une fois que l'encodage unicode/utf-8 était défini dans la table mysql, et phpadmin pourrait également l'afficher correctement, mais lorsque vous obtenez le contenu et l'affichez sur la page, des caractères tronqués apparaîtront ici. Le problème réside dans l'encodage des caractères de la connexion mysql
header("content-type: application/x-javascript");
echo "var a = 10";

Une fois. vous vous connectez à la base de données, il est préférable de définir le jeu de caractères de la connexion. Si votre application doit prendre en charge plusieurs langues, c'est un must.
header("content-type: text/css");echo "#p id { background:#000; }";

Utilisez des entités html pour définir les options d'encodage correctes

.
//Attempt to connect to database$c = mysqli_connect($this->host , $this->username, $this->password);//Check connection validityif (!$c) 
{	die ("Could not connect to the database host: <br />". mysqli_connect_error());
}//Set the character set of the connectionif(!mysqli_set_charset ( $c , &#39;UTF8&#39; ))
{	die(&#39;mysqli_set_charset() failed&#39;);
}
Avant php5.4, l'encodage par défaut des caractères est ISO-8859-1, qui ne peut pas être sorti directement comme À âetc

.

$value = htmlentities($this->value , ENT_QUOTES , CHARSET);

php5.4以后, 默认编码为UTF-8, 这將解决很多问题. 但如果你的应用是多语言的, 仍然要留意编码问题,.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn