初心者に役立つPHPテクニック10個

9558 ワード

PHPコードの改善と最適化に関するヒントとテクニックを紹介します.参考にしてください.具体的な内容は以下の通りです.
1.相対パスを使用せずにルートパスを定義する
このようなコード行はよく見られます.

require_once('../../lib/some_class.php');

この方法には多くの欠点があります.
1)、phpに含まれるパス内の指定されたディレクトリを最初に検索し、現在のディレクトリを表示します.そのため、多くのディレクトリがチェックされます.2)、1つのスクリプトが別のスクリプトの異なるディレクトリに含まれている場合、その基本ディレクトリはスクリプトを含むディレクトリになります.3)、もう1つの問題は、スクリプトがcronから実行されると、親ディレクトリが作業ディレクトリとして使用されない可能性があることです.絶対パスを使用すると良い方法になります

define('ROOT' , '/var/www/project/');
require_once(ROOT . '../../lib/some_class.php');

//rest of the code


これは絶対パスであり、常に一定に保たれます.しかし、私たちはさらに改善することができます.ディレクトリ/var/www/projectは変更できますが、毎回変更しますか?
いいえ、マジック定数を使用します.FILE__移植可能にすることができますよく見てください.

//suppose your script is /var/www/project/index.php
//Then __FILE__ will always have that full path.

define('ROOT' , pathinfo(__FILE__, PATHINFO_DIRNAME));
require_once(ROOT . '../../lib/some_class.php');

//rest of the code


したがって、プロジェクトをオンラインのサーバに移動するなど、異なるディレクトリに移行しても、これらのコードは変更する必要がなく実行できます.
2.requireを使用しない.requireを含む.onceまたはinclude_once
スクリプトには、クラスライブラリ、ユーティリティファイル、補助関数など、さまざまなファイルが含まれている可能性があります.

require_once('lib/Database.php');
require_once('lib/Mail.php');

require_once('helpers/utitlity_functions.php');


これはかなりざらざらしている.コードはより柔軟にする必要があります.補助関数を書くと、物をより簡単に含めることができます.例を挙げます.

function load_class($class_name)
{
  //path to the class file
  $path = ROOT . '/lib/' . $class_name . '.php');
  require_once( $path ); 
}

load_class('Database');
load_class('Mail');


違いは見えますか?明らかに.これ以上説明する必要はありません.
さらに改善することもできます

function load_class($class_name)
{
  //path to the class file
  $path = ROOT . '/lib/' . $class_name . '.php');

  if(file_exists($path))
  {
    require_once( $path ); 
  }
}


このようにすれば、多くのことができます.
同じクラスファイルの複数のディレクトリを検索します.クラスファイルを含むディレクトリを簡単に変更し、どこのコードも破壊しません.同様の関数を使用して、補助関数、HTMLコンテンツなどを含むファイルをロードします.
3.アプリケーションでのデバッグ環境の維持
開発の過程で、echoデータベースのクエリーを行い、問題を創造する変数をダンプし、問題が解決されると、それらを注釈したり削除したりします.しかし、すべてをその場に残しておくと、長期的な助けを提供することができます.
コンピュータを開発する上で、このようにすることができます.

define('ENVIRONMENT' , 'development');

if(! $db->query( $query )
{
  if(ENVIRONMENT == 'development')
  {
    echo "$query failed";
  }
  else
  {
    echo "Database error. Please contact administrator";
  }  
}


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

define('ENVIRONMENT' , 'production');

if(! $db->query( $query )
{
  if(ENVIRONMENT == 'development')
  {
    echo "$query failed";
  }
  else
  {
    echo "Database error. Please contact administrator";
  }  
}


4.セッションによるステータスメッセージの伝播
ステータス・メッセージは、タスクを実行した後に生成されるメッセージです.







...
このようなコードはよくあります.変数を用いて状態情報を表示するには一定の限界がある.リダイレクトで送信できないため(GET変数として次のスクリプトに伝播しない限り、これは非常に愚かです).また、大規模なスクリプトには複数のメッセージなどがある場合があります.
最善の方法は、同じページでもセッションを使用して伝播することです.そうするには各ページにセッションが必要です.start.

function set_flash($msg)
{
  $_SESSION['message'] = $msg;
}

function get_flash()
{
  $msg = $_SESSION['message'];
  unset($_SESSION['message']);
  return $msg;
}


あなたのシナリオでは、





Status is : 
...
5.関数を柔軟にする

function add_to_cart($item_id , $qty)
{
  $_SESSION['cart'][$item_id] = $qty;
}

add_to_cart( 'IPHONE3' , 2 );


単一のエントリを追加する場合は、上記の関数を使用します.では、複数のエントリを追加する場合は、別の関数を作成する必要がありますか?NO.関数を柔軟にして異なるパラメータを受け入れられるようにすればよい.以下を参照してください.

function add_to_cart($item_id , $qty)
{
  if(!is_array($item_id))
  {
    $_SESSION['cart'][$item_id] = $qty;
  }

  else
  {
    foreach($item_id as $i_id => $qty)
    {
      $_SESSION['cart'][$i_id] = $qty;
    }
  }
}

add_to_cart( 'IPHONE3' , 2 );
add_to_cart( array('IPHONE3' => 2 , 'IPAD' => 5) );


はい、同じ関数で異なるタイプの出力を受け入れることができます.以上のコードは多くの場所に適用され、コードをより柔軟にすることができます.
6.スクリプトの最後の行である場合は、終了したphpラベルを省略します.
なぜ多くのブログ記事がphpのテクニックについて話すときにこのテクニックを省略するのか分かりません.

 
 

これは多くの問題を省略するのに役立ちます.例を挙げます.
クラスファイルsuper_class.php


//super extra character after the closing tag

今はindexを見てphp

require_once('super_class.php');

//echo an image or pdf , or set the cookies or session data


間違ったHeaderを送信します.どうしてですか.「スーパー余剰文字」のため、すべてのタイトルがこれを処理しました.デバッグを開始しなければなりません超余分な空間を探すのに多くの時間を浪費する必要があるかもしれません.
そのため、終了ラベルを省略する習慣を身につけなければなりません.

 
 

これでもっといいです.
7.すべての出力を1つの場所で収集し、ブラウザに一度に出力
これがいわゆる出力バッファです.たとえば、同じ関数からこのような内容が得られません.

function print_header()
{
  echo "";
}

function print_footer()
{
  echo "";
}

print_header();
for($i = 0 ; $i < 100; $i++)
{
  echo "I is : $i 
'; } print_footer();

実際には、まず1つの場所ですべての出力を収集する必要があります.関数の変数の内部に格納するか、ob_を使用します.startとob_end_clean.だから、今はこう見えるはずだ.

function print_header()
{
  $o = "";
  return $o;
}

function print_footer()
{
  $o = "";
  return $o;
}

echo print_header();
for($i = 0 ; $i < 100; $i++)
{
  echo "I is : $i 
'; } echo print_footer();

では、なぜ出力バッファを作るべきなのでしょうか.
出力をブラウザに送信する前に変更できます.必要なら変更してください.例えばstr_replaces、またはpreg_replaces、またはprofiler/debugger出力などの追加htmlを末尾に追加します.ブラウザに出力し、同じ時間にphp処理をするのは良いアイデアではありません.このようなサイトを見たことがありますが、Fatal errorはサイドバーや画面の真ん中のボックスにありますか?なぜこんなことが起こったのか知っていますか.処理過程と出力が混ざっているからだ.8.HTML以外のコンテンツが出力された場合、ヘッダを介して正しいmimeタイプが送信される
XMLを見てください.

$xml = '';
$xml = "
 0
";

//Send xml data
echo $xml;


正常に動作.しかし、いくつかの改善が必要です.

$xml = '';
$xml = "
 0
";

//Send xml data
header("content-type: text/xml");
echo $xml;


ヘッダー行に注意してください.この行のコードはブラウザにこの内容がXMLの内容であることを教えます.したがって、ブラウザはそれを正しく処理することができます.多くのJavaScriptライブラリもヘッダ情報に依存しています.
JavaScript,css,jpgピクチャ,png画像も同じです.
JavaScript

header("content-type: application/x-javascript");
echo "var a = 10";
CSS

header("content-type: text/css");
echo "#div id { background:#000; }"


9.MySQL接続の正しい文字コードを設定する
unicode/utf-8文字がmysqlテーブルに正しく格納されているという問題に遭遇したことがあります.phpmyadminも正しいと表示されていますが、使用するとページに正しく表示されません.中の奥義はMySQL接続校正にある.

$host = 'localhost';
$username = 'root';
$password = 'super_secret';

//Attempt to connect to database
$c = mysqli_connect($host , $username, $password);

//Check connection validity
if (!$c) 
{
  die ("Could not connect to the database host: 
". mysqli_connect_error()); } //Set the character set of the connection if(!mysqli_set_charset ( $c , 'UTF8' )) { die('mysqli_set_charset() failed'); }

データベースに接続すると、接続文字セットを設定します.アプリケーションで複数の言語を使用する場合は、絶対に必要です.
さもないと何が起こるの?英語以外のテキストには多くのボックスと???が表示されます.
10.正しい文字セットオプションを持つhtmlentitiesを使用する
PHP 5.4以前に使用されていたデフォルト文字コードはISO-8859-1であり、例えばÀࣚのような文字を表示することはできなかった.

$value = htmlentities($this->value , ENT_QUOTES , 'UTF-8');

PHP 5.4からデフォルトでUTF-8に符号化され、ほとんどの問題が解決されましたが、アプリケーションが複数の言語を使用している場合は、このことを知っておいたほうがいいです.
まずこの10つのテクニックを紹介します.残りのPHPテクニックは次の文章で共有します.読んでくれてありがとう.