Несмотря на свою легкость и универсальность, php является очень функциональным языком. Он не такой гибкий, как C конечно, но и у него есть свои хитрости. Я еще не матерый профессионал в области программирования на php, но уже успел нахвататься несколько php трюков и хитростей при работе на php.
В этом посте я составил небольшую подборку, которая будет полезна как новичкам, так и некоторым профессионалам.
Меняем массив через foreach.
Почти в любом php-скрипте используются массивы, а следовательно, и циклы. Самым популярным является цикл foreach. При обработке массивов этим циклом, очень часто приходится их изменять, но как, вы уже успели заметить, если сделать так:
foreach ($categories as $cat) {
$cat['name'] = 'some cat';
}
То ни один элемент массива $categories не пострадает
Другими словами, поле name у каждого элемента останется прежним, а не изменится на “some cat”.Это происходит из-за того, что цикл foreach работает не с самим массивом, а его копией. Почти все знают, что это можно исправить так:
foreach ($categories as $k=>$cat) {
$categories[$k]['name'] = 'some cat';
}
Но, есть и еще один вариант. Мне этот вариант больше нравится, он более наглядный и с ним проще работать, когда есть вложенные циклы:
foreach ($categories as &$cat) {
$cat['name'] = 'some cat';
}
unset($cat);
Отличие этого способа в том, что здесь в каждой итерации создается ссылка-переменная $cat для текущего элемента массива. А для того, чтобы в дальнейшем она не занимала память – она удаляется через unset().
Передаем массивы в функции.
Вторая частая ситуация – это когда в функцию надо передать много параметров, но этого сделать нельзя из гуманных и эстетических соображений
В таких случаях их передают в виде массива.Например, нам надо передать информацию о пользователе в метод какого-то класса:
$user = array(
'name' => $name,
'surname' => $surname,
'age' => $age,
'country' => $country,
'city' => $city,
'zipcode' => $zipcode,
'login' => $login
);
Users::Add($user);
Полей может быть еще больше. Допустим, что этот метод добавляет пользователя в БД.
function Add($user) {
$sql = 'INSERT INTO users (name, surname, age, …) VALUES (‘.$user[‘name’].’, ‘.$user[‘surname’].’…)';
mysql_query($sql);
}
Довольно сложно будет потом прочитать этот запрос, не правда ли? Но есть один способ его сократить, точнее функция:
function Add($user) {
extract($user);
$sql = ‘INSERT INTO users (name, surname, age, …) VALUES (‘.$name.’, ‘.$surname.’…)’;
mysql_query($sql);
}
Функция extract преобразовывает массив в переменные. Кстати говоря, такой php трюкприменяется в исходниках wordpress.
Использование переменных переменных.
Да, это не опечатка.
В php есть такая интересная возможность.
$var_name = 'my_var';
$$var_name = 'hello';
echo $my_var; // выведет ‘hello’
Другой способ:
исходниккопировать в буферпечать?
${'my_var'} = 'hello';
echo $my_var; // выведет 'hello';
Более того, можно и функции так использовать:
function show_msg($msg) {
echo $msg;
}
$func = ‘show_msg’;
$func(‘Hello’); // выведет ‘Hello’.
Но это скорее малоизвестная возможность, чем хитрость. А хитростью можно назвать использование недопустимых имен переменных в php, с помощью этой конструкции:
${1} = ‘Hello’;
echo ${1}; // выведет ‘Hello’
В этом коде используется переменная с именем 1, что недопустимо по правилам php
Игнорируем браузер пользователя.
Я сам редко сталкивался с такой ситуацией, но для больших проектов это наверняка часто встречающаяся проблема. Предположим, что скрипт выполняет какие-то запросы в базе данных (удление/добавления/редактирование) и во время этого пользователь нажимает кнопку Stop в браузере. По этой команде php скрипт завершает свою работу, что, в нашем случае может оказаться чреватым нарушением целостности базы данных.
Эта проблема решается функцией ignore_user_abort():
ignore_user_abort(true);
… выполяем запросы к БД…
ignore_user_abort(false);
Пока что все. Удачи и до встречи.
cryptus.