Блог


Библиотека полезных функций

Да, сейчас напридумывали кучу фреймворков, которые только носки наверное не умеют стирать. Однако кроме носков они оказывается еще много чего не умеют. Да и далеко не все пользуются фреймворками. А штатных средств 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)))
    {
       .
       .

 

 

Продолжение следует

Теги: PHP

Комментарии (12)

Ленар
27-03-2013
а еще вместо этого htmlChars(mysqli_fetch_accoc($res)) я, например, пользую вот такую функцию
function mysqlFetchAssoc($data)
{
    return htmlChars(mysqli_fetch_accoc($data));
}
так же удобней while($row = mysqlFetchAssoc($res))
Ленар
27-03-2013
такжев дополнение  часто бывает нужно вывести свой формат даты.
вот так вполне удобно
function formatMyDate($format, $str)
    {
        $str = strtotime($str);
        $date = date($format, $str);
        
        return $date;
    }
Ленар
27-03-2013
ДА и много чего можно добавить))
например, обертки для выборки одного или множества значений из базы
twin
27-03-2013
Я по категориям хочу разложить. Даты отдельно будут. И массивы. И много чего еще накопилось
pamparam
27-03-2013
не перестаю удивлятся простоте
arlamar
28-03-2013
function reDirect($path, $prefix = 'http://')
    {    
        header('Location:'. $prefix. $path);
        exit();
    }
Почему только http://?
Я например часто кидаю на "/cart", зачем собирать весь путь?
reDirect('cart', '/');
reDirect('ya.ru');
Может я чего-то не знаю и так делать нельзя?
twin
28-03-2013
По стандрту RFC нельзя. Но по идее можно
Ну не пиши туда http да и всех делов.
Alex
02-04-2013
Подскажите зачем такая конструкция:

return (isset($_POST[$val]) && $_POST[$val] !== '')


если можно одним empty

return !empty($_POST[$val]) ? $_POST[$val] ....

Спрашиваю для себя, потому-что постоянно вижу по разному. Как вообще правильно?
twin
02-04-2013
А попробуйте в своей конструкции передать на сервер 0 (ноль) и поймете разницу.
pamparam
02-04-2013
ноль не передашь таким способом return !empty($_POST[$val]) ? $_POST[$val] ....

но в предыдущих уроках Вы учили именно так. в чем повох или в том случае нам ноль не интересен и мы ожидаем другие значения?
twin
02-04-2013
Там в уроках где то есть оговорка, что таким образом можно инициализировть те данные, где мы не ожидаем нуля. Допустим логин. А вообще в нашем движке другая инициализация, интереснее.
pamparam
02-04-2013
я так и понял что это для разных случаев...
я и не сомневался что у Вас совсем другая инициализация ))))

 
Наверх