ホームページ >バックエンド開発 >PHPチュートリアル >PHP コードの品質を向上させる 36 のヒント (パート 2)

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

WBOY
WBOYオリジナル
2016-06-20 12:33:161478ブラウズ

18. ユーティリティ関数をクラスにカプセル化する


ファイル内に多数のユーティリティ関数を定義する場合:


functionutility_a()

{

//この関数は文字列処理などのユーティリティを実行します

}

functionutility_b()

{

//この関数はデータベース処理のような他のユーティリティなことは行いません

}

functionutility_c()

{

//この関数は...

}


これらの関数の使用はアプリケーション全体に散在しています。


class Utility

{

パブリック静的関数utility_a()

{

}

パブリック静的関数utility_b()

{

}

public static functionutility_c()

{

}

}

//それらを

$a = Utility: :utility_a() として呼び出します。 ;

$b = Utility::utility_b();


明らかな利点は、php に同じ名前の組み込み関数がある場合、これにより競合が回避されます。


別の見方をすると、競合を引き起こすことなく同じクラスの複数のバージョンを維持できるということです。これがカプセル化の基本的な利点です。


19. くだらないヒントの数々


> ;> print の代わりに echo を使用します


>>絶対に必要な場合を除き、preg_replace の代わりに str_replace を使用してください


> ;>短いタグは使用しないでください


>>単純な文字列の場合は二重引用符を一重引用符に置き換えます


>> ヘッド リダイレクトの後に必ず exit を使用してください


>> ループ内で関数を呼び出さないでください


>>isset は strlen より高速です


>>最初から最後まで一貫した書式設定コード


>>ループや if-else 括弧を削除しないでください。


次のようなコードを記述しないでください:


< ;span style="color:#333333;font-family:''Helvetica、Arial、sans-serif'';">if($a == true) $a_count++;


これは絶対に無駄です。


次のように記述します:


if($a == true)

{

$a_count++;

}


一部の構文を省略してコードを短くしないでください。ロジックは短くしてください。


>>構文の強調表示を備えたテキスト エディタを使用すると、エラーを減らすことができます。


20. array_map を使用して配列を迅速に処理します


たとえば、初心者は次のようにすることがあります。


foreach($arr as $c => $v)

{

$arr[$c] = トリム( $v);

}


ただし、array_map を使用する方が簡単です:


$arr = array_map('trim' , $arr) ;


これは、$arr 配列の各要素にトリムを適用します。詳細については、array_walk ドキュメントを参照してください。ヒント。


21. php フィルターを使用してデータを検証します


を使用する必要がありますemail や IP アドレスなどを検証するための正規表現。はい、誰もがそれを使用しています。ここで、入力を検証およびチェックする別の方法を試してみましょう。


22. 強制型チェック


$amount = intval( $_GET['amount'] );

$rate = (int) $_GET['rate'];

これは良い習慣です。


23. 必要に応じて、xdebug などのプロファイラーを使用します


php を使用する場合 大規模なアプリケーションを開発する場合、PHP は多くの計算を必要とし、速度が低下しますプロファイルを使用すると、コードの最適化に役立ちます。


xdebug と webgrid.


24. 大きな配列は慎重に扱う


大きな配列と文字列の処理に注意する よくあるエラーは、配列のコピーによってメモリ オーバーフローが発生することです。 、メモリ サイズの致命的なエラーがスローされます。 情報:


$db_records_in_array_format; //これは、各行に 20 列があるテーブルから 1000 行を保持する大きな配列です。少なくとも 100 バイトなので、合計 1000 * 20 * 100 = 2MB


$cc = $db_records_in_array_format //2MB more

some_function($cc); //さらに 2MB ?


これは、CSV ファイルのインポートまたはエクスポート時によく行われます。


メモリ制限により、上記のコードがスクリプトのクラッシュを頻繁に引き起こすとは考えないでください。小さな変数には問題ありませんが、大きな配列を扱う場合は避けてください。


必ず参照渡しするか、クラス変数に格納してください:


$a = get_large_array();

pass_to_function(&$a );


これを実行した後、(配列をコピーする代わりに) 変数参照を関数に渡します。 >class A

{


function first()

{

$this->a = get_large_array();

$this-> pass_to_function();

}

function pass_to_function()

{

//$this ->a

}

}

メモリを解放し、スクリプトの負担を軽減するために、できるだけ早く設定を解除してください。


25. 最初から最後まで単一のデータベース接続を使用します


スクリプトが最初から一貫していることを確認します常に単一のデータベース接続を使用します。最初に接続を正しく開き、最後まで使用し、最後に接続を閉じないでください。


function add_to_cart()

{

$db = new Database();

$db->query("カートに挿入 .. ...");

}

function empty_cart()

{

$db = new Database();

$db->query("DELETE FROM....");

}

複数の接続の使用接続の作成には時間がかかり、メモリを消費するため、アプリケーションの速度が低下します。


データベース接続などの特定の状況ではシングルトン モードを使用してください。


26. SQL を直接書くのは避け、抽象化する


わざわざ書きすぎる次のようなステートメント:


$query = "INSERT INTO users(name, email , address , Telephone) VALUES('$name' , '$email' , '$address' , '$phone')";

$db-> ;query($query); //mysqli_query() を呼び出します


これにはいくつかの欠点があります。


>> 毎回手動で値をエスケープします


>> クエリが正しいことを確認します


> ;> クエリエラーを特定するには時間がかかります (毎回 if-else で確認しない限り)


> >複雑なクエリを維持するのは難しい


そのため、関数のカプセル化を使用します:


function insert_record($table_name , $data)

{

foreach($data as $key => $value)

{

//mysqli_real_escape_string

$data[$key] = $db->mres($value);

}

$fields = implode(',' , array_keys($data));

$values = "'" 。 ("','" , array_values($data)) . "'";

//最終クエリ

$query = "INSERT INTO {$table} ($fields) VALUES($values)";

return $db->query($query);

}

$data = array('name' = > $name , 'email' => $email , 'address' => $address , 'phone' => $phone);

insert_record('users' , $data);

これは、record_data 関数の方が読みやすく、拡張可能です。


最大の利点は、データが配列に前処理され、構文エラーが検出されることです。


この関数はデータベース クラスのどこかで定義する必要があります。$db->insert_record のように呼び出すことができます。


その方法については、この記事をご覧ください。データベースの操作を簡単にします。


同様に、update、select、delete メソッドも作成できます。試してみてください。


27. データベースの生成 コンテンツを静的ファイルにキャッシュします


すべてのコンテンツがデータベースからフェッチされた場合、それらはキャッシュされる必要があります。生成したら、次回ページをリクエストするときに、データベースをチェックせずにキャッシュから直接取得できます。

利点:


>>> PHP がページ処理に費やす時間を節約し、実行を高速化します


>>>

データベースクエリが少ないほど、mysql 接続のオーバーヘッドが少なくなります

28. セッションをデータベースに保存します


ファイルベースのセッション戦略には多くの制限があります。セッションは単一サーバーに保存されるため、クラスターに拡張することはできません。ただし、データベースには複数のサーバーからアクセスできます。問題を解決できます。

セッション データをデータベースに保存すると、さらに多くの利点があります:

>> ; 同じユーザー名で同時に 2 つの場所にログインできない問題を処理します。オンライン ユーザーのステータスをより簡単に照会できます。 .


29. グローバル変数の使用を避ける

>>defines/ を使用する定数

>>関数を使用して値を取得します

>>クラスを使用し、 $this


30. head 内でベースタグを使用する

聞いたことがない以下をご覧ください:


< ;/body>

ベース タグは非常に便利で、アプリケーションがいくつかのサブディレクトリに分かれており、それらのすべてに次のものが含まれているとします。同じナビゲーション メニュー。

www.domain.com/store/home.php

www.domain。 com/store/products/ipad.php

ホームページでは、次のように記述できます:

ホーム

iPad

しかし、iPad では .php は次のように記述する必要があります:

ホーム

iPad< ;/a>

ディレクトリが異なるため、非常に多くのバージョンのナビゲーション メニューを維持するのは大変です。 >

したがって、base タグを使用してください。



< ;body>

ホーム

iPad

現在、このコードが配置されています。動作はアプリケーションの各ディレクトリ ファイルで一貫しています。

31 は絶対に設定しないでください。 >

E_FATAL エラーは重要です。

ini_set('display_errors', 1);

error_reporting(~E_WARNING & ~E_NOTICE & ~E_STRICT);


32. プラットフォームのアーキテクチャに注意してください

整数の長さが異なりますしたがって、strtotime などの一部の関数は動作が異なります。

64 ビット マシンでは、次の出力が表示されます。


$ php -a

対話型シェル

php > echo strtotime("0000-00-00 00:00:00");


-62170005200

php > echo strtotime('1000-01-30');

-30607739600

php > echo strtotime('2100-01-30');

🎜>4104930600

ただし、32 ビット マシンでは、詳細は bool(false) になります。

33. set_time_limit


最小時間を制限したい場合は、次のようにすることができます。次のスクリプトを使用します:


set_time_limit(30);


//コードの残りの部分


座ってリラックスしてください?システムコール、ソケット操作、データベース操作などの外部実行はすべて set_time_limits の制御下にありません。したがって、データベースに時間がかかる場合でも。

34. 拡張ライブラリの使用


いくつかの例:


>>mPDF -- HTML を通じて PDF ドキュメントを生成できます


> ;>PHPExcel -- Excel の読み取りと書き込み


>>PhpMailer -- 近くのアイテムを含む電子メールの送信を簡単に処理します


>>pChart -- php を使用してレポートを生成します


オープン ソース ライブラリを使用して、PDF、ms-excel ファイル、レポートなど


35. MVC フレームワークを使用します


を使用します。 codeigniter のような MVC フレームワークは、php コードを html から分離するだけです。

>>php を明確に区別します。利点は、デザイナーとプログラマーが同時に作業できることです。

>>オブジェクト指向で設計された関数により、メンテナンスが容易になります。 🎜>

>>組み込み関数が多くの作業を行っているため、繰り返し記述する必要はありません


>>大規模なアプリケーションを開発する必要があります


>> フレームワークによって多くの提案、トリック、ハックが実装されています


36 常に phpbench を参照してください。

phpbench は、基本的な PHP 操作のベンチマーク結果を提供します。いくつかの小さな構文変更が大きな違いを生む可能性があることを示しています。


PHP サイトのコメントを確認し、IRC で質問し、オープンソース コードを時々読みます。