PHP コードの品質を向上させる方法

小云云
リリース: 2023-03-20 22:22:01
オリジナル
1741 人が閲覧しました

もちろん、PHP プログラマーとして、私は自分の PHP コードの品質が非常に高いことを願っています。この記事では主に PHP コードの品質を向上させる方法を紹介し、皆様のお役に立てれば幸いです。

1. 相対パスを使用しないでください

よく見られます:

require_once('../../lib/some_class.php');
ログイン後にコピー

このメソッドには多くの欠点があります:

最初に指定された php インクルード パスを検索し、次に現在のディレクトリを検索します。パスのチェックが多すぎます。

スクリプトが別のディレクトリのスクリプトに含まれている場合、そのベース ディレクトリは、他のスクリプトが配置されているディレクトリになります。

もう 1 つの問題は、スケジュールされたタスクがスクリプトを実行するときに、その親スクリプトが実行されることです。 directory は作業ディレクトリではない可能性があります。

したがって、絶対パスを使用するのが最良の選択です。

define('ROOT' , '/var/www/project/');require_once(ROOT . '../../lib/some_class.php');//rest of the code
ログイン後にコピー

絶対パスを定義しており、その値は / を改善することもできます。 var/www/project も変更される可能性があります。その場合、毎回変更する必要がありますか? いいえ、次のような __FILE__ 定数を使用できます。

//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
ログイン後にコピー

さて、どのディレクトリに移動しても、外部サーバーの場合、コードは変更せずに正しく実行されます。

2. require、include、include_once、required_once を直接使用しないでください

クラス ライブラリ、ツール ファイル、ヘルパーなど、複数のファイルをスクリプトの先頭に導入できます。

require_once('lib/Database.php');require_once('lib/Mail.php');require_once('helpers/utitlity_functions.php');
ログイン後にコピー

のような関数です。これはより柔軟です。例:

function load_class($class_name){    //path to the class file
    $path = ROOT . '/lib/' . $class_name . '.php');    require_once( $path );
}

load_class('Database');
load_class('Mail');
ログイン後にコピー

これを拡張すると、コードがより読みやすくなります。将来必要に応じて、次のような関数を追加できます:

function load_class($class_name){    //path to the class file
    $path = ROOT . '/lib/' . $class_name . '.php');    if(file_exists($path))
    {        require_once( $path );
    }
}
ログイン後にコピー

その他の操作:​​

同じファイルの複数のディレクトリを検索

コード内で 1 つずつ変更することなく、クラス ファイルが配置されるディレクトリを簡単に変更できます

同様の関数を使用して、HTML コンテンツなどのファイルをロードできます。

3. アプリケーションのコードのデバッグを継続します

開発環境では、データベース クエリを出力し、問題のある変数値をダンプし、問題が解決されたら、ただし、より良い方法は、コードのデバッグを継続することです。

define('ENVIRONMENT' , 'development');if(! $db->query( $query )
{    if(ENVIRONMENT == 'development')
    {        echo "$query failed";
    }    else
    {        echo "Database error. Please contact administrator";
    }
}
ログイン後にコピー

サーバーでは、次のことができます。

define('ENVIRONMENT' , 'production');if(! $db->query( $query )
{    if(ENVIRONMENT == 'development')
    {        echo "$query failed";
    }    else
    {        echo "Database error. Please contact administrator";
    }
}
ログイン後にコピー

4. クロスプラットフォーム関数を使用してコマンドを実行します。

system、exec、passthru、shell_exec これら 4 つの関数は、システム コマンドの実行に使用できます。それぞれの動作は若干異なります。問題は、共有ホスティングでは、ほとんどの初心者が最初に特定の機能を選択的に無効にする傾向があることです。使用する前に、どの関数が利用可能であるかを毎回確認してください。

より良い解決策は、関数をクロスプラットフォーム関数にカプセル化することです

/**
	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('system'))
	{
		ob_start();
		system($command , $return_var);
		$output = ob_get_contents();
		ob_end_clean();
	}
	//passthru
	else if(function_exists('passthru'))
	{
		ob_start();
		passthru($command , $return_var);
		$output = ob_get_contents();
		ob_end_clean();
	}

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

	//shell_exec
	else if(function_exists('shell_exec'))
	{
		$output = shell_exec($command) ;
	}

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

	return array('output' => $output , 'status' => $return_var);
}

terminal('ls');
ログイン後にコピー

利用可能なシステム関数がある限り、上記の関数はシェル コマンドを実行します。コードの一貫性を維持します

5. 関数を柔軟に記述します

項目のリストを追加する場合は、別の関数を作成する必要がありますか?さまざまなタイプのパラメーターに少し注意すると、より柔軟になります。例:

function add_to_cart($item_id , $qty){
    $_SESSION['cart']['item_id'] = $qty;
}

add_to_cart( 'IPHONE3' , 2 );
ログイン後にコピー

これで、同じ関数でさまざまなタイプの入力パラメーターを処理できるようになり、コードの多くの部分をリファクタリングできます。よりスマートにします

6. php の終了タグを意図的に無視します

php に関する提案がこれほどたくさんある理由を知りたいです。

function add_to_cart($item_id , $qty){    if(!is_array($item_id))
    {
        $_SESSION['cart']['item_id'] = $qty;
    }    else
    {        foreach($item_id as $i_id => $qty)
        {
            $_SESSION['cart']['i_id'] = $qty;
        }
    }
}

add_to_cart( 'IPHONE3' , 2 );
add_to_cart( array('IPHONE3' => 2 , 'IPAD' => 5) );
ログイン後にコピー

これでかなりの時間を節約できます。例を見てみましょう:

a super_class.php ファイル

<?phpecho "Hello";//Now dont close this tag
ログイン後にコピー

index.php

<?phpclass super_class{    function super_function()
    {        //super code
    }
}?>//super extra character after the closing tag
ログイン後にコピー

このようにすると、「スーパー余分な文字」が出力されているためです。デバッグ中。スーパー エクストラの場所を見つけるのに時間がかかります。

そのため、終わりの文字を省略する習慣を付けてください:

require_once(&#39;super_class.php&#39;);//echo an image or pdf , or set the cookies or session data
ログイン後にコピー

これにより改善されます。

7. すべての入力をどこかに集めて、一度にブラウザに出力します

異なる関数に出力コンテンツがある場合、これは出力バッファリングと呼ばれます:

<?phpclass super_class{    function super_function()
    {        //super code
    }
}//No closing tag
ログイン後にコピー

または、出力をどこかに集中的に保存することもできます。次のように、ob_start と ob_end_clean を使用することもできます:

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();
ログイン後にコピー

出力バッファリングが必要な理由:

>>str_replaces 関数または preg_replaces または add など、出力を変更できます。 HTML コンテンツの監視/デバッグ

>> ブラウザへの出力と php での処理を同時に行うと、一部のサイトのサイドバーまたは中央にエラー メッセージが表示されるのを見たことがありますか。なぜそれが起こるか知っていますか? 処理と出力が混在しているためです。

非 HTML コンテンツを出力する場合は、正しい MIME タイプのヘッダー情報を送信します。

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();
ログイン後にコピー

ただし、いくつかの改善が必要です。

ヘッダー行に注意してください。この行は、送信されたコンテンツが XML タイプであることをブラウザーに伝えます。そのため、多くの JavaScript ライブラリーには、JavaScript、CSS、jpg 画像なども含まれます。 png 画像:

JavaScript

$xml = &#39;<?xml version="1.0" encoding="utf-8" standalone="yes"?>&#39;;
$xml = "<response>
  <code>0</code>
</response>";//Send xml dataecho $xml;
ログイン後にコピー

CSS

$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;
ログイン後にコピー

以前、mysql テーブルに unicode/utf-8 エンコーディングが設定されており、phpadmin は正しく表示できることに遭遇しましたが、コンテンツを取得してページに出力すると、ここでの問題は、mysql 接続の文字エンコーディングです。

header("content-type: application/x-javascript");
echo "var a = 10";
ログイン後にコピー

アプリケーションが複数の言語をサポートする場合は、接続の文字セットを設定するのが最善です。 . htmlentities を使用して正しいエンコーディング オプションを設定します

php5 .4 より前では、文字のデフォルトのエンコーディングは ISO-8859-1 であり、À â などを直接出力できませんでした。

$value = htmlentities($this->value , ENT_QUOTES , CHARSET);
ログイン後にコピー

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

以上がPHP コードの品質を向上させる方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート