Slyweb
На разработку сайта! Скидки 50%!

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

В 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.

        
Листинг 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).": $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.

        
Листинг 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. */
16.
17.
18.

        
Листинг 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. */
11.

        
Листинг 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:\wamp\www\images\apple.jpg
11. [1] => C:\wamp\www\images\art.jpg
12. )
13. */
14.
15.

        
Листинг 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. */
25.

        
Листинг 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: $msg\n";
16.}
17.

        
Листинг 9.

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

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

  • Код
  • Чистый код
  1.// уникальная строка
  2.echo uniqid();
  3./* результат
  4.4bd67c947233e
  5.*/
  6.
  7.// другая уникальная строка
  8.echo uniqid();
  9./* результат
10.4bd67c9472340
11.*/
12.
13.

        
Листинг 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.*/
17.

        
Листинг 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. */
35.

        
Листинг 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.*/
35.

        
Листинг 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);
33.

        
Листинг 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. }
56.

        
Листинг 15.

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

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

  • Код
  • Чистый код
  1.// захватываем время до запуска
  2.$start_time = microtime(true);
  3.
  4.// другая часть скрипта
  5.// ...
  6.
  7.// выводим скорость работы
  8.echo "execution took: ".
  9. (microtime(true) - $start_time).
10. " seconds.";
11.

        
Листинг 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.}
15.

        
Листинг 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);
  9.

        
Листинг 18.

Заключение

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


Александр Ермаков