ホームページ > php教程 > php手册 > PHPで堅牢なコードを開発する(2): 変数を効果的に使う

PHPで堅牢なコードを開発する(2): 変数を効果的に使う

WBOY
リリース: 2016-06-21 09:10:15
オリジナル
1073 人が閲覧しました

変数

「Developing Robust Code with PHP」は、中規模から大規模のアプリケーションにおける現実の問題の解決に関する一連の記事です。この記事では、PHP のベテランである Amol Hatwar が、変数を効果的に使用する方法について説明します。また、スクリプト構成を簡素化するために、PHP で変更可能な変数名を使用して構成ファイル パーサーを構築する方法も示します。
前回の記事では、計画、設計、さらにはコードの作成時に考慮する必要があるいくつかの要素について説明しました。この記事では、実際のコードを実際に触って、動作の一部を確認します。前回の記事をまだ読んでいない場合は、今すぐ見てみることをお勧めします。

変数の適切な処理
変数と関数は、あらゆるコンピューター言語の重要な要素です。変数を使用するとデータを抽象化でき、関数を使用するとコード行を抽象化できます。 Bruce Eckel が著書「C++ Programming Thoughts」で述べているように、すべてのプログラミング言語は抽象化を提供します。アセンブリ言語は、基礎となるマシンを小さな抽象化したものです。その後に登場したいわゆる命令型言語 (Fortran、BASIC、C など) の多くは、アセンブリ言語から抽象化されたものでした。

プログラミング言語によって提供される抽象化の種類と品質は、解決できる問題の複雑さに直接関係します。 PHP が変数や関数をどのように処理するかを理解すると、それらを効果的に使用するのに役立ちます。

名前には何が入っていますか?
前の記事で述べたように、命名規則とコーディング規則は重要です。どのような命名規則を使用する場合でも、プロジェクト全体を通じて必ずその命名規則に厳密に従うようにしてください。最も広く使用されている命名規則を使用すると、コードはより多くの人に受け入れられます。

変数に名前を付けるときは、スクリプトを含めるときに使用中の変数を上書きしないように特に注意してください。大規模なアプリケーションでは、これは新しい機能を追加する際の一般的なエラーの原因です。この問題を防ぐ最善の方法は、プレフィックスを使用することです。変数のモジュール名の省略形をプレフィックスとして使用します。たとえば、投票を処理するモジュールにユーザー ID を保持する変数がある場合、変数に $poll_userID または $pollUserID という名前を付けることができます。

PHP 変数を理解する
PHP はインタープリタ型言語です。これには多くの利点があり、そのうちのいくつかを活用する方法をすぐに学びます。最初の明白な利点は、設計、コード、コンパイル、テストのサイクルから解放され、エディターで作成したコードはすぐに使用できることです。ただし、最も重要な利点は、変数の型とメモリ内での変数の管理方法について心配する必要がないことです。スクリプトに割り当てられたすべてのメモリは、スクリプトの実行後に PHP によって自動的に回収されます。さらに、変数の型を知らなくても、変数に対して多くの操作を実行できます。リスト 1 のコードは PHP ではまったく問題なく動作しますが、C と Java では大量のエラー メッセージがスローされます。
$myVar = 2; // 別の整数。
$myStr = "これは私のお気に入りのバンドです: "; // 文字列の方が楽しいです。
$myStr = "U" ; OK、それもです。
echo "$myVarn";
?>



PHP をインストールした後、コードを実行したい場合は、まずコードを .php ファイルとして保存し、その後、ファイルは次の場所に配置されます。 Web サーバーにアクセスし、ブラウザーはファイルをポイントします。 CGI バージョンの PHP をインストールすることをお勧めします。次に、シェルまたはコマンド プロンプトで次のコマンドを入力してスクリプトを実行します。script-name はスクリプトを含むファイルの名前に置き換えます。

path-to-php/php script-name




このコードは、PHP が緩やかに型付けされた言語であるため機能します。簡単に言うと、変数の型に関係なく文字列を整数に割り当て、小さな文字列を大きな文字列に簡単に置き換えることができます。 C のような言語ではこれは不可能です。 PHP は内部的に、変数が保持するデータを型とは別に保存します。タイプは別のテーブルに保存されます。異なる型を含む式が発生するたびに、PHP はプログラマが何をしたいのかを自動的に判断し、テーブル内の型を変更し、式を自動的に評価します。

よくあるちょっとした問題をご紹介します
タイプを気にしないのは良いことですが、場合によってはそれが大きな問題に巻き込まれる可能性があります。どうしたの?実際の例を次に示します。Web 上で使用できるように、Windows ベースの PC で作成されたコンテンツを Linux システムに移動する必要があることがよくあります。 Windows ベースのファイル システムでは、ファイル名を処理するときに大文字と小文字が区別されません。ファイル名 DefParser.php と defparser.php は、Windows 上の同じファイルを指します。 Linux オペレーティング システムでは、これらは異なるファイルを指します。すべて大文字またはすべて小文字のファイル名を使用することを推奨する場合がありますが、大文字と小文字を同じに保つことがベスト プラクティスです。

この小さな問題を解決してください
大文字と小文字を区別せずに、指定されたファイルがディレクトリに存在するかどうかを確認する関数が必要だとします。まず、タスクをいくつかの簡単なステップに分割します。コードを分解するのはばかげているように聞こえるかもしれませんが、コードを作成しているときにコードの部分に集中するのに非常に役立ちます。また、紙に書いた手順を書き直すことは、コードを書き直すよりも常に簡単です:

ソース ディレクトリ内のすべてのファイル名を取得する
. および .. ディレクトリを除外する
ターゲット ファイルがそのディレクトリに存在するかどうかを確認する
ファイルが存在する場合、大文字と小文字を区別してファイル名を取得します
名前が一致しない場合は、false を返します
ディレクトリの内容を読み取るには、readdir() 関数を使用する必要があります。この関数の詳細については、PHP マニュアルを参照してください (「参考文献」を参照)。ここでは、これだけ知っておいてください。readdir() は、呼び出しごとに、指定されたディレクトリ内のすべてのファイルの名前を 1 つずつ返します。すべてのファイル名がリストされると、false が返されます。 readdir() が false を返したときに終了するループを使用します。

でも、これで十分ですか? PHP は緩やかに型付けされた言語であることに注意してください。つまり、整数値 0 は false と同じように扱われます (C でさえ、0 とブール値 false は同等のものとして扱われます)。問題は、コードが機能するかどうかではありません。ファイル名が 0 だった場合を想像してください。スクリプトが途中で終了します。次のスクリプト (リスト 2) を使用して、0 とブール値 false の同等性を判断できます:

リスト 2. 0 とブール値 false の同等性を判断するスクリプト

$file_name = 0;
if (0 == $file_name ) {
echo "コードに問題があります ...n"; // このテキストが画面に表示されます。
}

else {
echo "ふぅ…コードは安全です" ; // このテキストは印刷されません。
}
?>




それで、何ができるでしょうか? PHP が型を内部に保存していることはご存知のとおり、それらの型にアクセスできれば問題は解決します。ブール値 false は、整数値 0 とは明らかに異なります。

PHP には gettype() 関数がありますが、ここではより単純なアプローチを選択しましょう。 === 演算子を使用できます (はい、等号が 3 つあります)。違いは、この演算子がデータの値と型の両方を比較することです。これについて混乱している場合は、PHP には !== 演算子もあります。これらの新しい演算子と gettype() 関数は、PHP 4 でのみ使用できます。リスト 3 は、この問題を解決する完全なコードを示しています。

リスト 3. 完全なコード

/* これは、アクションが実行される関数です */
function chk_file_name( $name, $path=. " ) {
$fileList = get_file_list($path);
foreach ($fileList as $file) {
if (eregi($name, $file)) {
return $file;
}
}
return false;
}

/* 指定されたディレクトリ内のファイルのリストを配列で返します。
デフォルトとして現在のディレクトリを使用します。 */
function get_file_list($dirName=".") {
$list = array();
$ handle = opendir($dirName);
while (false !== ($file = readdir($handle))) {

/* '.' ディレクトリと '..' ディレクトリを省略します */
if (( ( ".."== $file) || ("."== $file)) 続行;
array_push($list, $file);
}

closedir($handle);
return $list;
}

?>




観察から学んだ教訓
リスト 3 の各関数が何をするのかについては説明しません。代わりに、PHP マニュアルを参照することをお勧めします (「参考文献」を参照)。馴染みのない関数を使用すると、想定されるパラメータと戻り値の型がエラーの原因になる可能性があります。 PHP の組み込み関数を説明する代わりに、すぐには分からないことについて説明します。

終了条件に異なる変数型が含まれる場合は、=== 演算子と !== 演算子を使用して強力な型チェックを実行することが重要です。

パーツで構成されたコード
スクリプト全体を 1 つの関数として記述することもできましたが、ここではコードを 2 つの関数に分割しました。前の記事の「分割統治」ルールを覚えていますか?それぞれの機能が異なる役割を果たしているからこそ、そうしているのです。他のスクリプトを使用してディレクトリの内容を取得する場合、便利な実装が得られます。ここで考慮していただきたいことがいくつかあります。スクリプト全体を関数として実装することを想像してください。次に、コードのデバッグ、テスト、再利用に必要な作業を想像してください。

ループを正しく使用する
次に、foreach ループを見て、なぜ for ループを使用しないのか考えてみましょう。 for ループを使用するには、配列内の項目の数を知っている必要があり、追加の手順が必要です。さらに、PHP 配列を扱う場合、配列の境界を超える可能性があります。つまり、配列の要素が 10 個しかないときに、配列内の 15 番目の要素にアクセスしようとします。 PHP は小さな警告を出しますが、私の知る限り、スクリプトを繰り返し実行すると、サーバーのパフォーマンスが継続的に低下する一方で、CPU アクティビティ率が突然 100% に跳ね上がる場合があります。可能であれば、for ループの使用を避けることをお勧めします。

断言する場合
最後に、. ディレクトリと .. ディレクトリを無視する get_file_list() 関数のより大きな if 条件を調べてください。もちろん、従来の方法で変数を定数と照合することもできます。しかし、私がコーディングで失敗したことの 1 つは、しばしば等号を見逃してしまい、何が問題だったのか理解できなくなることがよくありました。もちろん、PHP は比較ではなく代入を実行したいと考えるため、エラーをスローしません。定数を変数と比較し、等号が欠落している場合、PHP はエラー メッセージをスローします。

変更可能な変数名
それでは、いくつかの素晴らしいことについて話しましょう。新しい開発者は、タスクを達成するための複雑な方法であると考えるため、変更可能な変数の使用を避けることがよくあります。実際、可変変数を理解して使用するのは簡単です。彼らは私を何度もトラブルから助けてくれましたし、言語の重要な要素です。実際、可変変数の使用が避けられない状況があります。このような実際の状況をすぐに見ていきますが、その前に、可変変数が実際にはどのようなものかを見てみましょう。まずリスト 4 のコードを試してみましょう:

リスト 4. 可変変数を使用したコード

$myStr = "I";
$$myStr = "am";
$$$myStr = "素晴らしい。 ";

// これらは新しい変数です。
echo "$myStr ";
echo "$I ";
echo "$amn";

// ここで真実の瞬間を…" ;

$ am = "誇張しています。";

// 逆の方法もありますか?
echo "$myStr ";
echo "${$myStr} ";
echo "${${$myStr}} n ";
?>




まず、リスト 4 のコードは $myStr という名前の変数を宣言し、それに文字列 I を割り当てます。ただし、今回は変数の名前は $ 内のデータです。 myStr. $$myStr は、PHP に別の変数を生成するように指示する方法であり、これを行うには、 $myStr を定義する必要があります。 I という名前の変数を持ち、それに文字列 am を割り当てます。次のステートメントは同じことを行い、am の変数に文字列 great を割り当てます。これで、何かが明確になります。しかし、echo ステートメント内の奇妙な中括弧はどうなるのでしょうか? これが可変変数を出力する方法であり、PHP は出力時に変数の内容にドル記号 ($) を付加します。

次のように考えてみてください: 変数は何をするのでしょうか? たとえば、可変変数は名前は同じままですが、同じことを行います。変数の名前は、実際には別のものです。リスト 4 で示した例は、実行時に動的に可変変数名を生成できるという事実から、可変変数名の真の力を理解していただくためのものです。構成ファイル パーサーを構築するときにこの機能を使用してください

構成ファイル パーサー
私の経験では、実行するアプリケーションを構成するときに PHP で構成ファイルを編集するときにユーザーが不満を言うことがよくあります。アプリケーションでは、ドル記号、セミコロン、または囲まれていないコメントが存在しないと、コード全体が壊れてしまうことがよくあります。ユーザーを助けるために何ができるでしょうか?

ユーザーにファイルを与え、等号で区切られた単純な名前と値のペアを使用してそのファイルを編集できるようにするとします。構成ファイルはリスト 5 に似ています。 # で始まる行はコメントとして扱われます。

リスト 5. サンプル構成ファイル

# これはサンプル構成ファイルです
意味は分かりましたか?はい、それは本当です...PHP でファイルを解析できるのに、なぜユーザーに設定ファイルを編集させる必要があるのでしょうか?実際、これは非常に期待されています。アプリケーションは、ユーザーがアプリケーションを制御できることをユーザーに知らせながら、複雑さをすべて隠しなければならないことに注意してください。

解析作業を行う関数を作成できるので、変更せずにどこでも使用できます。タスクをいくつかの簡単な手順に分割しましょう:

ファイルを 1 行ずつ読み込みます
行内の # 文字以降をすべて破棄します
1 行を等号で区切って 2 つの文字列に分割し、破棄します
等号は、文字列内の余分なスペースを削除します文字列
はそれに応じて変数を宣言します
最後のステップを記述するには、変更可能な変数のみを使用できます。リスト 6 にコードを示します。

リスト 6. 関数の解析

/* conf_parser.php */

/* 可能な場合は常にファイル名とパス情報を指定します。 */
function conf_parse($file_name) {

// @ を前に付けると、関数は静かになります。エラー メッセージは出力されません。
$fp = @fopen($file_name, "r") または die("Cannot open $file_name");

while ($conf_line = @fgets) ($fp, 1024)) {
$line = ereg_replace("#.*$", "", $line); // ハッシュの後に削除を実行します。
if ($line == "") // ドロップします。前のステップで生成された空白行。
list($name, $value) =explode ('=', $line); // '=' を削除して分割します。
$name =rim($name); // space.
$$name=trim($value); // 上記の変数を定義します
}
fclose($fp) または die("Can't close file $file_name");
}
?>




# 記号を削除するには正規表現を使用します。ここの式は単純ですが、複雑な正規表現は CPU 時間を大量に消費する可能性があることに注意してください。さらに、ページごとに構成ファイルを繰り返し解析することは適切な決定ではありません。より良いオプション: 変数または定義ステートメントを使用して、解析された出力を PHP スクリプトとして保存します。一度値を設定すると実行時に変更できないため、私は定義にdefine()関数を使用することが多いです。ニーズに合わせて変更できる実装は「リソース」にあります。

結論
変数を効果的に使用する方法がわかったので、より大きなプログラムを書き始めることができます。このシリーズの次回の記事では、関数と API の設計について見ていきます。次回まで、楽しいプログラミングを楽しんでください。

参考情報

設定ファイルパーサーの実装を含む def_parser.zip ファイルをダウンロードします。このパーサーによって書き込まれたファイルをスクリプトに含めることができます。


PHP での変更可能な変数名の使用例については、PHPBuilder.com と Developer Shed にアクセスしてください。


Web アプリケーションをコーディングする簡単な方法である Free Energy について学び続けてください。


PHP マニュアルをオンラインでダウンロードまたは表示します。


「効率的な PHP の書き方」チュートリアルを受講して、効率的な PHP コードの書き方を学びましょう (developerWorks、2002 年 7 月)。


このシリーズの最初の記事「基礎の構築」を読んで、Web アプリケーションの設計と計画に関する重要なポイントを学びましょう (developerWorks、2002 年 8 月)。

著者について
Amol Hatwar は、物心ついた頃からコンピューターを使って仕事をしてきました。 GNU/Linux の熱心な支持者である彼は、過去に Microsoft プラットフォームでプログラミングしたことに罪悪感を感じています。彼は現在、独立したコンサルタントとして、多数の企業の GNU/Linux への移行を支援しています。 Web アプリケーション開発の専門家である彼は、残されたわずかな自由時間を誰も聞いたことのないテクノロジーに費やしています。彼の現在の関心には、オープンソース ソフトウェア、Web サービス、ピアツーピア コンピューティング、および高可用性クラスタリングが含まれます。 Amol までは、amolhatwar@consultant.com までご連絡ください。



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