PHP функции о которых Вы должны знать!

В php появилось достаточно много полезных функций, которые могут пригодиться Вам для быстрых разработок. Некоторые функции касаются поиска файлов, другие использования констант, но в целом все они очень удобны и часто используются мною в моих разработках.

Функция для работы с произвольным числом аргументов

Иногда веб-разработчик сталкивается с ситуацией, когда одна из функций может получить заранее неопределённое количество аргументов, как быть в этом случае с определением каждого из них? Для этого предназначена функция func_get_args().

 

  1. // функция с двумя необязательными аргументами

  2. function foo($arg1 = '', $arg2 = '') {

  3. echo "arg1: $arg1n";

  4. echo "arg2: $arg2n";

  5. }

  6. foo('hello','world');

  7. /* результат:

  8. arg1: hello

  9. arg2: world

10. */

11. foo();

12. /* результат:

13. arg1:

14. arg2:

15. */

Листинг 1.

 

Попробуйте добавить третий аргумент или четвёртый, но доступа к нему получить не удастся. Чтобы получить значения аргументов, если заранее не известно их количество нужно использовать функцию 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).": $vn";  

  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. */   

Листинг 2.

 

Используем функцию glob() для поиска файлов

Чтобы получить все файлы по шаблону можно использовать функцию 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.

Листинг 3.

 

Для того чтобы получить несколько разных типов файлов можно использовать следующий вариант, указав в шаблоне через запятую их расширение:

 

  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. */     

Листинг 4.

 

Для поиска файлов в определенной директории указывайте путь к ней:

 

  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. */      

Листинг 5.

 

Для получения полного пути к файлу используйте функцию 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:wampwwwimagesapple.jpg 

11.     [1] => C:wampwwwimagesart.jpg 

12.

13. */       

Листинг 6.

 

Оптимизируйте php

Для поиска напряжённых мест в работе скрипта можно использовать функции 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. */       

Листинг 7.

 

Магические константы

В 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');  

Листинг 8.

 

Для отладки приложения можно использовать константу __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: $msgn";  

16. }       

Листинг 9.

 

Генерация уникального идентификатора

Многие начинающие разработчики для генерации случайного идентификатора "изобретают велосипед", хотя для этого существует специальная функция uniqid()

 

КодЧистый код

  1. // уникальная строка  

  2. echo uniqid();  

  3. /* результат

  4. 4bd67c947233e 

  5. */  

  6.

  7. // другая уникальная строка  

  8. echo uniqid();  

  9. /* результат

10. 4bd67c9472340 

11. */ 

Листинг 10.

 

Функция 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. */       

Листинг 11.

 

Преобразование массива в строку

Функция 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. */                    

Листинг 12.

В последнее время стало популярно использовать формат 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. */                   

Листинг 13.

 

Сжатие строк

Сжать строку можно несколькими способами, но самый простой - использовать функции 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);             

Листинг 14.

 

Дополнительный вариант с 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. }           

Листинг 15.

 

Отслеживаем завершение функции

Для того чтобы определить момент завершения функции и к тому же узнать скорость её выполнения, Вы можете использовать следующий вариант:

 

  1. // захватываем время до запуска  

  2. $start_time = microtime(true);  

  3.

  4. // другая часть скрипта  

  5. // ...  

  6.

  7. // выводим скорость работы  

  8. echo "execution took: ".  

  9.        (microtime(true) - $start_time).  

10.        " seconds.";         

Листинг 16.

 

В действительности данный код может пригодиться, но представьте, что между началом и концом отслеживания вмешалась ошибка, тогда Вы не узнаете скорость работы скрипта. Для того чтобы узнать скорость работы даже если произошла ошибка необходимо использовать функцию 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. }         

Листинг 17.

 

Правильно работаем с массивом

Следующая функция часто используется мною для сохранения массива в базу данных.

 

  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);       

Листинг 18.

 

Заключение

Как мне кажется, данные функции действительно могут пригодиться разработчику и являются достаточно полезными. Если и Вы придерживаетесь того же мнения, пожалуйста расскажите о данной статье своим друзьям и коллегам. Спасибо за чтение!




Рекомендуем почитать

 

Добавить комментарий


Ваше имя:


Комментарий:


Введите: Картинка