Полезные 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.



Теги:

Читайте также:



 #  #  #  #  #  #  #  #  #  #

13 Ответов на “Полезные php трюки.”

  1. Илья Земсков
    Сентябрь 23rd, 2008

    Было интересно и, думаю, полезно узнать про “игнорирование пользователя”. Про такой момент защиты целостности данных приложения не знал раньше. Спасибо за просвещение! :)

  2. Konstantin
    Сентябрь 23rd, 2008

    Если в БД использовать транзакции, то целостность данных пострадать не должна ;)

  3. DYPA
    Сентябрь 23rd, 2008

    >Меняем массив через foreach.
    доступно в php5, некрофилы таким трюком не могут воспользоваться ;)
    >Передаем массивы в функции.
    только не стоит забывать что напрямую данные в запросы не стоит передавать. и проще только ORM ;)

  4. cryptus
    Сентябрь 24th, 2008

    2Илья Земсков: Я сам недавно узнал ;)

  5. cryptus
    Сентябрь 24th, 2008

    2Konstantin: Из встроенных механизмов защиты целостности данных MySQL слышал только про триггеры и внешние ключи. Для их реализации нужно использовать движок InnoDB (может еще какие-то поддреживают), который не все хостинги поддерживают. Насчет транзакций не знал раньше – интересная тема, спасибо за наводку :)

  6. cryptus
    Сентябрь 24th, 2008

    2DYPA: Не знал про ограничение на 5 версию пхп только, спасибо.

    Насчет фильтра ввода – это да, фильтровать можно либо внутри метода (тем самым скрыв реализацию от уровня абстракции выше), либо фильтровать данные перед передачей внутрь функции. А вот насчет ORM раньше не слышал, спасибо – покопаю эту тему :)

  7. zoonman
    Октябрь 2nd, 2008

    применение функции extract чревато неожиданными последствиями, особенно если вы автоматизируете процесссы вставки данных в таблицы с большим числом полей

  8. cryptus
    Октябрь 2nd, 2008

    2zoonman: Согласен, нужно все варианты продумать прежде чем ее использовать.

  9. Ал
    Декабрь 1st, 2008

    function Add($user) {
    $sql = ‘INSERT INTO `users` (`’.join(’`,`’,array_keys($user).’`) VALUES (”‘.join(’”,”‘,$user).’”)’;
    mysql_query($sql);
    }

  10. Ростислав
    Декабрь 15th, 2008

    Вообщем блог класный, но бывают такие моменты когда кажеться что читаеш букварик :) Слабовато однако ! )) Пока ничего нового не нашел, но надежда есть ! Удачи ! :)

  11. novice
    Декабрь 15th, 2008

    Ну здесь иногда бывают статьи и для новичков, поэтому Вам так кажется, Ростислав )

  12. Ростислав
    Декабрь 16th, 2008

    Да все верно )) Блог класный, добавил в закладки !

  13. alex
    Январь 16th, 2010

    А есть такие трюки …
    См. книгу “PHP ТРЮКИ” Джек Д. Харрингтон

Оставить комментарий


© 2008 - 2010 i-novice.net | Все права защищены.