Да, сейчас напридумывали кучу фреймворков, которые только носки наверное не умеют стирать. Однако кроме носков они оказывается еще много чего не умеют. Да и далеко не все пользуются фреймворками. А штатных средств PHP зачастую не хватает или они не полностью удовлетворяют потребностям. Допустим функция htmlspecialchars() не умеет обрабатывать массивы. А иногда так хотелось бы. Или в PHP нет штатной функции, которая очищала бы массив от пустых значений. Приходится каждый раз городить огороды.
Но это дело поправимое. Нужно просто наделать таких полезных функций и собрать их в одну библиотеку. Расширить возможности PHP. Этим мы сейчас и займемся.
Начнем с функций для работы с клиентской стороной. Ну всё, что так или иначе связано с браузером.
Первое, самое простое. Инициализация переменных. Чаще всего встречается такая форма инициализации:
1
2
3
|
$value = (isset($_POST['value']) && $_POST['value'] !== '')
? $_POST['value'] : null;
|
Ужасная веревка, даже в листинг не помещается. Хотелось бы гораздо проще, однако есть подвох. Мы не можем поместить этот код в функцию, ибо рискуем получить нотис, когда будем передавать аргумент. Обидно. Но выход есть, и он прост. POST, это суперглобальный массив. А значит доступен везде. Так что нам не обязательно передавать в функцию именно его, достаточно передать имя аргумента, ключ. И тогда получится очень коротко и красиво:
1
2
3
4
5
6
7
8
9
10
|
function iniPOST($val) { return (isset($_POST[$val]) && $_POST[$val] !== '') ? $_POST[$val] : null; }
// Тепрь все проще и короче $name = iniPOST('name');
|
По аналогии можно сделать и GET и SESSION и COOKIE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
<?php
// Инициализация GET function iniGET($val) { return (isset($_GET[$val]) && $_GET[$val] !== '') ? $_GET[$val] : null; } // Инициализация COOKIE function iniCOOKIE($val) { return (isset($_COOKIE[$val]) && $_COOKIE[$val] !== '') ? $_COOKIE[$val] : null; } // Инициализация SESSION function iniSESSION($val) { return (isset($_SESSION[$val]) && $_SESSION[$val] !== '') ? $_SESSION[$val] : null; }
|
По примерно такому же принципу можно запомнить переменную, передаваемую в POST. Это бывает полезно при сортировках или при постраничном выводе результата. Ведь при переходе по ссылкам листалки POST-данные теряются, а не хотелось бы. Вот мы так решим эту проблему. Теперь можно смело обновлять страницу. переходить по другим, везде можно получить запомненное значение, вызвав нашу функцию с именем переменной в аргументе:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
<?php
// Удалить define('IRB_DELETE', 1); // Очистить define('IRB_CLEAR', 2); //////////////////////////////////////// // Функция работает только при открытой сессии session_start(); // Запоминаем переменную // или получаем значение, если она запомнена $name = varSave('name'); if(!empty($_POST)) { if($_POST['delete']) { // Стереть переменную varSave('name', IRB_DELETE); // Или можно очистить весь буфер varSave('', IRB_CLEAR); } header('location: '. $_SERVER['PHP_SELF']); exit(); } echo $name; ?> <form action="" method="post"> <input name="name" type="text" value="" /> <input name="ok" type="submit" value="Запомнить" /> <input name="ok" type="submit" value="Очистить" /> </form>
<?php /////////////////////////////////////////////////// // Функция function varSave($var, $clear = 0) { if($clear == 2) { unset($_SESSION['save']); return NULL; } if(!isset($_SESSION['save'][$var])) $_SESSION['save'][$var] = NULL; if($clear == 1) unset($_SESSION['save'][$var]); elseif(!empty($_POST)) $_SESSION['save'][$var] = $_POST[$var]; return $_SESSION['save'][$var]; }
|
Вот тут еще один интересный момент. Для того, чтобы стереть переменную из памяти, мы должны передать вторым аргументом единицу. Но удобнее это делать константами, а не цифрами. Константа имеет имя, её проще запомнить. И главное, не нужно искать функцию, что бы понять, какой передать аргумент. Это фактически документация на библиотеку. Поместить их нужно вверху файла и снабдить комментариями. Ну в полном листинге увидите
Здесь мы видим редирект, если хорошенько приглядеться. Грамотно редирект делается двумя строчками - отправка заголовка и остановка скрипта. В целях экономии ресурса. Но задалбывет каждый раз писать это все при каждом редиректе. А раз задалбывает, прямая дорога в функцию. Скажу сразу, в наших уроках она намного серьёзнее и интереснее, но она там привязана к другой функции, которая генерирует ссылки. Так что тут представим усеченный вариант.
1
2
3
4
5
6
7
8
|
function reDirect($patch) { header('location: http://'. $patch); exit(); }
|
Как пользоваться, думаю показывать не стоит? Где нужен редирект, вызываем функцию, передавая в аргумент путь редиректа без http://. Для краткости.
Теперь, как и обещалось - htmlspecialchars() с массивами. Такая функция есть в наших уроках, но не все их изучают (а зря
). Так что добавим сюда.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
function htmlChars($data) { if(is_array($data)) $data = array_map("htmlChars", $data); else $data = htmlspecialchars($data); return $data; }
|
Эта функция обработает и строку, и все элементы массивов любой вложенности, кои мы удосужимся передавать в неё аргументом. Да и пишется она короче, что не может не радовать. Ведь гораздо проще написать так, чем обрабатывать все переменные по очереди:
1
2
3
4
5
6
7
8
|
while($row = htmlChars(mysqli_fetch_accoc($res))) { . .
|
Продолжение следует
Роман