[はじめに] PHP 開発を行ったことのあるプログラマーは、PHP に多くの組み込み関数があることを知っておく必要があります。これらをマスターすると、開発に必要な 8 つの PHP 関数を共有します。非常に実践的であり、すべての PHP 開発者がこれらをマスターできることを願っています。 1. 任意の数の関数を渡します
PHP 開発を行ったプログラマは、PHP に多くの組み込み関数があることを知っているはずです。これらをマスターすると、PHP 開発がより快適になるでしょう。この記事では、すべての PHP 関数について説明します。非常に実践的なので、すべての PHP 開発者がマスターできることを願っています。
1. 任意の数の関数パラメータを渡す
.NET または JAVA プログラミングでは、関数パラメータの数は通常固定されていますが、PHP では任意の数のパラメータを使用できます。次の例は、PHP 関数のデフォルトのパラメーターを示しています:
// 两个默认参数的函数 function foo($arg1 = ”, $arg2 = ”) { echo “arg1: $arg1\n”; echo “arg2: $arg2\n”; } foo(‘hello’,'world’); /* 输出: arg1: hello arg2: world */ foo(); /* 输出: arg1: arg2: */ 下面这个示例是PHP的不定参数用法,其使用到了 func_get_args()方法: // 是的,形参列表为空 function foo() { // 取得所有的传入参数的数组 $args = func_get_args(); foreach ($args as $k => $v) { echo “arg”.($k+1).”: $v\n”; } } foo(); /* 什么也不会输出 */ foo(‘hello’); /* 输出 arg1: hello */ foo(‘hello’, ‘world’, ‘again’); /* 输出 arg1: hello arg2: world arg3: again */
2. glob() を使用してファイルを検索します
ほとんどの PHP 関数の関数名は文字通りその目的を理解できますが、glob() を見ると、実際、glob() は、scandir() と同様に、ファイルの検索に使用できます:
// 取得所有的后缀为PHP的文件 $files = glob(‘*.php’); print_r($files); /* 输出: Array ( [0] => phptest.php [1] => pi.php [2] => post_output.php [3] => test.php ) */
複数のサフィックスを検索することもできます:
// 取PHP文件和TXT文件 $files = glob(‘*.{php,txt}’, GLOB_BRACE); print_r($files); /* 输出: Array ( [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 ) */
$files = glob(‘../images/a*.jpg’); // applies the function to each array element $files = array_map(‘realpath’,$files); print_r($files); /* output looks like: Array ( [0] => C:\wamp\www\images\apple.jpg [1] => C:\wamp\www\images\art.jpg ) */
3. メモリ使用量情報を取得する
PHP のメモリ リサイクル メカニズムはすでに非常に強力です。 PHP スクリプトを使用して現在のメモリ使用量を取得したり、memory_get_usage() 関数を呼び出して現在のメモリ使用量を取得したり、memory_get_peak_usage() 関数を呼び出してピークのメモリ使用量を取得したりすることもできます。参考コードは以下の通りです:
echo “Initial: “.memory_get_usage().” bytes \n”; /* 输出 Initial: 361400 bytes */ // 使用内存 for ($i = 0; $i < 100000; $i++) { $array []= md5($i); } // 删除一半的内存 for ($i = 0; $i < 100000; $i++) { unset($array[$i]); } echo “Final: “.memory_get_usage().” bytes \n”; /* prints Final: 885912 bytes */ echo “Peak: “.memory_get_peak_usage().” bytes \n”; /* 输出峰值 Peak: 13687072 bytes */
4. CPU使用量情報を取得します
メモリ使用量を取得した後、PHPのgetrusage()を使用してCPU使用量を取得することもできます。この方法はWindowsでは使用できません。
print_r(getrusage()); /* 输出 Array ( [ru_oublock] => 0 [ru_inblock] => 0 [ru_msgsnd] => 2 [ru_msgrcv] => 3 [ru_maxrss] => 12692 [ru_ixrss] => 764 [ru_idrss] => 3864 [ru_minflt] => 94 [ru_majflt] => 0 [ru_nsignals] => 1 [ru_nvcsw] => 67 [ru_nivcsw] => 4 [ru_nswap] => 0 [ru_utime.tv_usec] => 0 [ru_utime.tv_sec] => 0 [ru_stime.tv_usec] => 6269 [ru_stime.tv_sec] => 0 ) */
CPU についてよく知らない限り、この構造は非常にわかりにくいように思えます。いくつか説明します:
// sleep for 3 seconds (non-busy) sleep(3); $data = getrusage(); echo “User time: “. ($data['ru_utime.tv_sec'] + $data['ru_utime.tv_usec'] / 1000000); echo “System time: “. ($data['ru_stime.tv_sec'] + $data['ru_stime.tv_usec'] / 1000000); /* 输出 User time: 0.011552 System time: 0 */
sleep はシステム時間を消費しません。次の例を見てみましょう:
// loop 10 million times (busy) for($i=0;$i<10000000;$i++) { } $data = getrusage(); echo “User time: “. ($data['ru_utime.tv_sec'] + $data['ru_utime.tv_usec'] / 1000000); echo “System time: “. ($data['ru_stime.tv_sec'] + $data['ru_stime.tv_usec'] / 1000000); /* 输出 User time: 1.424592 System time: 0.004204 */
これには、システム コールがないため、ほぼすべてがユーザー時間であり、約 14 秒の CPU 時間がかかりました。
システム時間は、CPU がシステムコールでカーネル命令の実行に費やす時間です。以下に例を示します。
$start = microtime(true); // keep calling microtime for about 3 seconds while(microtime(true) – $start < 3) { } $data = getrusage(); echo “User time: “. ($data['ru_utime.tv_sec'] + $data['ru_utime.tv_usec'] / 1000000); echo “System time: “. ($data['ru_stime.tv_sec'] + $data['ru_stime.tv_usec'] / 1000000); /* prints User time: 1.088171 System time: 1.675315 */
上記の例では、より多くの CPU が消費されていることがわかります。
5. システム定数の取得
PHP は、現在の行番号 (__LINE__)、ファイル (__FILE__)、ディレクトリ (__DIR__)、関数名 (__FUNCTION__)、クラス名 (__CLASS__) を取得できる非常に便利なシステム定数を提供します。メソッド名 (__METHOD__) と名前空間 (__NAMESPACE__) は C 言語に非常に似ています。
これらは主にデバッグに使用されると考えられますが、必ずしもそうではありません。たとえば、他のファイルをインクルードする場合は、?__FILE__ を使用できます (もちろん、PHP 5.3 以降では __DIR__ を使用することもできます)。
// this is relative to the loaded script’s path // it may cause problems when running scripts from different directories require_once(‘config/database.php’); // this is always relative to this file’s path // no matter where it was included from require_once(dirname(__FILE__) . ‘/config/database.php’);
以下は、プログラムのデバッグに役立つデバッグ情報を出力するために __LINE__ を使用しています:
// some code // … my_debug(“some debug message”, __LINE__); /* 输出 Line 4: some debug message */ // some more code // … my_debug(“another debug message”, __LINE__); /* 输出 Line 11: another debug message */ function my_debug($msg, $line) { echo “Line $line: $msg\n”; }
6. 一意の ID を生成する
多くの友人は md5() を使って一意の番号を生成しますが、md5( ) はいくつかの欠点があります: 1. 乱れているため、データベースのソートパフォーマンスの低下につながります。 2. 長すぎるため、より多くの保管スペースが必要になります。実際、PHP には一意の ID を生成する関数が付属しています。この関数は uniqid() です。使用方法は次のとおりです:
// generate unique string echo uniqid(); /* 输出 4bd67c947233e */ // generate another unique string echo uniqid(); /* 输出 4bd67c9472340 */
このアルゴリズムは CPU タイムスタンプに基づいて生成されるため、同様の期間では ID の最初の数桁が同じになり、ID の並べ替えも容易になります。重複を避けるため、ID の前にプレフィックスを追加できます (例:
// 前缀 echo uniqid(‘foo_’); /* 输出 foo_4bd67d6cd8b8f */ // 有更多的熵 echo uniqid(”,true); /* 输出 4bd67d6cd8b926.12135106 */ // 都有 echo uniqid(‘bar_’,true); /* 输出 bar_4bd67da367b650.43684647 */
7、シリアル化
)PHP序列化功能大家可能用的比较多,也比较常见,当你需要把数据存到数据库或者文件中是,你可以利用PHP中的serialize() 和 unserialize()方法来实现序列化和反序列化,代码如下:
// 一个复杂的数组 $myvar = array( ‘hello’, 42, array(1,’two’), ‘apple’ ); // 序列化 $string = serialize($myvar); echo $string; /* 输出 a:4:{i:0;s:5:”hello”;i:1;i:42;i:2;a:2:{i:0;i:1;i:1;s:3:”two”;}i:3;s:5:”apple”;} */ // 反序例化 $newvar = unserialize($string); print_r($newvar); /* 输出 Array ( [0] => hello [1] => 42 [2] => Array ( [0] => 1 [1] => two ) [3] => apple ) */
如何序列化成json格式呢,放心,php也已经为你做好了,使用php 5.2以上版本的用户可以使用json_encode() 和 json_decode() 函数来实现json格式的序列化,代码如下:
// a complex array $myvar = array( ‘hello’, 42, array(1,’two’), ‘apple’ ); // convert to a string $string = json_encode($myvar); echo $string; /* prints ["hello",42,[1,"two"],”apple”] */ // you can reproduce the original variable $newvar = json_decode($string); print_r($newvar); /* prints Array ( [0] => hello [1] => 42 [2] => Array ( [0] => 1 [1] => two ) [3] => apple ) */
8、字符串压缩
当我们说到压缩,我们可能会想到文件压缩,其实,字符串也是可以压缩的。PHP提供了 gzcompress() 和gzuncompress() 函数:
$string = “Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc ut elit id mi ultricies adipiscing. Nulla facilisi. Praesent pulvinar, 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. Etiam ac massa sed turpis tempor luctus. Curabitur sed nibh eu elit mollis congue. Praesent ipsum diam, consectetur vitae ornare a, aliquam a nunc. In id magna pellentesque tellus posuere adipiscing. Sed non mi metus, at lacinia augue. Sed magna nisi, ornare in mollis in, mollis sed nunc. Etiam at justo in leo congue mollis. Nullam in neque eget metus hendrerit scelerisque eu non enim. Ut malesuada lacus eu nulla bibendum id euismod urna sodales. “; $compressed = gzcompress($string); echo “Original size: “. strlen($string).”\n”; /* 输出原始大小 Original size: 800 */ echo “Compressed size: “. strlen($compressed).”\n”; /* 输出压缩后的大小 Compressed size: 418 */ // 解压缩 $original = gzuncompress($compressed);
几乎有50% 压缩比率。同时,你还可以使用 gzencode() 和 gzdecode() 函数来压缩,只不用其用了不同的压缩算法。
以上就是8个开发必备的PHP功能,是不是都很实用呢?
以上がPHP開発に必須の8つの機能の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。