知っておくべき 9 つの PHP 関数と特徴
何年も PHP を使ってきたにもかかわらず、発見されなかったり、十分に活用されていない機能がいくつかありますが、一度発見すると、非常に便利であることがわかります。ただし、誰もが PHP マニュアルと関数リファレンスを最初から最後まで読んだわけではありません。
1. 任意の数のパラメータを持つ関数
すでにご存知かもしれませんが、PHP ではオプションのパラメータを持つ関数を定義できます。ただし、任意の数の関数パラメーターを完全に許可するメソッドもあります。
まず、次の例にはオプションのパラメーターのみがあります:
view sourceprint?01 // 2 つのオプションの引数を持つ関数
02 function foo($arg1 = '' , $ arg2 = '') {
03 echo "arg1: $arg1n";
04 echo "arg2: $arg2n"; 🎜> 06 foo('hello','world');
07 /* 出力:
08 arg1: hello
09 arg2: world
10 */
11 foo();
12 /* 出力:
13 arg1:
14 arg2:
15 * /
ここで、任意の数の引数を受け入れる関数を構築する方法を見てみましょう。今回は func_get_args() 関数を使用します。
view sourceprint?01 // はい、引数リストは空でもかまいません
02 function foo() {
03 // 渡されたすべての引数の配列を返します
04 $args = func_get_args();
05 foreach ($args as $k => $v) {
06 echo "arg". ": $Vn";
08}
🎜; >10 /* 何も出力しません */
11 foo('hello');
12 /*
13 を出力します arg1: hello
14 * /
15 foo('hello', 'world', 'again');
16 /* 出力
17 arg1: hello
18 arg2: world
19 arg3: again
20 */
2. Glob() 関数を使用してファイルを検索します
多くの PHP 組み込み関数には、非常に優れた機能があります。長い名前。ただし、この関数によく慣れていない限り、Glob() を使用せずに関数が何を行うかを説明するのは難しい場合があります。
これは、scandir() 関数の拡張バージョンに似ています。パターンを使用してファイルを検索できます。
view sourceprint?01 // すべての php ファイルを取得します
02 $files = glob('*.php');
03 print_r($files); >
04 /* 出力は次のようになります:
05 Array
06 (
07 [0] => phptest.php
08 [1] => pi.php
09 [2] => post_output.php
10 [3] => test.php
11 )
12 */
この方法で複数のファイルタイプを取得できます:
view sourceprint?01 // すべての php ファイルと txt ファイルを取得します
02 $ files = glob('*.{php,txt}', GLOB_BRACE);
03 print_r($files);
04 /* 出力は次のようになります:
05配列
06 (
07 [0] =>phptest.php
08 [1] =>pi.php
09 [2 ] =>post_output.php
10 [3] =>test.php
11 [4] =>log.txt
12 = > test.txt
13 )
14 */
これらのファイルは、クエリに基づいて実際にパスを返すことができることに注意してください。
ソースプリントを表示?1 $files = glob('../images/a*.jpg');
2 print_r($files);
3 /*出力は次のようになります:
4 Array
5 (
6 [0] => ../images/apple.jpg
7 [1 ] => ../images/art.jpg
8 )
9 */
各ファイルの完全なパスを取得したい場合は、次のように呼び出します。返す realpath() 関数。
view sourceprint?01 $files = glob('../images/a*.jpg');
02 // 関数を各配列要素に適用します
03 $files = array_map('realpath',$files);
04 print_r($files);
05 /* 出力は次のようになります:
06 配列
07 (
08 [0] => C:wampwwwimagesapple.jpg
09 [1] => C:wampwwwimagesart.jpg
10 )
11 */
3. メモリ使用量情報
スクリプトのメモリ使用量を観察することで、それに応じてコードを最適化できます。
PHP にはガベージ コレクターとかなり高度なメモリ マネージャーが備わっています。メモリの使用はスクリプトの開始時に始まります。スクリプトの実行に応じて、メモリ使用量は増加または減少します。現在のメモリ使用量を取得するには、memory_get_usage() 関数を使用できます。また、いつでもメモリ使用量の最高点を取得できます。以下は、memory_get_usage() 関数の使用例です。
view sourceprint?01 echo "初期値: ".memory_get_usage()." バイト n";
02 /* 印刷
03 初期値: 361400 バイト
04 */
05 // メモリ
06 for ($i = 0; $i
07 を使い切ってみましょう$array []= md5($i);
08 }
09 // 配列
10 の半分を削除しましょう ($i = 0; $i < 100000; $i++) {
11 unset($array[$i]);
13 echo "最終: ".memory_get_usage() " bytes n";
14 /* prints
15 最終: 885912 バイト
16 */
17 echo "ピーク: ".memory_get_peak_usage( )." bytes n";
18 /*
19 ピーク: 13687072 バイト
20 */
4. >これには、getrusage() 関数を使用します。この機能は Windows プラットフォームでは動作しないことに注意してください。
view sourceprint?01 print_r(getrusage());
02 /* 印刷
03 配列
04 (
05 [ru_oublock] => 0
06 [ru_inblock] => 0
07 [ru_msgsnd] => 2
08 [ru_msgrcv] => 🎜>
09 [ru_maxrss] => 12692
10 [ru_ixrss] => 764
12 [ru_minflt;] ] => 94
13 [ru_majflt] => 0
14 [ru_nsignals] => 1
15 [ru_nvcsw] =>
16 [ru_nivcsw] => 4
17 [ru_nswap] => 0
18 [ru_utime.tv_usec] => 0 .tv_sec] => 0
20 [ru_stime.tv_usec] => 6269
21 [ru_stime.tv_sec] => 0
22 )
23 */
これは、システム管理者としての経験がない限り、非常に謎めいており、理解するのが少し難しいように思えます。以下は、各値の概要です (覚えておく必要はないかもしれません)。
<🎜。 >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: システム使用量time (秒)
スクリプトによって消費される CPU パワーを確認するには、ユーザー時間とシステム時間の値を観察する必要があります。秒とミリ秒はデフォルトで独立して提供されます。 100 万ミリ秒の値を秒の値に変換し、10 進数の秒数として扱うことができます。
例を見てみましょう:
view sourceprint?01 // 3 秒間スリープします (非ビジー)
02 sleep(3); 03 $data = getrusage();
04 echo "ユーザー時間: ".
05 ($data['ru_utime.tv_sec'] +
06 $data [ 'ru_utime.tv_usec'] / 1000000);
07 echo "システム時間: ".
08 ($data['ru_stime.tv_sec'] +
09 $ data['ru_stime.tv_usec'] / 1000000);
10 /* 印刷
11 ユーザー時間: 0.011552
12 システム時間: 0
13 */
スクリプトの実行には約 3 秒かかりましたが、CPU 使用率は非常に低かったです。スリープが機能するため、スクリプトは実際には CPU リソースを消費しません。もちろん、実際に待ち時間を必要とするタスクは他にもありますが、ディスクの読み取りおよび書き込み操作で CPU 時間を待機してはなりません。したがって、CPU 使用率と実際の実行時間は必ずしも同じではないことがわかります。
これは別の例です。
view sourceprint?01 // 1,000 万回ループします (ビジー)
02 for($i=0;$i<10000000;$i++) {
03 }
04 $data = getrusage();
05 echo "ユーザー時間: ".
06 ($data['ru_utime.tv_sec'] +
07 $data['ru_utime.tv_usec'] / 1000000);
08 echo "システム時間: ".
09 ($data['ru_stime.tv_sec'] + <🎜) >
10 $data['ru_stime.tv_usec'] / 1000000);
11 /* 印刷
12 ユーザー時間: 1.424592
13 システム時間: 0.004204
14 */
これには約 1.4 秒の CPU 時間がかかりました。このほとんどすべては、システムではなくユーザーが費やした時間です。
システム時間は、CPU 上で実行されるプログラムを表すカーネル システム コール時間に分割された時間です。 (もっと簡潔な説明を持っている人はいますか?助けてください!) 以下に例を示します:
view sourceprint?01 $start = microtime(true)
02 // microtime を約 3 秒間呼び出し続けます。
03 while(microtime(true) - $start <3) {
04 }
05 $data = getrusage(); echo "ユーザー時間: ".
07 ($data['ru_utime.tv_sec'] +
08 $data['ru_utime.tv_usec'] / 1000000); >09 echo "システム時間: ".
10 ($data['ru_stime.tv_sec'] +
11 $data['ru_stime.tv_usec'] / 1000000);
12 /* 印刷
13 ユーザー時間: 1.088171
14 システム時間: 1.675315
15 */
5. >PHP は、現在の行番号 (__LINE__)、ファイル パス (__FILE__)、ディレクトリ (__DIR__)、関数名 (__FUNCTTION__)、クラス名 (__CLASS__)、メソッド名 (__METHOD__)、および名前空間 (__NAMESPACE__) を取得するメソッドを提供します。上記は一般的に使用される魔法の定数です。最も一般的に使用されるのは (__FILE__) だと思います。
Rikku はすべてを説明するつもりはありませんが、いくつかの使用例について説明します。
もちろん他のスクリプトも含まれています。 ((__DIR__) には PHP 5.3 以降が必要です):
view sourceprint?1 // これはロードされたスクリプトのパスに相対的なものです
2 // 異なるディレクトリからスクリプトを実行すると問題が発生する可能性があります
3 require_once('config/database.php');
4 // これは常にこのファイルのパスに対する相対パスです
5 // どこに含まれているかに関係なくfrom
6 require_once(dirname(__FILE__) . '/config/database.php');
デバッグを容易にするために __LINE__ を使用すると、行番号を追跡できます:
sourceprint を表示?01 // 何らかのコード
02 // ...
03 my_debug("何らかのデバッグ メッセージ", __LINE__);
04 /* 印刷
05 4 行目: デバッグ メッセージ
06 */
07 // さらにコード
08 // ...
09 my_debug("別のデバッグ メッセージ", __LINE__);
10 /*
11 を出力します 11 行目: 別のデバッグ メッセージ
12 */
13 function my_debug($msg, $line) {
14 echo "Line $line: $msgn";
15 }
6. >一意の文字列を生成する必要がある状況があります。この md5() 関数は、正確にはこの目的のために存在しているわけではありませんが、多くの人が使用しているのを目にします。
view sourceprint?1 // 固有の文字列を生成
2 echo md5( time() . mt_rand(1,1000000));
実際には、この目的のために存在する uniqid() という特別な PHP 関数があります。一意の文字列
02 echo uniqid();
03 /*
04 4bd67c947233e
05 */
06 //別の一意の文字列を生成します
07 echo uniqid();
08 /*
09 4bd67c9472340
10 */
文字列が一意であっても、最初の数文字は非常に似ていることに気づくかもしれません。これは、生成された文字列がサーバー時間に関連付けられているためです。これには実際、非常に良い副作用があります。新しく生成された各 ID は生成後にアルファベット順にソートされるため、ソートのロジックも節約されます。
重複の可能性を減らすために、プレフィックスを渡すか、2 番目のパラメーターにプレフィックスを追加できます。
view sourceprint?01 // プレフィックス
02 echo uniqid('foo_');
03 /*
04 foo_4bd67d6cd8b8f
を出力します
05 */
06 // より多くのエントロピーを使用します
07 echo uniqid('',true);
08 /*
を出力します09 4bd67d6cd8b926.12135106
10 */
11 // 両方
12 echo uniqid('bar_',true);
13 /* を出力します。
14 bar_4bd67da367b650.43684647
15 */
この関数は md5() よりも短い文字列を生成するため、スペースも節約されます。
7. シリアル化
データベースに保存する必要がある複雑な変数または大きなテキスト ファイルはありますか?それで、それをフォーマットされた文字列配列またはオブジェクトに変換する解決策を思いつきましたか?心配しないでください。PHP はこの機能をすでに用意しています。
シリアル化には 2 つのメソッドがあり、シリアル化には Serialize() を使用し、逆シリアル化には unserialize() を使用する例を示します。 >02 $myvar = array(
03 'hello',
04 42,
05 array(1,'two'),
06 'apple'
07 );
08 // 文字列に変換
09 $string = Serialize($myvar);
10 echo $文字列;
11 /*
12 a:4:{i:0;s:5:"hello";i:1;i:2;a: 2:{i:0;i:1;i:1;s:3:"2";}i:3;s:5:"リンゴ";}
13 */
14 // 元の変数を再現できます
15 $newvar = unserialize($string);
16 print_r($newvar);
17 /* 出力します
18 配列
19 (
20 [0] => こんにちは
21 [1] => 42
22 [2] => 配列
23 (
24 [0] => 1
25 [1] ; 2
26 ) )
27 [3] => apple
28 )
29 */
これは PHP 独自のシリアル化メソッドです。しかし、近年 JSON の人気が高まっているため、PHP 5.2 で JSON のサポートを追加することが決定されました。これで、 json_encode() 関数と json_decode() 関数を使用してジョブを実行できるようになります:
view sourceprint?01 // 複合配列
02 $myvar = array(
03 'こんにちは',
04 42,
05 array(1,'two'),
06 'apple'
07 );
08 // 文字列に変換します
09 $string = json_encode($myvar);
10 echo $string;
12 ["hello",42,[1,"two"],"apple"]
13 */
14 // 元の変数を再現できます
15 $newvar = json_decode($string);
16 print_r($newvar);
17 /* 配列
を出力します
19 (
20 [0] => こんにちは
21 [1] => 42
22 [2] => 配列
23 (
24 [0] => 1
25 [1] => 2
26 )
27 [3 ] => apple
28 )
29 */
これはよりコンパクトに見えます。もちろん、JavaScriptなど他の言語との互換性も最高です。ただし、一部の複雑なオブジェクトでは、一部の情報が理由もなく失われることに注意する必要があります。
8. 圧縮文字列
圧縮というと、通常は zip ファイルのようなファイルを思い浮かべます。 PHP の長い文字列を圧縮でき、アーカイブ ファイルは必要ありません。
次の例では、gzcompress() 関数と gzuncompress() 関数を使用します。
view sourceprint?01 $string =
02 "Lorem ipsum dolor sit amet 、consectetur
03 adipiscing elit。Nunc ut elit id mi ultrices
06 non ultricies elit lacus quis ante。 07 座って、コンセクテトゥール アディピシング エリート >
09 セド turpis テンポル ラクトゥス。Curabitur sed nibh eu elit
10 モリス コングエ 🎜>
12 テルス ポスエレ アディピシング。
13 セド マグナ ニシ、モリスでオルナーレ
14 セド ヌンク 🎜>
18 $compressed = gzcompress($string); >
19 echo "元のサイズ: ".strlen($string)."n";
20 /* 印刷
21 元のサイズ: 800
22 */
23 echo "圧縮サイズ: ".strlen($compressed)."n";
24 /* 圧縮サイズ: 418
26 */
27 // 元に戻す
28 $original = gzuncompress($compressed) ;
ほぼ 50% 圧縮できました。さらに、 gzencode() と gzdecode() は、異なる圧縮アルゴリズムを使用して同様の結果を達成できます。
9. register_shutdown_function
コードの実行権限を得る前にスクリプトの実行を完了できる register_shutdown_function() という関数があります。
スクリプトが最後まで実行されたときに、実行にかかった時間などのベースライン統計を取得したいとします。
view sourceprint?1 // 開始時刻を取得します。
2 $start_time = microtime(true);
3 // 何かを実行します
4 // ...
5 // 方法を表示しますスクリプトの実行にかかった時間は
6 echo "。
7 (microtime(true) - $start_time)。
8 " 秒。";
これらは最初は些細なことのように思えるかもしれません。一番下にコードを追加するだけで、スクリプトを実行する前に完了します。ただし、スクリプト内で exit() 関数を呼び出した場合、コードは実行されません。さらに、致命的なエラーが発生した場合、またはユーザーがスクリプトを終了した場合 (ブラウザの停止ボタンを押した場合)、ページが再度更新されてもスクリプトは実行されません。
register_shutdown_function() を使用すると、コードは理由もなく強制的に停止されます。
view sourceprint?01 $start_time = microtime(true);
02 register_shutdown_function ( 'my_shutdown');
03 // 何かを実行します
04 // ...
05 function my_shutdown() {
06 global $ start_time;
07 echo "実行にかかった時間: ".
08 (microtime(true) - $start_time)。