В php появилось достаточно много полезных функций, которые могут пригодиться Вам для быстрых разработок. Некоторые функции касаются поиска файлов, другие использования констант, но в целом все они очень удобны и часто используются мною в моих разработках.
Иногда веб-разработчик сталкивается с ситуацией, когда одна из функций может получить заранее неопределённое количество аргументов, как быть в этом случае с определением каждого из них? Для этого предназначена функция func_get_args().
| 1. | // функция с двумя необязательными аргументами |
| 2. | function foo($arg1 = '', $arg2 = '') { |
| 3. | echo "arg1: $arg1\n"; |
| 4. | echo "arg2: $arg2\n"; |
| 5. | } |
| 6. | foo('hello','world'); |
| 7. | /* результат: |
| 8. | arg1: hello |
| 9. | arg2: world |
| 10. | */ |
| 11. | foo(); |
| 12. | /* результат: |
| 13. | arg1: |
| 14. | arg2: |
| 15. | */ |
| 16. | |
| 17. | |
| 18. |
Попробуйте добавить третий аргумент или четвёртый, но доступа к нему получить не удастся. Чтобы получить значения аргументов, если заранее не известно их количество нужно использовать функцию func_get_args():
| 1. | // создаём функцию без указания аргументов |
| 2. | function foo() { |
| 3. | |
| 4. | // returns an array of all passed arguments |
| 5. | $args = func_get_args(); |
| 6. | |
| 7. | foreach ($args as $k => $v) { |
| 8. | echo "arg".($k+1).": $v\n"; |
| 9. | } |
| 10. | |
| 11. | } |
| 12. | |
| 13. | foo(); |
| 14. | /* результат отсутствует */ |
| 15. | |
| 16. | foo('hello'); |
| 17. | /* результат |
| 18. | arg1: hello |
| 19. | */ |
| 20. | |
| 21. | foo('hello', 'world', 'again'); |
| 22. | /* результат |
| 23. | arg1: hello |
| 24. | arg2: world |
| 25. | arg3: again |
| 26. | */ |
| 27. |
Чтобы получить все файлы по шаблону можно использовать функцию glob(),которая, по сравнению с scandir() позволяет использовать шаблоны регулярных выражений для поиска файлов.
| 1. | // ищем все php файлы |
| 2. | $files = glob('*.php'); |
| 3. | |
| 4. | print_r($files); |
| 5. | /* результат: |
| 6. | Array |
| 7. | ( |
| 8. | [0] => phptest.php |
| 9. | [1] => pi.php |
| 10. | [2] => post_output.php |
| 11. | [3] => test.php |
| 12. | ) |
| 13. | */ |
| 14. |
Для того чтобы получить несколько разных типов файлов можно использовать следующий вариант, указав в шаблоне через запятую их расширение:
| 1. | // все phз файлы и txt |
| 2. | $files = glob('*.{php,txt}', GLOB_BRACE); |
| 3. | |
| 4. | print_r($files); |
| 5. | /* результат: |
| 6. | Array |
| 7. | ( |
| 8. | [0] => phptest.php |
| 9. | [1] => pi.php |
| 10. | [2] => post_output.php |
| 11. | [3] => test.php |
| 12. | [4] => log.txt |
| 13. | [5] => test.txt |
| 14. | ) |
| 15. | */ |
| 16. | |
| 17. | |
| 18. |
Для поиска файлов в определенной директории указывайте путь к ней:
| 1. | $files = glob('../images/a*.jpg'); |
| 2. | |
| 3. | print_r($files); |
| 4. | /* результат: |
| 5. | Array |
| 6. | ( |
| 7. | [0] => ../images/apple.jpg |
| 8. | [1] => ../images/art.jpg |
| 9. | ) |
| 10. | */ |
| 11. |
Для получения полного пути к файлу используйте функцию realpath():
| 1. | $files = glob('../images/a*.jpg'); |
| 2. | |
| 3. | // применяем фукнцию для каждого массива |
| 4. | $files = array_map('realpath',$files); |
| 5. | |
| 6. | print_r($files); |
| 7. | /* результат: |
| 8. | Array |
| 9. | ( |
| 10. | [0] => C:\wamp\www\images\apple.jpg |
| 11. | [1] => C:\wamp\www\images\art.jpg |
| 12. | ) |
| 13. | */ |
| 14. | |
| 15. |
Для поиска напряжённых мест в работе скрипта можно использовать функции memory_get_usage() и memory_get_peak_usage(), данные функции содержат служебную информацию о выделенной памяти для работы скрипта.
| 1. | echo "До выполнения: ".memory_get_usage()." bytes \n"; |
| 2. | /* результат |
| 3. | До выполнения: 361400 байтов |
| 4. | */ |
| 5. | |
| 6. | // выделяем память |
| 7. | for ($i = 0; $i < 100000; $i++) { |
| 8. | $array []= md5($i); |
| 9. | } |
| 10. | |
| 11. | // удаляем массив |
| 12. | for ($i = 0; $i < 100000; $i++) { |
| 13. | unset($array[$i]); |
| 14. | } |
| 15. | |
| 16. | echo "После выполнения: ".memory_get_usage()." байтов \n"; |
| 17. | /* результат |
| 18. | Использовано: 885912 байтов |
| 19. | */ |
| 20. | |
| 21. | echo "Наибольший пик нагрузки: ".memory_get_peak_usage()." байтов \n"; |
| 22. | /* prints |
| 23. | Пик: 13687072 байтов |
| 24. | */ |
| 25. |
В php самыми полезными из них являются следующие константы: константа содержащая номер текущей линии скрипта (__LINE__), константа содержащая абсолютный путь до файла(__FILE__), константа содержащая название директории (__DIR__), константа содержащая название функции (__FUNCTION__), константа содержащая название класса (__CLASS__), константа содержащая название метода (__METHOD__) и пространства имён (__NAMESPACE__).
О всех из них я не собираюсь рассказывать в этой статье, расскажу только о некоторых. Иногда скрипт может использоваться в разных местах, но путь заранее не известен, в этом случае если Вы не будете использовать константу __FILE__, то можете получить сообщение об ошибке.
| 1. | // вариант, который может вызвать ошибку |
| 2. | require_once('config/database.php'); |
| 3. | |
| 4. | /* более правильный вариант */ |
| 5. | require_once(dirname(__FILE__) . '/config/database.php'); |
Для отладки приложения можно использовать константу __LINE__ :
| 1. | // ... |
| 2. | my_debug("сообщение об ошибке", __LINE__); |
| 3. | /* результат |
| 4. | Строка 4: сообщение об ошибке |
| 5. | */ |
| 6. | |
| 7. | |
| 8. | // ... |
| 9. | my_debug("другое сообщение об ошибке", __LINE__); |
| 10. | /* результат |
| 11. | Строка 11: другое сообщение об ошибке |
| 12. | */ |
| 13. | |
| 14. | function my_debug($msg, $line) { |
| 15. | echo "Строка $line: $msg\n"; |
| 16. | } |
| 17. |
Многие начинающие разработчики для генерации случайного идентификатора "изобретают велосипед", хотя для этого существует специальная функция uniqid()
| 1. | // уникальная строка |
| 2. | echo uniqid(); |
| 3. | /* результат |
| 4. | 4bd67c947233e |
| 5. | */ |
| 6. | |
| 7. | // другая уникальная строка |
| 8. | echo uniqid(); |
| 9. | /* результат |
| 10. | 4bd67c9472340 |
| 11. | */ |
| 12. | |
| 13. |
Функция uniqid() принимает несколько параметров, среди которых может быть префикс, предназначен он для снижения вероятности совпадения двух строк, генерируемых данной функцией.
| 1. | // префикс |
| 2. | echo uniqid('foo_'); |
| 3. | /* итог |
| 4. | foo_4bd67d6cd8b8f |
| 5. | */ |
| 6. | |
| 7. | echo uniqid('',true); |
| 8. | /* итог |
| 9. | 4bd67d6cd8b926.12135106 |
| 10. | */ |
| 11. | |
| 12. | |
| 13. | echo uniqid('bar_',true); |
| 14. | /* итог |
| 15. | bar_4bd67da367b650.43684647 |
| 16. | */ |
| 17. |
Функция serialize() пригодится Вам для тех случаев, когда нужно сохранить объект или массив в строку для дальнейшего помещения её в базу или в файл, а функция unserialize() для обратного преобразования из строки в массив или объект.
| 1. | // многомерный массив |
| 2. | $myarr = array( |
| 3. | 'hello', |
| 4. | 42, |
| 5. | array(1,'two'), |
| 6. | 'apple' |
| 7. | ); |
| 8. | |
| 9. | // конвертируем его в строку |
| 10. | $string = serialize($myarr); |
| 11. | |
| 12. | echo $string; |
| 13. | /* итог |
| 14. | 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";} |
| 15. | */ |
| 16. | |
| 17. | //конвертируем обратно из строки в массив |
| 18. | $newarr = unserialize($string); |
| 19. | |
| 20. | print_r($newarr); |
| 21. | /* итог |
| 22. | Array |
| 23. | ( |
| 24. | [0] => hello |
| 25. | [1] => 42 |
| 26. | [2] => Array |
| 27. | ( |
| 28. | [0] => 1 |
| 29. | [1] => two |
| 30. | ) |
| 31. | |
| 32. | [3] => apple |
| 33. | ) |
| 34. | */ |
| 35. |
В последнее время стало популярно использовать формат JSON для передачи данных, в связи с чем в php 5.3 были добавлены функции json_encode() и json_decode():
| 1. | // массив |
| 2. | $myarr = array( |
| 3. | 'hello', |
| 4. | 42, |
| 5. | array(1,'two'), |
| 6. | 'apple' |
| 7. | ); |
| 8. | |
| 9. | // строка в формате json |
| 10. | $string = json_encode($myarr); |
| 11. | |
| 12. | echo $string; |
| 13. | /* итог |
| 14. | ["hello",42,[1,"two"],"apple"] |
| 15. | */ |
| 16. | |
| 17. | // преобразуем объект json в массив |
| 18. | $newarr = json_decode($string); |
| 19. | |
| 20. | print_r($newarr); |
| 21. | /* итог |
| 22. | Array |
| 23. | ( |
| 24. | [0] => hello |
| 25. | [1] => 42 |
| 26. | [2] => Array |
| 27. | ( |
| 28. | [0] => 1 |
| 29. | [1] => two |
| 30. | ) |
| 31. | |
| 32. | [3] => apple |
| 33. | ) |
| 34. | */ |
| 35. |
Сжать строку можно несколькими способами, но самый простой - использовать функции gzcompress() и gzuncompress()
| 1. | $string = |
| 2. | "Lorem ipsum dolor sit amet, consectetur |
| 3. | adipiscing elit. Nunc ut elit id mi ultricies |
| 4. | adipiscing. Nulla facilisi. Praesent pulvinar, |
| 5. | sapien vel feugiat vestibulum, nulla dui pretium orci, |
| 6. | non ultricies elit lacus quis ante. Lorem ipsum dolor |
| 7. | sit amet, consectetur adipiscing elit. Aliquam |
| 8. | pretium ullamcorper urna quis iaculis. Etiam ac massa |
| 9. | sed turpis tempor luctus. Curabitur sed nibh eu elit |
| 10. | mollis congue. Praesent ipsum diam, consectetur vitae |
| 11. | ornare a, aliquam a nunc. In id magna pellentesque |
| 12. | tellus posuere adipiscing. Sed non mi metus, at lacinia |
| 13. | augue. Sed magna nisi, ornare in mollis in, mollis |
| 14. | sed nunc. Etiam at justo in leo congue mollis. |
| 15. | Nullam in neque eget metus hendrerit scelerisque |
| 16. | eu non enim. Ut malesuada lacus eu nulla bibendum |
| 17. | id euismod urna sodales. "; |
| 18. | |
| 19. | $compressed = gzcompress($string); |
| 20. | |
| 21. | echo "Original size: ". strlen($string)."\n"; |
| 22. | /* итог |
| 23. | Исходный размер: 800 |
| 24. | */ |
| 25. | |
| 26. | echo "Compressed size: ". strlen($compressed)."\n"; |
| 27. | /* итог |
| 28. | Сжатый размер: 418 |
| 29. | */ |
| 30. | |
| 31. | // разжимаем |
| 32. | $original = gzuncompress($compressed); |
| 33. |
Дополнительный вариант с gzencode() для всей страницы пригодится для тех у кого не подключен на сервере mod_deflate.
| 1. | global $GZIP_COMPRESSION_ON; |
| 2. | // проверяем поддерживает ли сервер сжатие |
| 3. | $GZIP_COMPRESSION_ON = |
| 4. | (strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== false) and |
| 5. | (extension_loaded('zlib')); |
| 6. | // помещаем всё в буфер |
| 7. | ob_start(); |
| 8. | |
| 9. | /* $string = данные для сжатия */ |
| 10. | $string = |
| 11. | "Lorem ipsum dolor sit amet, consectetur |
| 12. | adipiscing elit. Nunc ut elit id mi ultricies |
| 13. | adipiscing. Nulla facilisi. Praesent pulvinar, |
| 14. | sapien vel feugiat vestibulum, nulla dui pretium orci, |
| 15. | non ultricies elit lacus quis ante. Lorem ipsum dolor |
| 16. | sit amet, consectetur adipiscing elit. Aliquam |
| 17. | pretium ullamcorper urna quis iaculis. Etiam ac massa |
| 18. | sed turpis tempor luctus. Curabitur sed nibh eu elit |
| 19. | mollis congue. Praesent ipsum diam, consectetur vitae |
| 20. | ornare a, aliquam a nunc. In id magna pellentesque |
| 21. | tellus posuere adipiscing. Sed non mi metus, at lacinia |
| 22. | augue. Sed magna nisi, ornare in mollis in, mollis |
| 23. | sed nunc. Etiam at justo in leo congue mollis. |
| 24. | Nullam in neque eget metus hendrerit scelerisque |
| 25. | eu non enim. Ut malesuada lacus eu nulla bibendum |
| 26. | id euismod urna sodales. "; |
| 27. | |
| 28. | echo $string; |
| 29. | |
| 30. | |
| 31. | ob_implicit_flush(0); |
| 32. | |
| 33. | global $GZIP_COMPRESSION_ON; |
| 34. | |
| 35. | $offset = 15 * 21600; |
| 36. | |
| 37. | $content = ob_get_clean(); |
| 38. | |
| 39. | // сжимаем буфер |
| 40. | if ($GZIP_COMPRESSION_ON) { |
| 41. | // кэшируем |
| 42. | header("Expires: " . gmdate("D, d M Y H:i:s", time() + $offset) . " GMT"); |
| 43. | // HTTP/1.1 |
| 44. | header("Cache-Control: public, max-age=3600"); |
| 45. | header('Content-Encoding: gzip'); |
| 46. | // степень сжатия |
| 47. | echo gzencode($content, 7); |
| 48. | |
| 49. | } |
| 50. | |
| 51. | else { |
| 52. | |
| 53. | echo $content; |
| 54. | |
| 55. | } |
| 56. |
Для того чтобы определить момент завершения функции и к тому же узнать скорость её выполнения, Вы можете использовать следующий вариант:
| 1. | // захватываем время до запуска |
| 2. | $start_time = microtime(true); |
| 3. | |
| 4. | // другая часть скрипта |
| 5. | // ... |
| 6. | |
| 7. | // выводим скорость работы |
| 8. | echo "execution took: ". |
| 9. | (microtime(true) - $start_time). |
| 10. | " seconds."; |
| 11. |
В действительности данный код может пригодиться, но представьте, что между началом и концом отслеживания вмешалась ошибка, тогда Вы не узнаете скорость работы скрипта. Для того чтобы узнать скорость работы даже если произошла ошибка необходимо использовать функцию register_shutdown_function()
| 1. | $start_time = microtime(true); |
| 2. | |
| 3. | register_shutdown_function('my_shutdown'); |
| 4. | |
| 5. | // ваш код |
| 6. | // ... |
| 7. | |
| 8. | function my_shutdown() { |
| 9. | global $start_time; |
| 10. | |
| 11. | echo "execution took: ". |
| 12. | (microtime(true) - $start_time). |
| 13. | " секунд."; |
| 14. | } |
| 15. |
Следующая функция часто используется мною для сохранения массива в базу данных.
| 1. | $check = unserialize($numbers['user']); |
| 2. | |
| 3. | // если у нас уже массив, просто добавляем в него дополнительный элемент |
| 4. | // иначе создаём новый массив |
| 5. | ((is_array($check)) ? array_push($check,$ip) : $check=array($ip)); |
| 6. | |
| 7. | //преобразуем массив в строку |
| 8. | $insert=serialize($check); |
| 9. |
Как мне кажется, данные функции действительно могут пригодиться разработчику и являются достаточно полезными. Если и Вы придерживаетесь того же мнения, пожалуйста расскажите о данной статье своим друзьям и коллегам. Спасибо за чтение!
1.1
Александр
Давно собирал...