ホームページ >バックエンド開発 >PHPチュートリアル >PHP コードの品質を向上させる 36 のヒント (パート 2)
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 アドレスなどを検証するための正規表現。はい、誰もがそれを使用しています。ここで、入力を検証およびチェックする別の方法を試してみましょう。
$amount = intval( $_GET['amount'] );
$rate = (int) $_GET['rate'];
これは良い習慣です。
php を使用する場合 大規模なアプリケーションを開発する場合、PHP は多くの計算を必要とし、速度が低下しますプロファイルを使用すると、コードの最適化に役立ちます。
xdebug と webgrid.
大きな配列と文字列の処理に注意する よくあるエラーは、配列のコピーによってメモリ オーバーフローが発生することです。 、メモリ サイズの致命的なエラーがスローされます。 情報:
$db_records_in_array_format; //これは、各行に 20 列があるテーブルから 1000 行を保持する大きな配列です。少なくとも 100 バイトなので、合計 1000 * 20 * 100 = 2MB
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
}}
メモリを解放し、スクリプトの負担を軽減するために、できるだけ早く設定を解除してください。
スクリプトが最初から一貫していることを確認します常に単一のデータベース接続を使用します。最初に接続を正しく開き、最後まで使用し、最後に接続を閉じないでください。
function add_to_cart()
{
$db = new Database();
}
function empty_cart()
{
$db = new Database();
$db->query("DELETE FROM....");
}
複数の接続の使用接続の作成には時間がかかり、メモリを消費するため、アプリケーションの速度が低下します。
データベース接続などの特定の状況ではシングルトン モードを使用してください。
わざわざ書きすぎる次のようなステートメント:
$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 メソッドも作成できます。試してみてください。
すべてのコンテンツがデータベースからフェッチされた場合、それらはキャッシュされる必要があります。生成したら、次回ページをリクエストするときに、データベースをチェックせずにキャッシュから直接取得できます。
利点:
>>> PHP がページ処理に費やす時間を節約し、実行を高速化します
>>>
データベースクエリが少ないほど、mysql 接続のオーバーヘッドが少なくなります
28. セッションをデータベースに保存します
ファイルベースのセッション戦略には多くの制限があります。セッションは単一サーバーに保存されるため、クラスターに拡張することはできません。ただし、データベースには複数のサーバーからアクセスできます。問題を解決できます。
セッション データをデータベースに保存すると、さらに多くの利点があります:
>> ; 同じユーザー名で同時に 2 つの場所にログインできない問題を処理します。オンライン ユーザーのステータスをより簡単に照会できます。 .
29. グローバル変数の使用を避ける
>>defines/ を使用する定数
>>関数を使用して値を取得します
>>クラスを使用し、 $this
30. head 内でベースタグを使用する
聞いたことがない以下をご覧ください:
< ;/body>
ベース タグは非常に便利で、アプリケーションがいくつかのサブディレクトリに分かれており、それらのすべてに次のものが含まれているとします。同じナビゲーション メニュー。
www.domain.com/store/home.php
www.domain。 com/store/products/ipad.php
ホームページでは、次のように記述できます:
しかし、iPad では .php は次のように記述する必要があります:
ホーム
ディレクトリが異なるため、非常に多くのバージョンのナビゲーション メニューを維持するのは大変です。 >
したがって、base タグを使用してください。
< ;body>
ホーム
iPad