1. 関数の任意の数のパラメーター
PHP では、デフォルトのパラメーターを使用して関数を定義できることはご存知かもしれません。しかし、PHP では完全に任意のパラメーターを使用して関数を定義することもできることはご存知ないかもしれません
以下に、デフォルト パラメーターを使用した関数を示す例を示します:
コードをコピー コードは次のとおりです:
// 2 つのデフォルトパラメータを持つ関数
function foo($arg1 = '', $arg2 = '') {
echo " arg1: $arg1n";
echo "arg2: $arg2n";
}
foo('hello','world');
/* 出力:
arg1: hello
arg2 : world
*/
foo();
/* 出力:
arg1:
arg2:
*/
次に、次の関数を見てみましょう。 ?func_get_args() メソッドを使用する変数パラメータ:
// はい、仮パラメータ リストは空です
function foo() {
// すべての受信パラメータの配列を取得します
$args = func_get_args();
foreach ($args as $k => $v) {
echo "arg".($k 1).": $vn";
foo();
/* 何も出力されません */
foo('hello');
/* 出力
arg1: hello
*/
foo( 'hello', 'world', 'again');
/* 出力
arg1: hello
arg2: world
arg3: again
*/
コードをコピー コードは次のとおりです:
// サフィックス PHP を持つすべてのファイルを取得します $files = glob( '*.php');
print_r($files);
/* 出力:
配列
(
[0] => phptest.php
[1] ] = > pi.php
[2] => post_output.php
[3] => test.php
)
*/
なども検索できますof suffixes
// PHP ファイルと TXT ファイルを取得します
$files = glob('*.{php,txt}', GLOB_BRACE);
print_r($files); /* 出力:
配列
(
[0] => phptest.php
[1] => pi.php
[2] => post_output.php
[3] =>test.php
[4] =>log.txt
[5] =>test.txt
)
*/
次のパスも追加できます。 🎜> $ files = glob('../images/a*.jpg');
print_r($files)
/* 出力:
Array
(
[0] => ../images/apple.jpg
[1] => ../images/art.jpg
)
*/
絶対パスを取得したい場合は、 ?realpath() 関数を呼び出すことができます:
$files = glob('../images/a*.jpg');
// 関数を各配列要素に適用します
$files = array_map(' realpath',$files) ;
print_r($files);
/* 出力は次のようになります:
Array
(
[0] => C:wampwwwimagesapple.jpg
[1] => C:wampwwwimagesart.jpg
)
*/
3. プログラムのメモリ使用量の観察コードをより適切に最適化できます。
PHP には、ガベージ コレクション メカニズムと非常に複雑なメモリ管理メカニズムがあります。スクリプトが使用しているメモリの量を確認できます。現在のメモリ使用量を知るには、memory_get_usage() 関数を使用します。ピーク時のメモリ使用量を知りたい場合は、memory_get_peak_usage() 関数を呼び出します。
echo "Initial: ".memory_get_usage()." bytes n"; /* 出力 初期: 361400 バイト */
// メモリ を使用 ($i = 0; $i $array []= md5($i);
}
// メモリの半分を削除
for ($i = 0; $i unset($array) [$i] );
}
echo "Final: ".memory_get_usage()." bytes n" .memory_get_peak_usage()." bytes n"; :13687072バイト
*/
4. CPU 使用率情報
?getrusage() 関数を使用すると、CPU 使用率を知ることができます。この機能は Windows では使用できないことに注意してください。
コードをコピー コードは次のとおりです。
print_r(getrusage());/* Output 配列
(
[ru_oublock] => 0
[ru_inblock] => 0
[ru_msgsnd] => 2
[ru_msgrcv] => 3
[ ru_maxrss] = > 12692
[ru_idrss] => 3864
[ru_majflt] => 1
[ru_nvcsw] => 67
[ru_nivcsw] => 4
[ru_nswap] => 0
[ru_utime.tv_usec] => .tv_sec] => 0
tv_usec] => 6269
[ru_stime.tv_sec] => 0
)
*/
CPU について詳しくない限り、この構造は非常にわかりにくいです。以下にいくつかの説明を示します。
ru_oublock: ブロック出力操作
ru_inblock: ブロック入力操作
ru_msgsnd: 送信メッセージ
ru_msgrcv: 受信メッセージ
ru_maxrss: 最大常駐セット サイズ
ru_ixrss: 共有合計メモリ サイズ
ru_idrss: 非共有メモリの合計サイズ
ru_minflt: ページのリサイクル
ru_majflt: ページの無効化
ru_nsignals: 受信したシグナル
ru_nvcsw: アクティブ コンテキスト スイッチ
ru_nivcsw: パッシブ コンテキスト スイッチ
ru_nswap: スワップ領域
ru_utime.tv_usec: ユーザーモード時間 (マイクロ秒)
ru_utime.tv_sec: ユーザーモード時間 (秒)
ru_stime.tv_usec: システムカーネル時間 (マイクロ秒) )
ru_stime.tv_sec: システム カーネル時間? (秒)
スクリプトが消費する CPU の量を確認するには、「ユーザー モード時間」と「システム カーネル時間」の値を確認する必要があります。秒とマイクロ秒の部分は個別に提供されます。マイクロ秒の値を 100 万で割って秒の値に加算すると、小数部付きの秒数を取得できます。
// 3 秒間スリープします (非ビジー)
sleep(3);
$data = getrusage();
echo "ユーザー時間: ". ru_utime.tv_sec']
$data['ru_utime.tv_usec'] / 1000000);
echo "システム時間: ".
($data['ru_stime.tv_sec']
$data[ 'ru_stime.tv_usec'] / 1000000);
/* Output
ユーザー時間: 0.011552
システム時間: 0
*/
スリープはシステム時間を占有しません。以下:
// 1,000 万回ループします (ビジー)
for($i=0;$i }
$data = getrusage(); echo "ユーザー時間: ".
($data['ru_utime.tv_sec']
) $data['ru_utime.tv_usec'] / 1000000); echo "システム時間: ". $data['ru_stime.tv_sec']
$data['ru_stime.tv_usec'] / 1000000);
/* 出力
ユーザー時間: 1.424592
システム時間: 0.004204
*/
これには約 14 秒の CPU 時間がかかりましたが、システムコールがなかったため、そのほとんどすべてがユーザー時間でした。
システム時間は、CPU がシステム コールでカーネル命令の実行に費やす時間です。以下に例を示します。
コードをコピー
コードは次のとおりです。
$data = getrusage() echo "ユーザー時間: " . ($data['ru_utime.tv_sec'] $data['ru_utime.tv_usec'] / 1000000); echo "システム時間: ". tv_sec']
$data['ru_stime.tv_usec'] / 1000000); /* prints
ユーザー時間: 1.088171
システム時間: 1.675315
*/
上記の例では、より多くの CPU を消費していることがわかります。
5. システム定数
PHP は、現在の行番号 (__LINE__)、ファイル (__FILE__)、ディレクトリ (__DIR__)、関数名 (__FUNCTION__) を取得できる非常に便利なシステム定数を提供します。 )、クラス名 (__CLASS__)、メソッド名 (__METHOD__)、および名前空間 (__NAMESPACE__) は、C 言語とよく似ています。
これらは主にデバッグに使用されると考えられますが、必ずしもそうではありません。たとえば、他のファイルをインクルードするときに ?__FILE__ を使用できます (もちろん、PHP 5.3 以降では __DIR__ も使用できます)。は一例です。
コードをコピー
// これはロードされたスクリプトのパスに相対的なものです
// 異なるディレクトリからスクリプトを実行すると問題が発生する可能性があります
require_once('config/database.php')
//これは常にこのファイルのパスに対する相対パスです
// どこからインクルードされたかは関係ありません
require_once(dirname(__FILE__) . '/config/database.php')
以下は __LINE__ を使用した出力です。プログラムのデバッグに役立つデバッグ情報:
// 何らかのコード
// ...
my_debug("some debug message", __LINE__);
/* 出力
4 行目: いくつかのデバッグ メッセージ
*/
// いくつかのコード
// ...
my_debug("another debug message", __LINE__);
/* 出力
11 行目: 別のデバッグ メッセージ
*/
function my_debug($msg, $line) {
echo "Line $line: $msgn";
}
6. 一意のメッセージを生成します。 ID
多くの人は、以下に示すように、md5() を使用して一意の ID を生成します。
// 一意の文字列を生成します
echo md5(time() . mt_rand(1, 1000000)); 🎜> 実際、PHP にはこれを行うために特別に使用される ?uniqid() という関数があります:
// 一意の文字列を生成します
echo uniqid();
/* 出力
4bd67c947233e
*/
// 別のユニークな文字列を生成
echo uniqid();
/* 出力
4bd67c9472340
出てくるIDの最初の数桁は同じです。ジェネレーターはシステム時間に依存するため、ID を簡単にソートできるため、これは実際には非常に優れた機能です。 MD5 ではこれができません。
名前の重複を避けるためにプレフィックスを追加することもできます。
// プレフィックス
echo uniqid('foo_');
/* 出力
foo_4bd67d6cd8b8f
*/
// エントロピーがさらにあります
echo uniqid('',true);
/* 出力
4bd67d6cd8b926.12135106
*/
// 両方とも
echo uniqid('bar_ ' , true);
/* Output
bar_4bd67da367b650.43684647
*/
さらに、生成される ID は MD5 によって生成される ID よりも短くなり、たくさんのスペース。
コードは次のとおりです: Adipiscip Elite. NUNC UT Elit ID Mi Ultricies Adipiscing. Nulla Facilisi. SAPIEN VEL FEUGIAT VESTIBULUM、Nulla Dui Pretium Orci、 Non Ultricies Elit lacus quis ante . Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam pretium ullamcorper urna quis iaculis 、ornare in mollis echo "元のサイズ: ".strlen($string)."n";
// 複雑な配列
$myvar = array(
'hello',
42,
array(1,'two'),
'apple'
);
//シリアル化
$string = Serialize($myvar);
echo $string; /* 出力
a:4:{i:0;s :5 :"こんにちは";i:1;i:42;i:2;a:2:{i:0;i:1;i:1;s:3:"2";}i:3;s :5 :"apple";}
*/
//逆シリアル化
$newvar = unserialize($string);
print_r($newvar); /* 出力
配列 <🎜; > (
[0] => こんにちは
[1] => 42
[2] => 配列
(
[0] => 1
[ 1] => two
)
[3] => apple
)
*/
これは PHP のネイティブ関数ですが、現在では JSON がますます増えています。人気があるため、PHP は PHP5.2 以降、json_encode() および json_decode() 関数を使用できるようになります。
// 複雑な配列
$myvar = array(
'hello' ,
42,
array(1,'two'),
'apple'
);
// 文字列に変換
$string = json_encode($myvar);
echo $string;
/* prints
["hello",42,[1,"two"],"apple"]
*/
// オリジナルを再現できます変数
$newvar = json_decode($string); 42
[2] => 配列
(
[0] => 1
[1] => two
)
[3] => ; apple
)
*/
これはよりコンパクトに見え、JavaScript や他の言語と互換性があります。ただし、非常に複雑なデータ構造によっては、データ損失が発生する可能性があります。
8. 文字列の圧縮
圧縮というと、実際には文字列も圧縮できると考えられます。 PHP は ?gzcompress() および gzuncompress() 関数を提供します:
コードをコピー
コードは次のとおりです:
$string =
「Lorem IPSUM DOLOROLOLOLR SITAT AMET、Consectetur
/* 元のサイズを出力します
元のサイズ: 800
*/
echo "圧縮サイズ: ".strlen($compressed)."n";
/* 圧縮サイズを出力
圧縮サイズ: 418
*/
// 解凍
$original = gzuncompress($compressed);
圧縮率はほぼ50%。同時に、?gzencode() 関数と gzdecode() 関数を使用して圧縮することもできますが、使用する圧縮アルゴリズムは異なります。
9. シャットダウン関数の登録
スクリプト全体が停止する前にコードを実行できるようにする ?register_shutdown_function() という関数があります。以下の例を見てみましょう:
コードをコピーします
コードは次のとおりです:
// 開始時刻を取得します
$start_time = microtime(true);
// いくつかの処理を行います
// ...
// スクリプトにかかった時間を表示します
echo "実行にかかった時間: ".
(microtime(true) - $start_time).
" 秒。";
上記の例は、特定の関数の実行時間を計算するためにのみ使用されます。その後、関数の途中で ?exit() 関数を呼び出した場合、最終的なコードは実行されません。また、ブラウザでスクリプトが終了した場合 (ユーザーが停止ボタンを押した場合)、スクリプトは実行できません。
register_shutdown_function() を使用すると、スクリプトが停止した後でもプログラムが実行されます。
$start_time = microtime(true);
register_shutdown_function('my_shutdown'); // doいくつかのもの
// ...
function my_shutdown() {
global $start_time;
echo "実行にかかった時間: ".
(microtime(true) - $ start_time). > 「秒。」
}