PHP コードの品質を向上させる 36 のヒント (パート 1)

WBOY
リリース: 2016-06-23 13:12:45
オリジナル
934 人が閲覧しました

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


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


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


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


スクリプトがインクルードされている場合。別のディレクトリにスクリプトがある場合、そのベース ディレクトリは、別のスクリプトが配置されているディレクトリになります。それが最善です。オプションは絶対パスを使用することです:


define('ROOT' , '/var/www/project/');

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


//残りのコード


絶対パスを定義しましたが、値はハードコードされています。パス /var/www/project も変更できる可能性があります。変更したいですか? いいえ、次のような __FILE__ 定数を使用できます:


//スクリプトが /var/www/project/index.php

//Then __FILE__ には常にそのフルパスが含まれます。

define('ROOT' , pathinfo(__FILE__, PATHINFO_DIRNAME));

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

//残りのコード


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


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

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

require_once('lib/Database.php ');


require_once( 'lib/Mail.php');

require_once('helpers/utility_functions.php');

この使用法は、より柔軟である必要があります。関数インクルードファイルは次のように記述する必要があります:


functionload_class($class_name)

{

//クラスファイルへのパス

$path = ROOT 。 .php');

require_once( $ path );

}

load_class('Database');


load_class('Mail');


違いは何ですか? コードが読みやすくなりました。 .

将来必要に応じて、次のようにこの関数を拡張できます:

functionload_class($class_name)

{

//クラスファイルへのパス

$path = ROOT 。 '/lib/'。$ class_name。 '。php'); file


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


同様の関数を使用して、HTML コンテンツなどのファイルを読み込むことができます。


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

開発環境では、データベースクエリステートメントを出力し、問題のある変数値をダンプし、問題が解決されたらコメントするか削除します。アプローチは、デバッグ コードを保持することです。 ( $query )

{

if(ENVIRONMENT == '開発')

{

echo "データベースエラー。管理者に連絡してください。";

}

}


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


define('ENVIRONMENT' , 'production');


if(! $db-> ;query ( $query )

{

「データベース」をエコーし​​ます。エラーです。ご連絡ください。管理者" ;

}

}


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


system、exec、passthru、shell_exec これらの 4 つの関数は、システム コマンドを実行するために使用できます。それぞれの動作には微妙な違いがあります。問題は、共有ホスティングでは、特定の機能が選択的に無効になる可能性があることです。


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

);
}

//パススルー

else if(function_exists('passthru'))

{

ob_start();

passthru($command, $return_var) ;

ob_end_clean();

}

//exec

else if(function_exists('exec'))

{

, $output); }

olse

{

$ output = 'このシステムではコマンドの実行不可';コードの一貫性を維持する利用可能なシステム関数がある限り。 _SESSION['cart']['item_id'] = $qty;

}

add _to_cart( 'IPHONE3' , 2);

単一のアイテムを追加する場合は、上記の関数を使用します。アイテムのリストを作成する場合、別の関数を作成しますか? いいえ、さまざまな種類のパラメーターに少し注意を払うと、より柔軟になります。たとえば、

function add_to_cart($item_id , $) qty)

{

if(!is_array($ item_Id))

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 関数が異なる種類の入力パラメータを処理できるようになります。

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

php のアドバイスに関する多くのブログ投稿がなぜ言及されていないのか非常に不思議です。 this.

echo "Hello";

//今はこのタグを閉じないでください

これにより、多くの時間を節約できます:

super_class.php ファイル


class super_class

{

super_function()

{


// スーパーコード

}

}

?> 1 回(' super_class.php' );

//画像または PDF をエコーするか、Cookie またはセッション データを設定します

この方法では、「ヘッダーはすでに送信されています。なぜですか?」というエラーが発生します。 「文字」はすでに出力されています。ここでデバッグを開始する必要があります。これには、スーパー エクストラの場所を見つけるのに多くの時間がかかります。

それでは、終了文字を省略する習慣を身につけてください:

class super_class

{

function super_function()

{

//super code

}

}

//No closing tag


这会更好.


7. 在某地方收集所有输入, 一次输出给浏览器


这称为输出缓冲, 假如说你已在不同的函数输出内容:


function print_header()

{

echo "

";

}

 

function print_footer()

{

    echo "

";

}

 

print_header();

for($i = 0 ; $i < 100; $i++)

{

echo "I is : $i
';

}

print_footer();


替代方案, 在某地方集中收集输出. 你可以存储在函数的局部变量中, 也可以使用ob_start和ob_end_clean. 如下:


function print_header()

{

    $o = "

";

    return $o;

}

 

function print_footer()

{

    $o = "

";

Return $o;

}

echo print_header();

for($i = 0; $i

{

echo "私は : $ i
';

}

echo print_footer();


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


>>出力はブラウザに送信する前に変更できます。 str_replaces などの関数は、preg_replaces であるか、HTML コンテンツの監視/デバッグを追加する可能性があります。


>>PHP 処理中にブラウザに出力すると、サイドバーが表示されるか、エラー メッセージが表示されます。


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


$xml = '';

$xml = "

<

$xml = '';

$xml = "

0< ;/code> ;

";

//xml データを送信

header("content-type: text/xml");

echo $xml;

注意してくださいこの行は、送信される内容が XML タイプのコンテンツであることをブラウザーに伝えるため、多くの JavaScript ライブラリーには

同様のものが含まれます。画像、png 画像:

JavaScript

header("content-type: application/x-javascript");

echo "var a = 10";


CSS


header("content- type : text/css");

echo "#div id {background:#000; }";


9. mysql 接続の正しい文字エンコーディングを設定します

mysqlテーブルにはUnicode/utf-8エンコーディングが設定されており、phpadminでは正しく表示できるのですが、内容を取得してページに出力すると文字化けが発生します。 mysql 接続のエンコーディング


//データベースへの接続を試みます

$c = mysqli_connect($this->host , $this->username, $this->password);

//接続の有効性を確認します

if (! $c) 


{

die ("データベース ホストに接続できませんでした:
".mysqli_connect_error()); }


//接続の文字セットを設定します

if(!mysqli_set_charset ( $c , 'UTF8' ))


{

die('mysqli_set_charset() failed');

}

1回データベースに接続する場合は、接続の文字セットを設定するのが最善です。アプリケーションで複数の言語をサポートしたい場合は、これが必要です。

10. htmlentities を使用して、正しいエンコード オプションを設定します。

php5.4以前では、デフォルトの文字エンコードはISO-8859-1であり、À âなどを直接出力することはできません。

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

php5.4 以降、デフォルトのエンコーディングは UTF-8 になり、多くの問題が解決されます。ただし、アプリケーションが多言語である場合は、エンコーディングの問題に注意する必要があります。

11. アプリケーション内で出力を圧縮するのに gzip を使用しないでください。Apache に処理させてください。PHP はアプリケーションを作成するためにのみ使用することを検討してください。サーバーとブラウザ間のデータ転送の最適化について心配する必要はありません。


Apache の mod_gzip/mod_deflate モジュールを使用してコンテンツを圧縮します。


12. json_encode を使用して動的 JavaScript コンテンツを出力します


よく使う動的 JavaScript コンテンツを出力する php:


$images = array(

'myself.png' , 'friends.png' , ' 同僚.png'

);

$js_code = '';


foreach($images as $image)

{

$js_code .= "'$image' ,";


}

$js_code = 'var image = [' . $js_code ' ]; .png' ,'colleagues.png' ,];

より賢い方法として、 json_encode:

$images = array(

'myself.png' , 'friends.png' , ' 同僚.png'

);

$js_code = 'var image = ' . json_encode($images);

echo $js_code;

//出力は : var image = ["myself.png","friends.png","同僚.png"]


なんてエレガントですか?


13. ファイルを書き込む前に、ディレクトリの書き込み権限を確認してください


ファイルを書き込んだり保存したりする前に、ディレクトリが書き込み可能であることを確認してくださいそうでない場合は、エラー メッセージを書き込んで出力します。これにより、Linux システムでは、ディレクトリのアクセス許可を処理する必要があり、ファイルが読み取れなくなる可能性があります。

アプリケーションがいくつかの重要な情報を出力できるほどスマートであることを確認してください。

$contents = "すべてのコンテンツ";

$file_path = "/var/www/project/content.txt";

file_put_contents($file_path , $contents);

これは一般的に当てはまりますが、次のようないくつかの理由で file_put_contents が失敗することがあります。

>> ;ディレクトリは存在しますが、書き込み可能ではありません


>>ファイルは書き込みロックされていますか?


そのため、ファイルを書き込む前に明示的なチェックを行うことをお勧めします。


$contents = "すべてのコンテンツ ";

$dir = '/var/www/project';

$file_path = $dir . "/content.txt";

if(is_writable( $dir))


{

file_put_contents( $file_path , $contents);

}

else

{

die("ディレクトリ $dir は書き込み可能か存在しません。確認してください");

14. アプリケーションによって作成されたファイルのアクセス許可を変更します。 Linux 環境では、権限の問題により多くの時間が無駄になる可能性があります。今後、ファイルを作成するときは必ず chmod を使用して正しい権限を設定してください。そうでない場合は、ファイルが最初に「php」ユーザーによって作成された可能性があります。しかし、別のユーザーとしてログインすると、システムがアクセスを拒否します。または、ファイルを開くには、root 権限を取得したり、ファイル権限を変更したりする必要があります。

// 所有者の読み取りと書き込み、読み取り他の人のために

chmod("/somedir/somefile", 0644);

// すべては所有者のために、他の人のために読み取って実行します

chmod("/somedir/somefile", 0755);


15. フォームの送信動作を確認するために送信ボタンの値に依存しないでください。


「保存」は他の意味を表す場合があります。したがって、送信ボタンの値に依存しないでください。

if( $_SERVER['REQUEST_METHOD'] == 'POST' and isset($_POST['submit ']) )

{

// 内容を保存します


}

今送信ボタンの値から解放されます

16. 関数内で常に同じ値を持つ変数の場合 静的変数として定義されます


//しばらく遅延します

function late( )

{

$sync_delay = get_option('sync_delay');

echo "< br />$ sync_dlay シーコンズのため遅延しています ... ";;

& & LT; br/& gt;"; しばらく遅延します


function late()

{

static $sync_lay = null;

if($sync_lay == null)

{

$sync_delay = get_option ('sync_delay');

}


c c c c c c & & & & & $



17. $_SESSION 変数を直接使用しないでください

いくつかの簡単な例:


$_SESSION['username'] = $username;


$username = $_SESSION['username'] ;

これにより、複数のアプリケーションが同じドメイン名で実行されている場合、セッション変数が同じセッション キーを使用する可能性があります。たとえば、フロントエンド ポータルとバックエンド。管理システムは同じドメイン名を使用します

今後は、アプリケーション関連のキーとラッパー関数を使用します:

define('APP_ID' , 'abc_corp_ecommerce');

//Functionセッション変数を取得するには

関数 session_get($key)

{

$k = APP_ID 。 「。」 。 $key;

if(isset($_SESSION[$k]))

{

return $_SESSION[$k];

}

return false;

}

/ /Function セッション変数を設定します

function session_set($key , $value)

{

$k = APP_ID . 「。」 。 $key;

$_SESSION[$k] = $value;

return true;

}


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