Полезные php трюки.
Несмотря на свою легкость и универсальность, 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.
Сентябрь 23rd, 2008
Было интересно и, думаю, полезно узнать про “игнорирование пользователя”. Про такой момент защиты целостности данных приложения не знал раньше. Спасибо за просвещение!
Сентябрь 23rd, 2008
Если в БД использовать транзакции, то целостность данных пострадать не должна
Сентябрь 23rd, 2008
>Меняем массив через foreach.
доступно в php5, некрофилы таким трюком не могут воспользоваться
>Передаем массивы в функции.
только не стоит забывать что напрямую данные в запросы не стоит передавать. и проще только ORM
Сентябрь 24th, 2008
2Илья Земсков: Я сам недавно узнал
Сентябрь 24th, 2008
2Konstantin: Из встроенных механизмов защиты целостности данных MySQL слышал только про триггеры и внешние ключи. Для их реализации нужно использовать движок InnoDB (может еще какие-то поддреживают), который не все хостинги поддерживают. Насчет транзакций не знал раньше – интересная тема, спасибо за наводку
Сентябрь 24th, 2008
2DYPA: Не знал про ограничение на 5 версию пхп только, спасибо.
Насчет фильтра ввода – это да, фильтровать можно либо внутри метода (тем самым скрыв реализацию от уровня абстракции выше), либо фильтровать данные перед передачей внутрь функции. А вот насчет ORM раньше не слышал, спасибо – покопаю эту тему
Октябрь 2nd, 2008
применение функции extract чревато неожиданными последствиями, особенно если вы автоматизируете процесссы вставки данных в таблицы с большим числом полей
Октябрь 2nd, 2008
2zoonman: Согласен, нужно все варианты продумать прежде чем ее использовать.
Декабрь 1st, 2008
function Add($user) {
$sql = ‘INSERT INTO `users` (`’.join(’`,`’,array_keys($user).’`) VALUES (”‘.join(’”,”‘,$user).’”)’;
mysql_query($sql);
}
Декабрь 15th, 2008
Вообщем блог класный, но бывают такие моменты когда кажеться что читаеш букварик
Слабовато однако ! )) Пока ничего нового не нашел, но надежда есть ! Удачи !
Декабрь 15th, 2008
Ну здесь иногда бывают статьи и для новичков, поэтому Вам так кажется, Ростислав )
Декабрь 16th, 2008
Да все верно )) Блог класный, добавил в закладки !
Январь 16th, 2010
А есть такие трюки …
См. книгу “PHP ТРЮКИ” Джек Д. Харрингтон