ホームページ  >  記事  >  バックエンド開発  >  PHPサイト制作のヒントまとめ!

PHPサイト制作のヒントまとめ!

WBOY
WBOYオリジナル
2016-06-20 13:01:191204ブラウズ

静的呼び出しメンバーは静的として定義する必要があります (PHP5 のみ)

ヒント: PHP 5 では、静的メンバーの概念が導入されています。静的メンバーは、PHP 4 の関数内の静的変数と同じ機能を持ちますが、前者はクラスのメンバーとして使用されます。静的変数は、Ruby のクラス変数に似ています。クラスのすべてのインスタンスは同じ静的変数を共有します。

引用:

// PHP CODE Highliting for CU by dZ902
<?php
class foo {
    function bar() {
        echo 'foobar';
    }
}

$foo = new foo;

// instance way

$foo->bar();

// static way

foo::bar();
?>



非静的メンバーを静的に呼び出す効率は、静的メンバーを静的に呼び出すよりも 50 ~ 60% 遅くなります。主な理由は、前者は E_STRICT 警告を生成し、内部で変換する必要があるためです。

[size=+2]クラス定数を使用する (PHP5 のみ)

ヒント: PHP 5 の新機能。C++ の const に似ています。

クラス定数を使用する利点は次のとおりです:

- コンパイル時の解析、余分なオーバーヘッドなし
- ハッシュ テーブルが小さいため、内部ルックアップが高速になります
- クラス定数は特定の「名前空間」にのみ存在するため、ハッシュ名は短くなります
- コードがよりクリーンになり、デバッグが容易になります

[size=+2](一時的に) require/include_once は使用しないでください

require/include_once は呼び出されるたびにターゲット ファイルを開きます。

- 絶対パスを使用する場合、PHP 5.2/6.0 ではこの問題は発生しません
- APC キャッシュ システムの新しいバージョンは、この問題を解決しました

ファイル I/O の増加 => 効率の低下

必要に応じて、ファイルが必須/インクルードされているかどうかを自分で確認できます。

[size=+2]意味のない関数を呼び出さない

対応する定数がある場合は関数を使用しないでください。

引用:

// PHP CODE Highliting for CU by dZ902

<?php
php_uname('s') == PHP_OS;
php_version() == PHP_VERSION;
php_sapi_name() == PHP_SAPI;
?>


あまり使用していませんが、効率向上は約3500%です。

[size=+2]最速の Win32 チェック

引用:

// PHP CODE Highliting for CU by dZ902

<?php
$is_win = DIRECTORY_SEPARATOR == '//';
?>



- 関数は必要ありません
- Win98/NT/2000/XP/Vista/Longhorn/Shorthorn/Whistler...ユニバーサル
- いつでも利用可能

[size=+2]時間の問題 (PHP>5.1.0 のみ)

ソフトウェアの現在時刻をどのようにして知ることができますか?シンプルに、「time() time() もう一度、あなたは私に尋ねます...」。

ただし、この関数は常に呼び出されるため、処理が遅くなります。

さて、$_SERVER['REQUEST_TIME'] を使用します。関数を呼び出す必要はありません。再度保存してください。

[size=+2]PCRE を高速化

- 保存する必要のない結果については、() を使用せず、常に (?
を使用してください)
このようにして、PHP は一致するコンテンツにメモリを割り当てる必要がなくなり、コストが節約されます。効率が約15%向上します。

・ 正規表現が使用できる場合は、マニュアルの「文字列関数」をよく読んで解析してください。見逃している便利な機能はありますか?

例:

strpbrk()
strncasecmp()
strpos()/strrpos()/stripos()/strripos()



[size=+2]strtr を加速します

変換する必要があるのが 1 文字だけの場合は、配列の代わりに文字列を使用して strtr を実行します:

引用:

// PHP CODE Highliting for CU by dZ902

<?php
$addr = strtr($addr, "abcd", "efgh"); // good
$addr = strtr($addr, array('a' => 'e',
                           // ...
                           )); // bad
?>



効率の向上: 10 倍。

[size=+2]不必要な置換を行わないでください

str_replace は、置換を行わない場合でも引数にメモリを割り当てます。とても遅いです!解決策:

- strpos を使用して最初に (非常に高速に) 検索し、置換が必要かどうかを確認し、必要な場合は
を置換します。
効率:

- 交換が必要な場合: 効率はほぼ同等で、差は約 0.1% です。
- 置換が必要ない場合: strpos を使用すると 200% 高速になります。

[size=+2]邪悪な @ オペレーター

@ 演算子を乱用しないでください。 @ は単純そうに見えますが、実際には舞台裏で多くの操作が行われています。 @ を使用した場合と使用しない場合の効率の差は 3 倍です。

特にループ内で @ を使用しないでください。5 ループのテストでは、最初に error_reporting(0) を使用してエラーをオフにし、ループが完了してからオンにすると、@ を使用するよりも高速になります。

[size=+2]strncmp を上手に活用しましょう

「最初の n 文字」が同じかどうかを比較する必要がある場合は、substr/strto lower の代わりに strncmp/strncasecmp を使用し、PCRE は言うまでもなく、ereg については決して言及しないでください。 strncmp/strncasecmp は (それほどではありませんが) 最も効率的です。

[size=+2]substr_compare は注意して使用してください (PHP5 のみ)

上記のロジックによれば、substr_compare は最初とその後で substr よりも高速になるはずです。以下の場合を除き、答えはノーです。

- 大文字と小文字を区別しない比較
- より大きな文字列を比較

[size=+2]文字列の代わりに定数を使用しないでください

理由:

- ハッシュ テーブルを 2 回クエリする必要があります
- 定数名は小文字に変換する必要があります (2 番目のクエリを実行するとき)
- E_NOTICE 警告を生成
- 一時的な文字列が作成されます

効率の差: 700%。

[size=+2]for ループの条件文に count/strlen/sizeof を入れないでください

ヒント: 私の個人的なアプローチ

引用:

// PHP CODE Highliting for CU by dZ902

<?php
for ($i = 0, $max = count($array);$i < $max; ++$i);
?>



以下と比較した効率の向上:

- カウント 50%
- ストレン 75%

[size=+2]短いコードは必ずしも速いとは限りません

引用:

// PHP CODE Highliting for CU by dZ902

<?php
// longest
if ($a == $b) {
    $str .= $a;
} else {
    $str .= $b;
}

// longer
if ($a == $b) {
    $str .= $a;
}
$str .= $b;

// short
$str .= ($a == $b ? $a : $b);
?>



どちらが速いと思いますか?

効率の比較:

- 最長: 4.27
- ロング: 4.43
- ショート: 4.76

信じられない?もう 1 つあります:

引用:

// PHP CODE Highliting for CU by dZ902

<?php
// original
$d = dir('.');
while (($entry = $d->read()) !== false) {
    if ($entry == '.' || $entry == '..') {
        continue;
    }
}

// versus
glob('./*');

// versus (include . and ..)
scandir('.');
?>



哪个快?

效率比较:

- original: 3.37
- glob: 6.28
- scandir: 3.42
- original without OO: 3.14
- SPL (PHP5): 3.95

画外音:从此也可以看出来 PHP5 的面向对象效率提高了很多,效率已经和纯函数差得不太多了。

[size=+2]提高 PHP 文件访问效率

需要包含其他 PHP 文件的时候,使用完整路径,或者容易转换的相对路径。

QUOTE:

// PHP CODE Highliting for CU by dZ902

<?php

include 'file.php'; // bad approach

incldue './file.php'; // good

include '/path/to/file.php'; // ideal

?>



[size=+2]物尽其用

PHP 有很多扩展和函数可用,在实现一个功能的之前,应该看看 PHP 是否有了这个功能?是否有更简单的实现?

QUOTE:

// PHP CODE Highliting for CU by dZ902

<?php
$filename = "./somepic.gif";
$handle = fopen($filename, "rb");
$contents = fread($handle, filesize($filename));
fclose($handle);

// vs. much simpler

file_get_contents('./somepic.gif');
?>



[size=+2]关于PHP引用的技巧

引用可以:

- 简化对复杂结构数据的访问
- 优化内存使用

QUOTE:

// PHP CODE Highliting for CU by dZ902

<?php
$a['b']['c'] = array();

// slow 2 extra hash lookups per access
for ($i = 0; $i < 5; ++$i)
    $a['b']['c'][$i] = $i;

// much faster reference based approach
$ref =& $a['b']['c'];
for ($i = 0; $i < 5; ++$i)
    $ref[$i] = $i;
?>



QUOTE:

// PHP CODE Highliting for CU by dZ902

<?php
$a = 'large string';

// memory intensive approach
function a($str)
{
    return $str.'something';
}

// more efficient solution
function a(&$str)
{
    $str .= 'something';
}
?>


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