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

PHP コードの品質を向上させる 36 のヒント_PHP チュートリアル

Jul 20, 2016 am 10:58 AM
lib once php require コード 使用 改善する 比較的 品質 パス

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

よく見られます:

<ol class="dp-c"><li class="alt"><span><span class="keyword">require_once</span><span>(</span><span class="string">'../../lib/some_class.php'</span><span>); </span></span></li></ol>
ログイン後にコピー

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

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

同様です。多くのパスがチェックされます。

そのスクリプトが別のディレクトリ内のスクリプトに含まれている場合、そのベース ディレクトリは、他のスクリプトが配置されているディレクトリになります。

別の問題として、スケジュールされたタスクがスクリプトを実行すると、その親ディレクトリが作業ディレクトリではありません

したがって、絶対パスを使用するのが最良の選択です:

<ol class="dp-c">
<li class="alt"><span><span>define(</span><span class="string">'ROOT'</span><span> , </span><span class="string">'/var/www/project/'</span><span>);  </span></span></li>
<li>
<span class="keyword">require_once</span><span>(ROOT . </span><span class="string">'../../lib/some_class.php'</span><span>);  </span>
</li>
<li class="alt"><span> </span></li>
<li>
<span class="comment">//rest of the code</span><span> </span>
</li>
</ol>
ログイン後にコピー

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

<ol class="dp-c">
<li class="alt"><span><span class="comment">//suppose your script is /var/www/project/index.php </span><span> </span></span></li>
<li>
<span class="comment">//Then __FILE__ will always have that full path. </span><span> </span>
</li>
<li class="alt"><span> </span></li>
<li>
<span>define(</span><span class="string">'ROOT'</span><span> , </span><span class="func">pathinfo</span><span>(</span><span class="keyword">__FILE__</span><span>, PATHINFO_DIRNAME));  </span>
</li>
<li class="alt">
<span class="keyword">require_once</span><span>(ROOT . </span><span class="string">'../../lib/some_class.php'</span><span>);  </span>
</li>
<li><span> </span></li>
<li class="alt">
<span class="comment">//rest of the code</span><span> </span>
</li>
</ol>
ログイン後にコピー

さて、どのディレクトリに移動しても、外部サーバーの場合、コードは変更せずに正しく実行されます

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

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

<ol class="dp-c">
<li class="alt"><span><span class="keyword">require_once</span><span>(</span><span class="string">'lib/Database.php'</span><span>);  </span></span></li>
<li>
<span class="keyword">require_once</span><span>(</span><span class="string">'lib/Mail.php'</span><span>);  </span>
</li>
<li class="alt"><span> </span></li>
<li>
<span class="keyword">require_once</span><span>(</span><span class="string">'helpers/utitlity_functions.php'</span><span>); </span>
</li>
</ol>
ログイン後にコピー

この使用法は、より柔軟である必要があります。例:

<ol class="dp-c">
<li class="alt"><span><span class="keyword">function</span><span> load_class(</span><span class="vars">$class_name</span><span>)  </span></span></li>
<li><span>{  </span></li>
<li class="alt">
<span>    </span><span class="comment">//path to the class file </span><span> </span>
</li>
<li>
<span>    </span><span class="vars">$path</span><span> = ROOT . </span><span class="string">'/lib/'</span><span> . </span><span class="vars">$class_name</span><span> . </span><span class="string">'.php'</span><span>);  </span>
</li>
<li class="alt">
<span>    </span><span class="keyword">require_once</span><span>( </span><span class="vars">$path</span><span> );  </span>
</li>
<li><span>}  </span></li>
<li class="alt"><span> </span></li>
<li>
<span>load_class(</span><span class="string">'Database'</span><span>);  </span>
</li>
<li class="alt">
<span>load_class(</span><span class="string">'Mail'</span><span>); </span>
</li>
</ol>
ログイン後にコピー

違いは何ですか?将来必要に応じて、次のような関数を拡張します:

<ol class="dp-c">
<li class="alt"><span><span class="keyword">function</span><span> load_class(</span><span class="vars">$class_name</span><span>)  </span></span></li>
<li><span>{  </span></li>
<li class="alt">
<span>    </span><span class="comment">//path to the class file </span><span> </span>
</li>
<li>
<span>    </span><span class="vars">$path</span><span> = ROOT . </span><span class="string">'/lib/'</span><span> . </span><span class="vars">$class_name</span><span> . </span><span class="string">'.php'</span><span>);  </span>
</li>
<li class="alt"><span> </span></li>
<li>
<span>    </span><span class="keyword">if</span><span>(</span><span class="func">file_exists</span><span>(</span><span class="vars">$path</span><span>))  </span>
</li>
<li class="alt"><span>    {  </span></li>
<li>
<span>        </span><span class="keyword">require_once</span><span>( </span><span class="vars">$path</span><span> );  </span>
</li>
<li class="alt"><span>    }  </span></li>
<li><span>} </span></li>
</ol>
ログイン後にコピー

また、さらに多くのことができます:

同じファイルの複数のディレクトリを検索

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

同様の関数を使用して、HTML コンテンツなどのファイルをロードできます。

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

開発環境では、データベース クエリ ステートメントを出力します。問題のある変数値を削除し、問題が解決したら、コメントするか削除します。ただし、より良い方法は、コードをデバッグし続けることです。

開発環境では、次のことができます。

<ol class="dp-c">
<li class="alt"><span><span>define(</span><span class="string">'ENVIRONMENT'</span><span> , </span><span class="string">'development'</span><span>);  </span></span></li>
<li><span> </span></li>
<li class="alt">
<span class="keyword">if</span><span>(! </span><span class="vars">$db</span><span>->query( </span><span class="vars">$query</span><span> )  </span>
</li>
<li><span>{  </span></li>
<li class="alt">
<span>    </span><span class="keyword">if</span><span>(ENVIRONMENT == </span><span class="string">'development'</span><span>)  </span>
</li>
<li><span>    {  </span></li>
<li class="alt">
<span>        </span><span class="func">echo</span><span> </span><span class="string">"$query failed"</span><span>;  </span>
</li>
<li><span>    }  </span></li>
<li class="alt">
<span>    </span><span class="keyword">else</span><span> </span>
</li>
<li><span>    {  </span></li>
<li class="alt">
<span>        </span><span class="func">echo</span><span> </span><span class="string">"Database error. Please contact administrator"</span><span>;  </span>
</li>
<li><span>    }  </span></li>
<li class="alt"><span>} </span></li>
</ol>
ログイン後にコピー

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

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

system、exec、passthru、shell_exec これらの 4 つの関数は、システム コマンドを実行するために使用できます。問題は、共有ホスティングの場合、それぞれの動作が若干異なることです。一部の機能は選択的に無効になる場合があります。ほとんどの初心者は、最初にどの機能が利用可能かを確認してからそれを使用する傾向があります。

より良い解決策は、その機能をクロスプラットフォーム機能にカプセル化することです。

<ol class="dp-c">
<li class="alt"><span><span>define(</span><span class="string">'ENVIRONMENT'</span><span> , </span><span class="string">'production'</span><span>);  </span></span></li>
<li><span> </span></li>
<li class="alt">
<span class="keyword">if</span><span>(! </span><span class="vars">$db</span><span>->query( </span><span class="vars">$query</span><span> )  </span>
</li>
<li><span>{  </span></li>
<li class="alt">
<span>    </span><span class="keyword">if</span><span>(ENVIRONMENT == </span><span class="string">'development'</span><span>)  </span>
</li>
<li><span>    {  </span></li>
<li class="alt">
<span>        </span><span class="func">echo</span><span> </span><span class="string">"$query failed"</span><span>;  </span>
</li>
<li><span>    }  </span></li>
<li class="alt">
<span>    </span><span class="keyword">else</span><span> </span>
</li>
<li><span>    {  </span></li>
<li class="alt">
<span>        </span><span class="func">echo</span><span> </span><span class="string">"Database error. Please contact administrator"</span><span>;  </span>
</li>
<li><span>    }  </span></li>
<li class="alt"><span>} </span></li>
</ol>
ログイン後にコピー
コードの一貫性を維持するシステム関数がある限りシェルコマンドを使用します

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

<ol class="dp-c">
<li class="alt"><span><span class="comment">/** </span> </span></li>
<li><span><span class="comment">    Method to execute a command in the terminal </span> </span></li>
<li class="alt"><span><span class="comment">    Uses : </span> </span></li>
<li><span> </span></li>
<li class="alt"><span><span class="comment">    1. system </span> </span></li>
<li><span><span class="comment">    2. passthru </span> </span></li>
<li class="alt"><span><span class="comment">    3. exec </span> </span></li>
<li><span><span class="comment">    4. shell_exec </span> </span></li>
<li class="alt"><span> </span></li>
<li><span><span class="comment">*/</span><span> </span></span></li>
<li class="alt">
<span class="keyword">function</span><span> terminal(</span><span class="vars">$command</span><span>)  </span>
</li>
<li><span>{  </span></li>
<li class="alt">
<span>    </span><span class="comment">//system </span><span> </span>
</li>
<li>
<span>    </span><span class="keyword">if</span><span>(function_exists(</span><span class="string">'system'</span><span>))  </span>
</li>
<li class="alt"><span>    {  </span></li>
<li><span>        ob_start();  </span></li>
<li class="alt">
<span>        system(</span><span class="vars">$command</span><span> , </span><span class="vars">$return_var</span><span>);  </span>
</li>
<li>
<span>        </span><span class="vars">$output</span><span> = ob_get_contents();  </span>
</li>
<li class="alt"><span>        ob_end_clean();  </span></li>
<li><span>    }  </span></li>
<li class="alt">
<span>    </span><span class="comment">//passthru </span><span> </span>
</li>
<li>
<span>    </span><span class="keyword">else</span><span> </span><span class="keyword">if</span><span>(function_exists(</span><span class="string">'passthru'</span><span>))  </span>
</li>
<li class="alt"><span>    {  </span></li>
<li><span>        ob_start();  </span></li>
<li class="alt">
<span>        </span><span class="func">passthru</span><span>(</span><span class="vars">$command</span><span> , </span><span class="vars">$return_var</span><span>);  </span>
</li>
<li>
<span>        </span><span class="vars">$output</span><span> = ob_get_contents();  </span>
</li>
<li class="alt"><span>        ob_end_clean();  </span></li>
<li><span>    }  </span></li>
<li class="alt"><span> </span></li>
<li>
<span>    </span><span class="comment">//exec </span><span> </span>
</li>
<li class="alt">
<span>    </span><span class="keyword">else</span><span> </span><span class="keyword">if</span><span>(function_exists(</span><span class="string">'exec'</span><span>))  </span>
</li>
<li><span>    {  </span></li>
<li class="alt">
<span>        </span><span class="func">exec</span><span>(</span><span class="vars">$command</span><span> , </span><span class="vars">$output</span><span> , </span><span class="vars">$return_var</span><span>);  </span>
</li>
<li>
<span>        </span><span class="vars">$output</span><span> = implode(</span><span class="string">"n"</span><span> , </span><span class="vars">$output</span><span>);  </span>
</li>
<li class="alt"><span>    }  </span></li>
<li><span> </span></li>
<li class="alt">
<span>    </span><span class="comment">//shell_exec </span><span> </span>
</li>
<li>
<span>    </span><span class="keyword">else</span><span> </span><span class="keyword">if</span><span>(function_exists(</span><span class="string">'shell_exec'</span><span>))  </span>
</li>
<li class="alt"><span>    {  </span></li>
<li>
<span>        </span><span class="vars">$output</span><span> = shell_exec(</span><span class="vars">$command</span><span>) ;  </span>
</li>
<li class="alt"><span>    }  </span></li>
<li><span> </span></li>
<li class="alt">
<span>    </span><span class="keyword">else</span><span> </span>
</li>
<li><span>    {  </span></li>
<li class="alt">
<span>        </span><span class="vars">$output</span><span> = </span><span class="string">'Command execution not possible on this system'</span><span>;  </span>
</li>
<li>
<span>        </span><span class="vars">$return_var</span><span> = 1;  </span>
</li>
<li class="alt"><span>    }  </span></li>
<li><span> </span></li>
<li class="alt">
<span>    </span><span class="keyword">return</span><span> </span><span class="keyword">array</span><span>(</span><span class="string">'output'</span><span> => </span><span class="vars">$output</span><span> , </span><span class="string">'status'</span><span> => </span><span class="vars">$return_var</span><span>);  </span>
</li>
<li><span>}  </span></li>
<li class="alt"><span> </span></li>
<li>
<span>terminal(</span><span class="string">'ls'</span><span>); </span>
</li>
</ol>
ログイン後にコピー

これで、同じ関数でさまざまな種類の入力パラメーターを処理できるようになります。上記の例を参照して、コードの複数の部分をリファクタリングしてコードをよりスマートにすることができます。

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

なぜ PHP のアドバイスに関するブログ投稿がこれほど多くあるのか、非常に不思議です。

<ol class="dp-c">
<li class="alt"><span><span class="keyword">function</span><span> add_to_cart(</span><span class="vars">$item_id</span><span> , </span><span class="vars">$qty</span><span>)  </span></span></li>
<li><span>{  </span></li>
<li class="alt">
<span>    </span><span class="vars">$_SESSION</span><span>[</span><span class="string">'cart'</span><span>][</span><span class="string">'item_id'</span><span>] = </span><span class="vars">$qty</span><span>;  </span>
</li>
<li><span>}  </span></li>
<li class="alt"><span> </span></li>
<li>
<span>add_to_cart( </span><span class="string">'IPHONE3'</span><span> , 2 ); </span>
</li>
</ol>
ログイン後にコピー

これにより、多くの時間が節約されます。例を示します。 super_class.php ファイル

<ol class="dp-c">
<li class="alt"><span><span class="keyword">function</span><span> add_to_cart(</span><span class="vars">$item_id</span><span> , </span><span class="vars">$qty</span><span>)  </span></span></li>
<li><span>{  </span></li>
<li class="alt">
<span>    </span><span class="keyword">if</span><span>(!</span><span class="func">is_array</span><span>(</span><span class="vars">$item_id</span><span>))  </span>
</li>
<li><span>    {  </span></li>
<li class="alt">
<span>        </span><span class="vars">$_SESSION</span><span>[</span><span class="string">'cart'</span><span>][</span><span class="string">'item_id'</span><span>] = </span><span class="vars">$qty</span><span>;  </span>
</li>
<li><span>    }  </span></li>
<li class="alt"><span> </span></li>
<li>
<span>    </span><span class="keyword">else</span><span> </span>
</li>
<li class="alt"><span>    {  </span></li>
<li>
<span>        </span><span class="keyword">foreach</span><span>(</span><span class="vars">$item_id</span><span> </span><span class="keyword">as</span><span> </span><span class="vars">$i_id</span><span> => </span><span class="vars">$qty</span><span>)  </span>
</li>
<li class="alt"><span>        {  </span></li>
<li>
<span>            </span><span class="vars">$_SESSION</span><span>[</span><span class="string">'cart'</span><span>][</span><span class="string">'i_id'</span><span>] = </span><span class="vars">$qty</span><span>;  </span>
</li>
<li class="alt"><span>        }  </span></li>
<li><span>    }  </span></li>
<li class="alt"><span>}  </span></li>
<li><span> </span></li>
<li class="alt">
<span>add_to_cart( </span><span class="string">'IPHONE3'</span><span> , 2 );  </span>
</li>
<li>
<span>add_to_cart( </span><span class="keyword">array</span><span>(</span><span class="string">'IPHONE3'</span><span> => 2 , </span><span class="string">'IPAD'</span><span> => 5) ); </span>
</li>
</ol>
ログイン後にコピー

index.php

<ol class="dp-c">
<li class="alt"><span><span><?php  </span></span></li><li><span> </span></li><li class="alt"><span class="func">echo</span><span> </span><span class="string">"Hello"</span><span>;  </span></li><li><span> </span></li><li class="alt"><span class="comment">//Now dont close this tag</span><span> </span></li></ol>
ログイン後にコピー

を実行すると、「Headers selected are selected」というエラーが表示されます。スーパー エクストラ文字」がすでに出力されているので、デバッグを開始する必要があります。スーパー エクストラの場所を見つけるのに時間がかかります。

そのため、閉じるのを省略する習慣を付けてください。

7. すべての入力をどこかに集めて、一度にブラウザに出力します

これは出力バッファリングと呼ばれます。別の関数で出力コンテンツを持っている場合は、

代わりに出力をどこかに集めることもできます。関数のローカル変数に保存するか、ob_start と ob_end_clean を使用します:
<ol class="dp-c"><li class="alt"><span><span><?php  </span></span></li><li><span class="keyword">class</span><span> super_class  </span></li><li class="alt"><span>{  </span></li><li><span>    </span><span class="keyword">function</span><span> super_function()  </span></li><li class="alt"><span>    {  </span></li><li><span>        </span><span class="comment">//super code </span><span> </span></li><li class="alt"><span>    }  </span></li><li><span>}  </span></li><li class="alt"><span>?>  </span></span></li>
<li>
<span class="comment">//super extra character after the closing tag</span><span> </span>
</li>
</ol>
ログイン後にコピー

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

>> str_replaces 関数などの出力を変更します。 preg_replaces を追加するか、HTML コンテンツの監視/デバッグを追加してください。 >> 一部のサイトでエラー メッセージが列または途中に表示されるのがひどいです。処理と出力が混在しているためです。

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

いくつかの XML を出力します。ただし、いくつかの改善が必要です。 .

<ol class="dp-c">
<li class="alt"><span><span class="keyword">require_once</span><span>(</span><span class="string">'super_class.php'</span><span>);  </span></span></li>
<li><span> </span></li>
<li class="alt">
<span class="comment">//echo an image or pdf , or set the cookies or session data</span><span> </span>
</li>
</ol>
ログイン後にコピー

この行は、送信されたコンテンツが XML タイプであることをブラウザーに伝えるため、多くの JavaScript ライブラリもヘッダー情報に依存します。

同様に、JavaScript、CSS、 jpg 画像、png 画像:JavaScript

<ol class="dp-c">
<li class="alt"><span><span><?php  </span></span></li><li><span class="keyword">class</span><span> super_class  </span></li><li class="alt"><span>{  </span></li><li><span>    </span><span class="keyword">function</span><span> super_function()  </span></li><li class="alt"><span>    {  </span></li><li><span>        </span><span class="comment">//super code </span><span> </span></li><li class="alt"><span>    }  </span></li><li><span>}  </span></li><li class="alt"><span> </span></li><li><span class="comment">//No closing tag</span><span> </span></li></ol>
ログイン後にコピー

CSS

<ol class="dp-c"><li class="alt"><span><span class="keyword">function</span><span> print_header()  </span></span></li><li><span>{  </span></li><li class="alt"><span>    </span><span class="func">echo</span><span> </span><span class="string">"<div id='header'>Site Log and Login links</div>"</span><span>;  </span></span></li>
<li><span>}  </span></li>
<li class="alt"><span> </span></li>
<li>
<span class="keyword">function</span><span> print_footer()  </span>
</li>
<li class="alt"><span>{  </span></li>
<li>
<span>    </span><span class="func">echo</span><span> </span><span class="string">"<div id='footer'>Site was made by me</div>"</span><span>;  </span>
</li>
<li class="alt"><span>}  </span></li>
<li><span> </span></li>
<li class="alt"><span>print_header();  </span></li>
<li>
<span class="keyword">for</span><span>(</span><span class="vars">$i</span><span> = 0 ; </span><span class="vars">$i</span><span> < 100; </span><span class="vars">$i</span><span>++)  </span></li><li class="alt"><span>{  </span></li><li><span>    </span><span class="func">echo</span><span> "I is : </span><span class="vars">$i</span><span> <br />';  </span>
</li>
<li class="alt"><span>}  </span></li>
<li><span>print_footer(); </span></li>
</ol>
ログイン後にコピー

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

mysql テーブル エンコーディングに unicode/utf-8 が設定されている場合、phpadmin も正しく表示できます。 , しかし、コンテンツを取得してページに出力すると、文字化けが表示されます。ここで問題となるのは、mysql 接続の文字エンコーディングです。

<ol class="dp-c">
<li class="alt"><span><span class="keyword">function</span><span> print_header()  </span></span></li>
<li><span>{  </span></li>
<li class="alt">
<span>    </span><span class="vars">$o</span><span> = </span><span class="string">"<div id='header'>Site Log and Login links</div>"</span><span>;  </span>
</li>
<li>
<span>    </span><span class="keyword">return</span><span> </span><span class="vars">$o</span><span>;  </span>
</li>
<li class="alt"><span>}  </span></li>
<li><span> </span></li>
<li class="alt">
<span class="keyword">function</span><span> print_footer()  </span>
</li>
<li><span>{  </span></li>
<li class="alt">
<span>    </span><span class="vars">$o</span><span> = </span><span class="string">"<div id='footer'>Site was made by me</div>"</span><span>;  </span>
</li>
<li>
<span>    </span><span class="keyword">return</span><span> </span><span class="vars">$o</span><span>;  </span>
</li>
<li class="alt"><span>}  </span></li>
<li><span> </span></li>
<li class="alt">
<span class="func">echo</span><span> print_header();  </span>
</li>
<li>
<span class="keyword">for</span><span>(</span><span class="vars">$i</span><span> = 0 ; </span><span class="vars">$i</span><span> < 100; </span><span class="vars">$i</span><span>++)  </span></li><li class="alt"><span>{  </span></li><li><span>    </span><span class="func">echo</span><span> "I is : </span><span class="vars">$i</span><span> <br />';  </span>
</li>
<li class="alt"><span>}  </span></li>
<li>
<span class="func">echo</span><span> print_footer(); </span>
</li>
</ol>
ログイン後にコピー

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

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

php5.4前, 字符的默认编码是ISO-8859-1, 不能直接输出如À â等.

<ol class="dp-c"><li class="alt"><span><span class="vars">$value</span><span> = htmlentities(</span><span class="vars">$this</span><span>->value , ENT_QUOTES , CHARSET); </span></span></li></ol>
ログイン後にコピー

php5.4以后, 默认编码为UTF-8, 这將解决很多问题. 但如果你的应用是多语言的, 仍然要留意编码问题,.

11. 不要在应用中使用gzip压缩输出, 让apache处理

考虑过使用 ob_gzhandler 吗? 不要那样做. 毫无意义. php只应用来编写应用. 不应操心服务器和浏览器的数据传输优化问题.

使用apache的mod_gzip/mod_deflate 模块压缩内容.

12. 使用json_encode输出动态javascript内容

时常会用php输出动态javascript内容:

<ol class="dp-c">
<li class="alt"><span><span class="vars">$images</span><span> = </span><span class="keyword">array</span><span>(  </span></span></li>
<li>
<span> </span><span class="string">'myself.png'</span><span> , </span><span class="string">'friends.png'</span><span> , </span><span class="string">'colleagues.png'</span><span> </span>
</li>
<li class="alt"><span>);  </span></li>
<li><span> </span></li>
<li class="alt">
<span class="vars">$js_code</span><span> = </span><span class="string">''</span><span>;  </span>
</li>
<li><span> </span></li>
<li class="alt">
<span class="keyword">foreach</span><span>(</span><span class="vars">$images</span><span> </span><span class="keyword">as</span><span> </span><span class="vars">$image</span><span>)  </span>
</li>
<li><span>{  </span></li>
<li class="alt">
<span class="vars">$js_code</span><span> .= </span><span class="string">"'$image' ,"</span><span>;  </span>
</li>
<li><span>}  </span></li>
<li class="alt"><span> </span></li>
<li>
<span class="vars">$js_code</span><span> = </span><span class="string">'var images = ['</span><span> . </span><span class="vars">$js_code</span><span> . </span><span class="string">']; '</span><span>;  </span>
</li>
<li class="alt"><span> </span></li>
<li>
<span class="func">echo</span><span> </span><span class="vars">$js_code</span><span>;  </span>
</li>
<li class="alt"><span> </span></li>
<li>
<span class="comment">//Output is var images = ['myself.png' ,'friends.png' ,'colleagues.png' ,];</span><span> </span>
</li>
</ol>
ログイン後にコピー

更聪明的做法, 使用 json_encode:

<ol class="dp-c">
<li class="alt"><span><span class="vars">$images</span><span> = </span><span class="keyword">array</span><span>(  </span></span></li>
<li>
<span> </span><span class="string">'myself.png'</span><span> , </span><span class="string">'friends.png'</span><span> , </span><span class="string">'colleagues.png'</span><span> </span>
</li>
<li class="alt"><span>);  </span></li>
<li><span> </span></li>
<li class="alt">
<span class="vars">$js_code</span><span> = </span><span class="string">'var images = '</span><span> . json_encode(</span><span class="vars">$images</span><span>);  </span>
</li>
<li><span> </span></li>
<li class="alt">
<span class="func">echo</span><span> </span><span class="vars">$js_code</span><span>;  </span>
</li>
<li><span> </span></li>
<li class="alt">
<span class="comment">//Output is : var images = ["myself.png","friends.png","colleagues.png"]</span><span> </span>
</li>
</ol>
ログイン後にコピー

优雅乎?

13. 写文件前, 检查目录写权限

写或保存文件前, 确保目录是可写的, 假如不可写, 输出错误信息. 这会节约你很多调试时间. linux系统中, 需要处理权限, 目录权限不当会导致很多很多的问题, 文件也有可能无法读取等等.

确保你的应用足够智能, 输出某些重要信息.

<ol class="dp-c">
<li class="alt"><span><span class="vars">$contents</span><span> = </span><span class="string">"All the content"</span><span>;  </span></span></li>
<li>
<span class="vars">$file_path</span><span> = </span><span class="string">"/var/www/project/content.txt"</span><span>;  </span>
</li>
<li class="alt"><span> </span></li>
<li>
<span class="func">file_put_contents</span><span>(</span><span class="vars">$file_path</span><span> , </span><span class="vars">$contents</span><span>); </span>
</li>
</ol>
ログイン後にコピー

这大体上正确. 但有些间接的问题. file_put_contents 可能会由于几个原因失败:

>>父目录不存在

>>目录存在, 但不可写

>>文件被写锁住?

所以写文件前做明确的检查更好.

<ol class="dp-c">
<li class="alt"><span><span class="vars">$contents</span><span> = </span><span class="string">"All the content"</span><span>;  </span></span></li>
<li>
<span class="vars">$dir</span><span> = </span><span class="string">'/var/www/project'</span><span>;  </span>
</li>
<li class="alt">
<span class="vars">$file_path</span><span> = </span><span class="vars">$dir</span><span> . </span><span class="string">"/content.txt"</span><span>;  </span>
</li>
<li><span> </span></li>
<li class="alt">
<span class="keyword">if</span><span>(</span><span class="func">is_writable</span><span>(</span><span class="vars">$dir</span><span>))  </span>
</li>
<li><span>{  </span></li>
<li class="alt">
<span>    </span><span class="func">file_put_contents</span><span>(</span><span class="vars">$file_path</span><span> , </span><span class="vars">$contents</span><span>);  </span>
</li>
<li><span>}  </span></li>
<li class="alt">
<span class="keyword">else</span><span> </span>
</li>
<li><span>{  </span></li>
<li class="alt">
<span>    </span><span class="keyword">die</span><span>(</span><span class="string">"Directory $dir is not writable, or does not exist. Please check"</span><span>);  </span>
</li>
<li><span>} </span></li>
</ol>
ログイン後にコピー

这么做后, 你会得到一个文件在何处写及为什么失败的明确信息.

14. 更改应用创建的文件权限

在 linux环境中, 权限问题可能会浪费你很多时间. 从今往后, 无论何时, 当你创建一些文件后, 确保使用chmod设置正确权限. 否则的话, 可能文件先是由"php"用户创建, 但你用其它的用户登录工作, 系统將会拒绝访问或打开文件, 你不得不奋力获取root权限,  更改文件的权限等等.

<ol class="dp-c">
<li class="alt"><span><span class="comment">// Read and write for owner, read for everybody else </span><span> </span></span></li>
<li>
<span class="func">chmod</span><span>(</span><span class="string">"/somedir/somefile"</span><span>, 0644);  </span>
</li>
<li class="alt"><span> </span></li>
<li>
<span class="comment">// Everything for owner, read and execute for others </span><span> </span>
</li>
<li class="alt">
<span class="func">chmod</span><span>(</span><span class="string">"/somedir/somefile"</span><span>, 0755); </span>
</li>
</ol>
ログイン後にコピー

15. 不要依赖submit按钮值来检查表单提交行为

<ol class="dp-c">
<li class="alt"><span><span class="keyword">if</span><span>(</span><span class="vars">$_POST</span><span>[</span><span class="string">'submit'</span><span>] == </span><span class="string">'Save'</span><span>)  </span></span></li>
<li><span>{  </span></li>
<li class="alt">
<span>    </span><span class="comment">//Save the things </span><span> </span>
</li>
<li><span>} </span></li>
</ol>
ログイン後にコピー

上面大多数情况正确, 除了应用是多语言的. 'Save' 可能代表其它含义. 你怎么区分它们呢. 因此, 不要依赖于submit按钮的值.

<ol class="dp-c">
<li class="alt"><span><span class="keyword">if</span><span>( </span><span class="vars">$_SERVER</span><span>[</span><span class="string">'REQUEST_METHOD'</span><span>] == </span><span class="string">'POST'</span><span> </span><span class="keyword">and</span><span> isset(</span><span class="vars">$_POST</span><span>[</span><span class="string">'submit'</span><span>]) )  </span></span></li>
<li><span>{  </span></li>
<li class="alt">
<span>    </span><span class="comment">//Save the things </span><span> </span>
</li>
<li><span>} </span></li>
</ol>
ログイン後にコピー

现在你从submit按钮值中解脱出来了.

16. 为函数内总具有相同值的变量定义成静态变量

<ol class="dp-c">
<li class="alt"><span><span class="comment">//Delay for some time </span><span> </span></span></li>
<li>
<span class="keyword">function</span><span> delay()  </span>
</li>
<li class="alt"><span>{  </span></li>
<li>
<span>    </span><span class="vars">$sync_delay</span><span> = get_option(</span><span class="string">'sync_delay'</span><span>);  </span>
</li>
<li class="alt"><span> </span></li>
<li>
<span>    </span><span class="func">echo</span><span> </span><span class="string">"<br />Delaying for $sync_delay seconds..."</span><span>;  </span>
</li>
<li class="alt">
<span>    sleep(</span><span class="vars">$sync_delay</span><span>);  </span>
</li>
<li>
<span>    </span><span class="func">echo</span><span> </span><span class="string">"Done <br />"</span><span>;  </span>
</li>
<li class="alt"><span>} </span></li>
</ol>
ログイン後にコピー

用静态变量取代:

<ol class="dp-c">
<li class="alt"><span><span class="comment">//Delay for some time </span><span> </span></span></li>
<li>
<span class="keyword">function</span><span> delay()  </span>
</li>
<li class="alt"><span>{  </span></li>
<li>
<span>    </span><span class="keyword">static</span><span> </span><span class="vars">$sync_delay</span><span> = null;  </span>
</li>
<li class="alt"><span> </span></li>
<li>
<span>    </span><span class="keyword">if</span><span>(</span><span class="vars">$sync_delay</span><span> == null)  </span>
</li>
<li class="alt"><span>    {  </span></li>
<li>
<span>    </span><span class="vars">$sync_delay</span><span> = get_option(</span><span class="string">'sync_delay'</span><span>);  </span>
</li>
<li class="alt"><span>    }  </span></li>
<li><span> </span></li>
<li class="alt">
<span>    </span><span class="func">echo</span><span> </span><span class="string">"<br />Delaying for $sync_delay seconds..."</span><span>;  </span>
</li>
<li>
<span>    sleep(</span><span class="vars">$sync_delay</span><span>);  </span>
</li>
<li class="alt">
<span>    </span><span class="func">echo</span><span> </span><span class="string">"Done <br />"</span><span>;  </span>
</li>
<li><span>} </span></li>
</ol>
ログイン後にコピー

17. 不要直接使用 $_SESSION 变量

<ol class="dp-c">
<li class="alt"><span><span class="vars">$_SESSION</span><span>[</span><span class="string">'username'</span><span>] = </span><span class="vars">$username</span><span>;  </span></span></li>
<li>
<span class="vars">$username</span><span> = </span><span class="vars">$_SESSION</span><span>[</span><span class="string">'username'</span><span>]; </span>
</li>
</ol>
ログイン後にコピー

这会导致某些问题. 如果在同个域名中运行了多个应用, session 变量可能会冲突. 两个不同的应用可能使用同一个session key. 例如, 一个前端门户, 和一个后台管理系统使用同一域名.

从现在开始, 使用应用相关的key和一个包装函数:

<ol class="dp-c">
<li class="alt"><span><span>define(</span><span class="string">'APP_ID'</span><span> , </span><span class="string">'abc_corp_ecommerce'</span><span>);  </span></span></li>
<li><span> </span></li>
<li class="alt">
<span class="comment">//Function to get a session variable </span><span> </span>
</li>
<li>
<span class="keyword">function</span><span> session_get(</span><span class="vars">$key</span><span>)  </span>
</li>
<li class="alt"><span>{  </span></li>
<li>
<span>    </span><span class="vars">$k</span><span> = APP_ID . </span><span class="string">'.'</span><span> . </span><span class="vars">$key</span><span>;  </span>
</li>
<li class="alt"><span> </span></li>
<li>
<span>    </span><span class="keyword">if</span><span>(isset(</span><span class="vars">$_SESSION</span><span>[</span><span class="vars">$k</span><span>]))  </span>
</li>
<li class="alt"><span>    {  </span></li>
<li>
<span>        </span><span class="keyword">return</span><span> </span><span class="vars">$_SESSION</span><span>[</span><span class="vars">$k</span><span>];  </span>
</li>
<li class="alt"><span>    }  </span></li>
<li><span> </span></li>
<li class="alt">
<span>    </span><span class="keyword">return</span><span> false;  </span>
</li>
<li><span>}  </span></li>
<li class="alt"><span> </span></li>
<li>
<span class="comment">//Function set the session variable </span><span> </span>
</li>
<li class="alt">
<span class="keyword">function</span><span> session_set(</span><span class="vars">$key</span><span> , </span><span class="vars">$value</span><span>)  </span>
</li>
<li><span>{  </span></li>
<li class="alt">
<span>    </span><span class="vars">$k</span><span> = APP_ID . </span><span class="string">'.'</span><span> . </span><span class="vars">$key</span><span>;  </span>
</li>
<li>
<span>    </span><span class="vars">$_SESSION</span><span>[</span><span class="vars">$k</span><span>] = </span><span class="vars">$value</span><span>;  </span>
</li>
<li class="alt"><span> </span></li>
<li>
<span>    </span><span class="keyword">return</span><span> true;  </span>
</li>
<li class="alt"><span>} </span></li>
</ol>
ログイン後にコピー

18. 將工具函数封装到类中

假如你在某文件中定义了很多工具函数:

<ol class="dp-c">
<li class="alt"><span><span class="keyword">function</span><span> utility_a()  </span></span></li>
<li><span>{  </span></li>
<li class="alt">
<span>    </span><span class="comment">//This function does a utility thing like string processing </span><span> </span>
</li>
<li><span>}  </span></li>
<li class="alt"><span> </span></li>
<li>
<span class="keyword">function</span><span> utility_b()  </span>
</li>
<li class="alt"><span>{  </span></li>
<li>
<span>    </span><span class="comment">//This function does nother utility thing like database processing </span><span> </span>
</li>
<li class="alt"><span>}  </span></li>
<li><span> </span></li>
<li class="alt">
<span class="keyword">function</span><span> utility_c()  </span>
</li>
<li><span>{  </span></li>
<li class="alt">
<span>    </span><span class="comment">//This function is ... </span><span> </span>
</li>
<li><span>} </span></li>
</ol>
ログイン後にコピー

这些函数的使用分散到应用各处. 你可能想將他们封装到某个类中:

<ol class="dp-c">
<li class="alt"><span><span class="keyword">class</span><span> Utility  </span></span></li>
<li><span>{  </span></li>
<li class="alt">
<span>    </span><span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">function</span><span> utility_a()  </span>
</li>
<li><span>    {  </span></li>
<li class="alt"><span> </span></li>
<li><span>    }  </span></li>
<li class="alt"><span> </span></li>
<li>
<span>    </span><span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">function</span><span> utility_b()  </span>
</li>
<li class="alt"><span>    {  </span></li>
<li><span> </span></li>
<li class="alt"><span>    }  </span></li>
<li><span> </span></li>
<li class="alt">
<span>    </span><span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">function</span><span> utility_c()  </span>
</li>
<li><span>    {  </span></li>
<li class="alt"><span> </span></li>
<li><span>    }  </span></li>
<li class="alt"><span>}  </span></li>
<li><span> </span></li>
<li class="alt">
<span class="comment">//and call them as  </span><span> </span>
</li>
<li><span> </span></li>
<li class="alt">
<span class="vars">$a</span><span> = Utility::utility_a();  </span>
</li>
<li>
<span class="vars">$b</span><span> = Utility::utility_b(); </span>
</li>
</ol>
ログイン後にコピー

显而易见的好处是, 如果php内建有同名的函数, 这样可以避免冲突.

另一种看法是, 你可以在同个应用中为同个类维护多个版本, 而不导致冲突. 这是封装的基本好处, 无它.

19. Bunch of silly tips 

>>使用echo取代print

>>使用str_replace取代preg_replace, 除非你绝对需要

>>不要使用 short tag

>>简单字符串用单引号取代双引号

>>head重定向后记得使用exit

>>不要在循环中调用函数

>>isset比strlen快

>>始中如一的格式化代码

>>不要删除循环或者if-else的括号

不要这样写代码:

<ol class="dp-c"><li class="alt"><span><span><span style=</span><span class="string">"color:#333333;font-family:''Helvetica, Arial, sans-serif'';"</span><span>></span><span class="keyword">if</span><span>(</span><span class="vars">$a</span><span> == true) </span><span class="vars">$a_count</span><span>++;</span> </span></span></li></ol>
ログイン後にコピー

这绝对WASTE.

写成:

<ol class="dp-c">
<li class="alt"><span><span><span style=</span><span class="string">"color:#333333;font-family:''Helvetica, Arial, sans-serif'';"</span><span>></span><span class="keyword">if</span><span>(</span><span class="vars">$a</span><span> == true)  </span></span></li>
<li><span>{  </span></li>
<li class="alt">
<span>    </span><span class="vars">$a_count</span><span>++;  </span>
</li>
<li><span>}</span> </span></li>
</ol>
ログイン後にコピー

不要尝试省略一些语法来缩短代码. 而是让你的逻辑简短.

>>使用有高亮语法显示的文本编辑器. 高亮语法能让你减少错误.

20. 使用array_map快速处理数组

比如说你想 trim 数组中的所有元素. 新手可能会:

<ol class="dp-c">
<li class="alt"><span><span class="keyword">foreach</span><span>(</span><span class="vars">$arr</span><span> </span><span class="keyword">as</span><span> </span><span class="vars">$c</span><span> => </span><span class="vars">$v</span><span>)  </span></span></li>
<li><span>{  </span></li>
<li class="alt">
<span>    </span><span class="vars">$arr</span><span>[</span><span class="vars">$c</span><span>] = trim(</span><span class="vars">$v</span><span>);  </span>
</li>
<li><span>} </span></li>
</ol>
ログイン後にコピー

但使用 array_map 更简单:

<ol class="dp-c"><li class="alt"><span><span class="vars">$arr</span><span> = </span><span class="func">array_map</span><span>(</span><span class="string">'trim'</span><span> , </span><span class="vars">$arr</span><span>); </span></span></li></ol>
ログイン後にコピー

这会为$arr数组的每个元素都申请调用trim. 另一个类似的函数是 array_walk. 请查阅文档学习更多技巧.

21. 使用 php filter 验证数据

你肯定曾使用过正则表达式验证 email , ip地址等. 是的,每个人都这么使用. 现在, 我们想做不同的尝试, 称为filter.

php的filter扩展提供了简单的方式验证和检查输入.

22. 强制类型检查

<ol class="dp-c">
<li class="alt"><span><span class="vars">$amount</span><span> = </span><span class="func">intval</span><span>( </span><span class="vars">$_GET</span><span>[</span><span class="string">'amount'</span><span>] );  </span></span></li>
<li>
<span class="vars">$rate</span><span> = (int) </span><span class="vars">$_GET</span><span>[</span><span class="string">'rate'</span><span>]; </span>
</li>
</ol>
ログイン後にコピー

这是个好习惯.

23. 如果需要,使用profiler如xdebug

如果你使用php开发大型的应用, php承担了很多运算量, 速度会是一个很重要的指标. 使用profile帮助优化代码. 可使用

xdebug和webgrid.

24. 小心处理大数组

对于大的数组和字符串, 必须小心处理. 常见错误是发生数组拷贝导致内存溢出,抛出Fat

<ol class="dp-c">
<li class="alt"><span><span class="vars">$db_records_in_array_format</span><span>; </span><span class="comment">//This is a big array holding 1000 rows from a table each having 20 columns , every row is atleast 100 bytes , so total 1000 * 20 * 100 = 2MB </span><span> </span></span></li>
<li><span> </span></li>
<li class="alt">
<span class="vars">$cc</span><span> = </span><span class="vars">$db_records_in_array_format</span><span>; </span><span class="comment">//2MB more </span><span> </span>
</li>
<li><span> </span></li>
<li class="alt">
<span>some_function(</span><span class="vars">$cc</span><span>); </span><span class="comment">//Another 2MB ?</span><span> </span>
</li>
</ol>
ログイン後にコピー

当导入或导出csv文件时, 常常会这么做.

不要认为上面的代码会经常因内存限制导致脚本崩溃. 对于小的变量是没问题的, 但处理大数组的时候就必须避免.

确保通过引用传递, 或存储在类变量中:

<ol class="dp-c">
<li class="alt"><span><span class="vars">$a</span><span> = get_large_array();  </span></span></li>
<li>
<span>pass_to_function(&</span><span class="vars">$a</span><span>); </span>
</li>
</ol>
ログイン後にコピー

这么做后,向函数传递变量引用(而不是拷贝数组). 查看

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/445702.htmlTechArticle1.不要使用相对路径 常常会看到: require_once ( '../../lib/some_class.php' ); 该方法有很多缺点: 它首先查找指定的php包含路径, 然后查找当前目录...

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

CakePHP プロジェクトの構成 CakePHP プロジェクトの構成 Sep 10, 2024 pm 05:25 PM

この章では、CakePHP の環境変数、一般設定、データベース設定、電子メール設定について理解します。

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

CakePHP の日付と時刻 CakePHP の日付と時刻 Sep 10, 2024 pm 05:27 PM

Cakephp4 で日付と時刻を操作するには、利用可能な FrozenTime クラスを利用します。

CakePHP ファイルのアップロード CakePHP ファイルのアップロード Sep 10, 2024 pm 05:27 PM

ファイルのアップロードを行うには、フォーム ヘルパーを使用します。ここではファイルアップロードの例を示します。

CakePHP ルーティング CakePHP ルーティング Sep 10, 2024 pm 05:25 PM

この章では、ルーティングに関連する次のトピックを学習します。

CakePHP について話し合う CakePHP について話し合う Sep 10, 2024 pm 05:28 PM

CakePHP は、PHP 用のオープンソース フレームワークです。これは、アプリケーションの開発、展開、保守をより簡単にすることを目的としています。 CakePHP は、強力かつ理解しやすい MVC のようなアーキテクチャに基づいています。モデル、ビュー、コントローラー

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

CakePHP バリデータの作成 CakePHP バリデータの作成 Sep 10, 2024 pm 05:26 PM

Validator は、コントローラーに次の 2 行を追加することで作成できます。

See all articles