もちろん、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 tagindex.php
<?phpclass super_class{ function super_function() { //super code } }?>//super extra character after the closing tagこのようにすると、「スーパー余分な文字」が出力されているためです。デバッグ中。スーパー エクストラの場所を見つけるのに時間がかかります。そのため、終わりの文字を省略する習慣を付けてください:
require_once('super_class.php');//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='header'>Site Log and Login links</p>"; }function print_footer(){ echo "<p id='footer'>Site was made by me</p>"; } print_header();for($i = 0 ; $i < 100; $i++) { echo "I is : $i <br />'; } print_footer();出力バッファリングが必要な理由:>>str_replaces 関数または preg_replaces または add など、出力を変更できます。 HTML コンテンツの監視/デバッグ >> ブラウザへの出力と php での処理を同時に行うと、一部のサイトのサイドバーまたは中央にエラー メッセージが表示されるのを見たことがありますか。なぜそれが起こるか知っていますか? 処理と出力が混在しているためです。非 HTML コンテンツを出力する場合は、正しい MIME タイプのヘッダー情報を送信します。
function print_header(){ $o = "<p id='header'>Site Log and Login links</p>"; return $o; }function print_footer(){ $o = "<p id='footer'>Site was made by me</p>"; return $o; }echo print_header();for($i = 0 ; $i < 100; $i++) { echo "I is : $i <br />'; } echo print_footer();ただし、いくつかの改善が必要です。
ヘッダー行に注意してください。この行は、送信されたコンテンツが XML タイプであることをブラウザーに伝えます。そのため、多くの JavaScript ライブラリーには、JavaScript、CSS、jpg 画像なども含まれます。 png 画像:
JavaScript
$xml = '<?xml version="1.0" encoding="utf-8" standalone="yes"?>'; $xml = "<response> <code>0</code> </response>";//Send xml dataecho $xml;
$xml = '<?xml version="1.0" encoding="utf-8" standalone="yes"?>'; $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 サイトの他の関連記事を参照してください。