PHP は効率的なネットワーク プログラミング言語であり、柔軟な記述と高速な実行という利点により、すぐに Web プログラマーに好まれる言語になりました。少し前の権威ある調査によると、現在、Web サイトの 31.6% が主要なサーバー側プログラミング言語として PHP を使用しています。
ただし、PHP プログラミングのマスターになるのは簡単ではありません。多くの人が想像しているほどではありません。複雑な問題を解決するための簡単なコードをいくつか書くことができれば、あなたは PHP プログラミングのマスターです。真の PHP マスターには、他の多くの問題も考慮する必要があります。次の 3 つのガイドラインは、成熟した PHP プログラマーがプログラミングにおいて最初に従うべきガイドラインです。
1. 怠惰は金なり
2. 美しいコードを書く
3. プログラミングの速度ではなく、プログラミングの速度を追求する
1. 怠惰は金なり
あなたは怠惰なプログラマーですか?このアイデアはとても奇妙です!なぜなら、おそらく世界で最も忙しい人々はコンピュータープログラマーだからです。しかし、プログラマは忙しすぎるからこそ、プログラミングする際に怠けることを学ぶ必要があります。
プログラマーにとって、怠惰な方法は 2 つあります。1 つは、他の人の既成のプログラム コードを大胆に使用し、それらのコードを自分のプログラムまたはプロジェクトに統合することです。 2 つ目は、関数ライブラリを構築するための便利なコードを作成することです。これにより、将来プログラムを作成するときに簡単に使用できるようになり、繰り返しの作業が大幅に軽減され、自然と面倒な作業が軽減されます。
これら 2 つの遅延メソッドは、PHP プログラマに非常に適しています。
まず第一に、PHP は自由でオープンな環境で生まれ成長した言語です。世界中には、PHP の完成度を目指して絶えず努力しているプログラマーが何千人もいます。また、彼らは自分の創意工夫や自分が書いたコードを他の人と共有することにも意欲を持っています。 PHP の Web サイト、メーリング リスト、ニュース グループからは、毎日多くの優れたプログラム コードを見つけることができます。これを言っても、他の人がコードを書いてくれるのを一日中待つことを勧めているわけではありませんが、「偉人の肩の上に立って」、他の人のプログラム コードをスマートに適用する「使用原則」を全面的に推進することはできます。多くの時間を節約できます。次に、PHP では独自の関数ライブラリを簡単に構築できるため、将来プログラムを作成する際に多くの手間を省くことができます。
以下の著者は、いくつかの一般的な関数を紹介します。これらの関数の中には、インターネット上のいくつかのオープン ソース プロジェクトから提供されたものや、メーリング リストから選択されたものもあります。それらを自分のライブラリに追加できれば、遅かれ早かれそれらの恩恵を受けることになるでしょう。
1. 一般的なデータベース処理機能
PHP は他の CGI 機能と比較して、非常に強力なデータベース処理機能を備えていることが利点です。しかし、PHP では、さまざまなデータベースを処理するためにいくつかの特殊な関数が使用されており、一般的なデータベース処理関数が不足しています。これにより、プログラム コードの移植性が大幅に低下し、プログラミング初心者の友人にも多大な不便をもたらします。
インターネットでは、多くのプログラマがクラスをカプセル化することでこの問題を解決しました。彼らは、Linux の世界で人気のある Mysql であっても、Windows プラットフォームで広く普及している SqlServer であっても、あらゆる一般的なデータベースを処理するための統合関数を作成しました。個人的には、これらの関数をとても気に入っています。使用しているデータベースを考慮するだけでなく、データベース接続やデータベース ハンドルなどの複雑なことを考慮することなく、「query」や「next_record」などの単純な関数を直接使用できるからです。 。
これらの関数が必要な場合は、次の URL にアクセスして入手できます。
http://phplib.netuse.de/
http://phpclasses.UpperDesign.com/browse.html/package/20
http://phpdb.linuxbox.com/
http://www.phpchina.com
2. 変数デバッグ機能
PHP プログラムのデバッグは、VB などの高級言語のような統合されたコンパイルとデバッグ環境を持たず、また、 Perl などの PHP プログラムで使用できる機能。Linux または DOS 環境で直接実行できます。実際、echo ステートメントを柔軟に使用することで、PHP のデバッグを完了できます。
次の関数を使用すると、プログラム内の任意の変数の型と値をいつでも確認できます。
関数 ss_array_as_string (&$array, $column = 0) {
$str = "配列(n";
while(list($var, $val) = each($array)){
for ($i = 0; $i < $column+1; $i++){
$str .= " ";
}
$str .= $var. ==> ;
$str .= ss_as_string($val, $column+1)." n";
}
for ($i = 0; $i < $column; $i++){
$str .= " ";
}
$str を返します);
}
関数 ss_object_as_string (&$object, $column = 0) {
if (empty($オブジェクト->クラス名)) {
"$object" を返します。
} それ以外 {
$str = $object->classname."( n";
while (list(,$var) = each($object->persistent_slots)) {
for ($i = 0; $i < $column; $i++){
$str .= " ";
}
グローバル$$var;
$str .= $var. ==> ;
$str .= ss_as_string($$var, 列+1)." n";
}
for ($i = 0; $i < $column; $i++){
$str .= " ";
}
$str を返します);
}
}
関数 ss_as_string (&$thing, $column = 0) {
if (is_object($thing)) {
return ss_object_as_string($thing, $column);
}
elseif (is_array($thing)) {
return ss_array_as_string($thing, $column);
}
elseif (is_double($thing)) {
return "Double(".$thing.")";
}
elseif (is_long($thing)) {
return "Long(".$thing.")";
}
elseif (is_string($thing)) {
return "String(".$thing.")";
}
それ以外 {
return "Unknown(".$thing.")";
}
、
次のコードをプログラムに追加するだけで、プログラムで使用されている変数 (配列やオブジェクトを含む) の型と値を表示できます。
echo ss_as_string($my_variable);
次のステートメントを使用すると、プログラム内のすべての変数の値を直接表示できます。
echo ss_as_string($GLOBALS);
3. ログ情報を制御する関数
PHP プログラムをデバッグするもう 1 つの重要な方法は、ログ情報を表示することです。ログ情報のレベルやログ情報の表示内容を簡単に制御できれば、プログラムのデバッグがさらに便利になります。この機能は以下の関数で簡単に実現できます。
$ss_log_level = 0;
$ss_log_filename = /tmp/ss-log;
$ss_log_levels = 配列(
なし => 0、
エラー => 1、
情報 => 2、
デバッグ => 3);
関数 ss_log_set_level ($level = エラー) {
グローバル $ss_log_level;
$ss_log_level = $level;
}
function ss_log ($level, $message) {
グローバル $ss_log_level、$ss-log-filename;
if ($ss_log_levels[$ss_log_level] < $ss_log_levels[$level]) {
//ログ情報を表示しない
false を返します。
}
$fd = fopen($ss_log_filename, "a+");
fputs($fd, $level. - [.ss_timestamp_pretty().] - .$message."n");
fclose($fd);
true を返します。
}
関数 ss_log_reset () {
グローバル $ss_log_filename;
@unlink($ss_log_filename);
関数
には、4 つのログ レベル変数があります。 PHPプログラム実行時、ログレベルがあらかじめ設定したレベル値より低い場合にのみログ情報を記録・表示できます。たとえば、次のステートメントをプログラムに追加します。
ss_log_set_level(INFO);
その後、PHP プログラムを実行すると、ERROR および INFO レベルの LOG 情報のみが記録および表示され、DEBUG レベルの情報は無視されます。さらに、次のステートメントを使用して、表示される情報の内容を設定することもできます。
ss_log(ERROR, "テストレベルエラー");
ss_log(INFO, "テストレベル情報");
ss_log(DEBUG, "testing level DEBUG");
次のステートメントを使用すると、いつでもログ情報をクリアできます。
ss_log_reset();
4. スピードテスト機能
コードを最適化するには、コードの実行時間をテストして最適なコードを選択できるメソッドが必要です。次の関数は、コードの実行に必要な時間をテストできます。
function ss_timing_start ($name = default) {
グローバル $ss_timing_start_times;
$ss_timing_start_times[$name] =explode( , microtime());
}
関数 ss_timing_stop ($name = デフォルト) {
グローバル $ss_timing_stop_times;
$ss_timing_stop_times[$name] =explode(, microtime());
}
関数 ss_timing_current ($name = デフォルト) {
グローバル $ss_timing_start_times、$ss_timing_stop_times;
if (!isset($ss_timing_start_times[$name])) {
0を返します。
}
if (!isset($ss_timing_stop_times[$name])) {
$stop_time =explode(, microtime());
}
それ以外 {
$stop_time = $ss_timing_stop_times[$name];
}
$current = $stop_time[1] - $ss_timing_start_times[$name][1];
$current += $stop_time[0] - $ss_timing_start_times[$name][0];
$current を返します。
、
複数のタイマーを同時に使用することもできます。
5. データベース操作のデバッグと最適化
データベースにとって、実行速度は非常に重要です。データベースを迅速に実行する方法を説明する書籍や記事は数多くありますが、すべての方法は実際にテストする必要があります。次に、PHPLib 関数ライブラリの query() 関数と上記で紹介した関数を組み合わせて、新しい query() 関数を作成します。元の関数と比較して、この関数は実行時間監視関数を追加します。
関数クエリ($Query_String, $halt_on_error = 1) {
$this->connect();
ss_timing_start();
$this->Query_ID = @mysql_query($Query_String,$this->Link_ID);
ss_timing_stop();
ss_log(INFO, ss_timing_current().Secs - .$Query_String);
$this->行 = 0;
$this->Errno =mysql_errno();
$this->エラー =mysql_error();
if ($halt_on_error && !$this->Query_ID) {
$this->halt("無効な SQL: ".$Query_String);
}
return $this->Query_ID;
}
2. 美しいコードを書く
1. バックエンド プログラムをフロントエンド プログラムから分離する
PHP プログラムを作成するとき、一部のコードはデータベースの操作、数学的演算の実行などのトランザクションの処理に使用されます。コードはトランザクション処理専用であり、echo ステートメントを使用して結果を Web ブラウザ上に HTML 形式で表示する一部の PHP コードや、PHP プログラムに直接埋め込まれた HTML コードなどです。まず、これら 2 種類のコードを明確に区別し、前者をバックグラウンド プログラム、後者をフロントエンド プログラムと呼ぶ必要があります。
PHP は組み込みプログラミング言語であるため、すべての PHP コードを HTML コードに埋め込むことができ、プログラム作成に多くの利便性をもたらします。ただし、極端な場合は、その逆を行う必要があります。長いプログラムの中で PHP コードと HTML コードを混在させると、プログラムが乱雑になり、プログラムの保守や読み取りに不利になります。したがって、HTML コードに混在する PHP コードを可能な限りこれらのプログラムに移植し、これらのコードを特殊ファイル内の関数にカプセル化し、HTML コード内の include ステートメントを使用してこれらのファイルを適切な場所にインクルードする必要があります。これらの関数を呼び出すだけです。
このアプローチでは、HTML コードと PHP コードの両方がシンプルで読みやすくなりますが、一方で、HTML コードは常に更新する必要があるため、この分離方法によりバックグラウンド プログラムが破壊されないようにすることができます。 。
フロントエンド プログラムとは異なり、バックエンド プログラムは安定性と構造を追求し、ほとんど変更されないため、慎重に設計および管理する必要があります。実際、デスクトップ プログラムを設計するときに多くの時間を費やす価値はあります。「今すぐ木を植えて、後で日陰を楽しむ」のは、今作成したバックグラウンド プログラムを将来の設計作業で簡単に使用できるようになります。
2. インクルードファイルの柔軟な利用
前述したように、バックグラウンドプログラムは一連のインクルードファイルに配置する必要があります。インクルードされたファイルは、必要に応じて include ステートメントを使用して動的にロードすることも、php.ini ファイルの auto_prepend_file ディレクティブを使用して事前に自動的にロードすることもできます。
後者の方法を使用すると、一度限りの利点が得られますが、注意すべき欠点もいくつかあります。次のコードは、大きなインクルード ファイルの解析にかかる時間を示しています
。
ss_timing_start();
インクルード(test.inc);
ss_timing_stop();
エコー
.ss_timing_current()。
?>
上記のコードでは、test.inc は 1000 行のインクルード ファイルです。実行結果から、このインクルード ファイルの解析には 0.6 秒かかることがわかります。大規模な Web サイトの場合、この速度は無視できません。
インクルード ファイルを使用するもう 1 つの欠点は、ファイル内のステートメントでエラーが発生すると、Web サイト全体の PHP プログラムが実行できなくなることです。したがって、非常に慎重に使用してください。
実際、インクルード ファイルを少し処理することで、必要な場合にのみインクルード ファイルを解析できます。
次のコードにより、
プログラムで必要な場合にのみ abc.inc ファイルが解析されます。
定義(__LIBA_INC, 1);
/*
* コード...
*/
?>
3. オブジェクト指向プログラミング手法を使用する
PHP もオブジェクト指向言語です。PHP プログラミングでは、オブジェクト指向言語の利点を最大限に活用することができます。利点は、プログラミングでオブジェクトをカプセル化できることです。たとえば、前のコードでは、データベースを管理するときに、query() 関数をデータベース クラスにカプセル化することで、コード管理が大幅に容易になり、プログラムの可読性が向上しました。
3. プログラミング速度よりもプログラム速度を追求する
Webサイト構築においては、プログラムの実行速度とWebページのダウンロード速度が成否を分ける重要な要素となります。 Web プログラマーは、コードの実行速度にもっと注意を払う必要があります。以下に紹介するいくつかの方法はいずれも、コードの実行速度をさまざまな程度に向上させます。
1. PHP の echo ステートメントの代わりに埋め込み HTML コードを使用します。
PHP は組み込み Web プログラミング言語であるため、HTML コードと PHP コードを相互に埋め込むことができます。ただし、多くのプログラマは、HTML コードに PHP コードを埋め込むために "" を過剰に使用すると、PHP インタプリタが複数回呼び出され、PHP コードの実行速度が低下することを懸念しているため、HTML コードの出力には PHP の echo ステートメントを使用することを選択します。 HTML コードを直接使用します。しかし、真実は全く逆です。各 PHP ページは、すべての PHP コードを解釈するために PHP インタープリタを 1 回だけ呼び出します。そのため、必要な場合にのみ PHP コードを埋め込み、ほとんどの場合は HTML コードを直接使用して結果を入力すると、プログラムの実行速度が低下することはありません。また、echo ステートメントの解析が軽減されるため、コードの実行速度が向上することがよくあります。
次のコードは、私たちの結論を示しています。このコードでは、前に紹介した時間テスト関数を使用します。
ereg-replace の代わりに str-replace を使用してください
Perl でのプログラミングに慣れているプログラマは、PHP での ereg_replace の使用法が Perl でのパターン マッチングの使用法に似ているため、文字列置換作業を完了するために ereg_replace を使用することをより積極的に行います。ただし、次のコードは、ereg_replace の代わりに str_replace を使用すると、コードの実行速度が大幅に向上することを示しています。
str_replace と ereg_replace の実行速度をテストします
//このコードは str_replace の実行速度をテストします
強調?>
for ($i=0; $i<1000; $i++) {
str_replace(i>, b>, $string)。
}
?>
//このコードは ereg_replace の実行速度をテストします
for ($i=0; $i<1000; $i++) {
ereg_replace(<([/]*)i>, <1b>, $string)。
}
?>
//
str_replace time を使用して
結果の結論
を出力 -
ereg_pattern を使用する時間 -
上記のコードを実行すると、結果は次のようになります:
str_replace を使用する時間 - 0.089757
ereg_pattern の使用時間 - 0.248881
実行結果から、文字列置換関数として ereg_replace の代わりに str_replace を使用すると、コードの実行速度が大幅に向上することがわかります。
3. 文字列の引用符に注意してください。PHP
は、他の多くのプログラミング言語と同様、二重引用符 ("") または一重引用符 () を使用して文字列を引用できます。ただし、PHP では、二重引用符を使用して文字列を引用すると、PHP パーサーはまず文字列内に変数への参照があるかどうかを分析し、変数がある場合はその変数を置き換えます。一重引用符の場合は、それほど複雑ではありません。一重引用符で囲まれたすべての文字列が直接表示されます。明らかに、PHP プログラミングでは、二重引用符よりも一重引用符を使用して文字列変数を引用する方が高速です。
4. データベースでの共同操作の使用を避ける
他の Web プログラミング言語と比較して、PHP のデータベース機能は非常に強力です。ただし、PHP でデータベースを実行するのは依然として非常に時間と労力がかかるため、Web プログラマはデータベース クエリ操作を最小限に抑え、データベースに適切なインデックスを確立する必要があります。もう 1 つの注意すべき点は、PHP を使用してデータベースを操作する場合、複数のデータ テーブルの結合操作を使用しないようにすることです。結合操作はデータベースのクエリ機能を強化しますが、サーバーの負荷が大幅に増加します。
この問題を説明するために、以下の簡単な例を見てみましょう。
データベースに 2 つのデータ テーブル foo と big_foo を作成しました。データテーブル foo には、1 から 1000 までのすべての自然数を含むフィールドが 1 つだけあります。データ テーブル big_foo にもフィールドは 1 つしかありませんが、1 から 1,000,000 までのすべての自然数が含まれています。したがって、サイズの点では、big_foo は foo とそれ自体を組み合わせたものと等しくなります。
$db->query("select * from foo");
0.032273秒
$db->next_record();
0.00048999999999999 秒
$db->query("foo 値に挿入 (NULL)");
0.019506秒
$db->query("select * from foo as a, foo as b");
17.280596秒
$db->query("select * from foo as a, foo as b where a.id > b.id");
14.645251秒
$db->query("select * from foo as a, foo as b where a.id = b.id");
0.041269秒
$db->query("select * from big_foo");
25.393672 秒
上記の操作結果から、1,000 レコードを持つ 2 つのデータ テーブルを結合する速度は、1,000,000 レコードを持つ大きなデータ テーブルを個別に操作する場合よりもそれほど速くないことがわかります。
5. include と require の違いに注意してください。PHP
プログラミングでは、include() と require() は同じ関数ですが、include() は条件付き包含関数であるのに対し、require() は使用方法にいくつかの違いがあります。無条件の関数が含まれます。たとえば、次の例では、変数 $somgthing が true の場合、ファイル somefile がインクルードされます
。
include("何らかのファイル");
ただし、
something
がどのような値をとっても、次のコードはファイル somefile をファイルに組み込みます。
require("何らかのファイル");
、
これら 2 つの関数の違いを示しています。
$i = 1;
while ($i < 3) {
require("somefile.$i");
$i++;
コード
では、プログラムはループするたびに同じファイルをインクルードします。明らかに、これはプログラマーの本来の意図ではありません。コードから、このコードが各ループに異なるファイルを含めることを望んでいることがわかります。この関数を完了したい場合は、include() 関数を使用する必要があります。
$i = 1;
while ($i < 3) {
include("somefile.$i");
$i++;
6.
echo と print の違いに注意する
PHP の echo と print の機能は基本的に同じですが、この 2 つには微妙な違いがあります。たとえば、次のコードを実行すると、変数 $res の値は 1 になります。
$ret = print "Hello World";
これは、print は一部の複雑な式で使用できますが、echo は使用できないことを意味します。同様に、echo ステートメントは値を返す必要がないため、コード内の print ステートメントよりもわずかに高速に実行されます。