Перейти к содержимому

Фото
- - - - -

php UNSET


  • Вы не можете создать новую тему
  • Please log in to reply
16 ответов в этой теме

#1 ruslan)

ruslan)
  • Постоялец
  • 1 795 сообщений

Отправлено 01 Февраль 2009 - 16:12

<?php
$p = 20;
if (unset($p))
{
echo "Переменная найдена и уничтожена";
}
else
{
echo "Переменная не найдена и не может быть уничтожена";
}
?>

Вот собственно код, он не работает, в 3 строке ошибка. Почему и как это дело реализовать?
Спрашиваю ради интереса.

Сообщение изменено: кoт (01 Февраль 2009 - 16:24 )

  • 0

#2 PyPL

PyPL
  • Пользователь
  • 54 сообщений

Отправлено 01 Февраль 2009 - 16:59

Вот что делает с людьми дин. типизация.

Функция unset - это VOID тип. Т.е пустой тип , он ничего не возвращает. И соответственно проверить её с помощью условия нельзя.

Можно переписать код так :
<?php
$p = 20;
unset($p);

if(empty($p))
{
	echo "Destroyed";
} else {
	echo "Nope";
}
?>

  • 0

#3 ruslan)

ruslan)
  • Постоялец
  • 1 795 сообщений

Отправлено 01 Февраль 2009 - 17:40

точно! ступил, спасибо
  • 0

#4 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 01 Февраль 2009 - 18:04

Вот что делает с людьми дин. типизация.

Функция unset - это VOID тип. Т.е пустой тип , он ничего не возвращает. И соответственно проверить её с помощью условия нельзя.

Можно переписать код так :

<?php
$p = 20;
unset($p);

if(empty($p))
{
	echo "Destroyed";
} else {
	echo "Nope";
}
?>

Проверка "if(empty($p))" не имеет смысла, т.к. после "unset($p);" всегда будет возвращать true :)

empty() вернёт true, если переменная существует и ей присвоено значение из этого списка:

The following things are considered to be empty: "" (an empty string)
0 (0 as an integer)
"0" (0 as a string)
NULL
FALSE
array() (an empty array)
var $var; (a variable declared, but without a value in a class)


так что надо использовать isset()

P.S. автору: прежде чем задать вопрос по какому-либо оператору языка - открой мануал, там всё написано.
  • 0

#5 PyPL

PyPL
  • Пользователь
  • 54 сообщений

Отправлено 01 Февраль 2009 - 19:29

Да точно isset() :) Ну я не PHP кодер , просто помню что есть empty.
  • 0

#6 Cryptoboy

Cryptoboy
  • Пользователь
  • 280 сообщений

Отправлено 01 Февраль 2009 - 20:47

Очень странно что строка "0" тоже считается empty ..
Я всегда считал пустой строкой только ту, у которой длина 0

... но это пхп, всего можно ожидать :)
  • 0

#7 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 01 Февраль 2009 - 21:18

Очень странно что строка "0" тоже считается empty ..
Я всегда считал пустой строкой только ту, у которой длина 0

... но это пхп, всего можно ожидать :)

Меня больше всего бесит этот 0 и пустая строка в PHP. И казалось бы обычное сравнение "==" может быть очень опасным. С типизацией в PHP туго и в последнее время меня это немножко начало напрягать, приходится тратить лишнее время на то, чтобы решить как может повести себя ПХП в том или ином случае ;)

Например, для сравнения строк я сейчас использую ф-цию strcasecmp, ибо "==" иногда такие фокусы выкидывает. Мозги ПХП уже давно мусолят эти приколы, как-то на хабре даже обсуждалось.

О! как раз по теме на хабре сегодня появился топик про удаление и обнуление переменных http://habrahabr.ru/blogs/php/50798/

P.S. когда я писал про то, что надо юзать isset(), совсем забыл, что если переменная === null, он вернёт false :) Такие вот приколы.

Если надо проверить, пустая СТРОКА или нет, всегда надо юзать if ( '' === $string ) - три знака "=" иначе можно попасть на 0 и получить true ;)
  • 0

#8 alx4ever

alx4ever
  • Пользователь
  • 169 сообщений
  • Откуда:Tallinn, Estonia

Отправлено 03 Февраль 2009 - 22:35

а я вот никогда не использую empty()
isset() и только его.. а ещё полезно:
if (strlen(trim($var))) {

}
вот..
  • 0

Аjaxel CMS, Фреймворк тоже.


#9 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 03 Февраль 2009 - 23:42

а я вот никогда не использую empty()
isset() и только его.. а ещё полезно:
if (strlen(trim($var))) {

}
вот..

Лучше
if ( '' === trim( $var ) ) {
}
нет лишнего вызова функции :)
  • 0

#10 noise_est

noise_est
  • Пользователь
  • 71 сообщений

Отправлено 04 Февраль 2009 - 12:00

Лучше

if ( '' === trim( $var ) ) {
}
нет лишнего вызова функции :)


ой как глаза режет такой порядок.

и рождается это из-за того, что нет стандарта форматирования.
у нас на работе с этим война.
  • 0
Da Brudderhud Of Zёba Zёba Eata

#11 Cryptoboy

Cryptoboy
  • Пользователь
  • 280 сообщений

Отправлено 04 Февраль 2009 - 12:11

Кстати, покажите ситауцию, когда надо сделать переменной unset?
  • 0

#12 PyPL

PyPL
  • Пользователь
  • 54 сообщений

Отправлено 04 Февраль 2009 - 12:35

Кстати, покажите ситауцию, когда надо сделать переменной unset?


Ну например насколько я знаю , многие ансетят зарегенные переменные в сессиях (т.е unset($_SESSION['VAR'])) , но так делают когда вроде register_globals отключен.
  • 0

#13 Cryptoboy

Cryptoboy
  • Пользователь
  • 280 сообщений

Отправлено 04 Февраль 2009 - 12:43

Ясно, но это фактически удаление элемента из хеш таблицы, а не удаление переменной

Меня интересовало, в каких ситуациях может понадобиться удалить переменную?

то есть

$a = 4343;

.........
.........
........

unset($a)
  • 0

#14 noise_est

noise_est
  • Пользователь
  • 71 сообщений

Отправлено 04 Февраль 2009 - 13:20

Ясно, но это фактически удаление элемента из хеш таблицы, а не удаление переменной

Меня интересовало, в каких ситуациях может понадобиться удалить переменную?

то есть

$a = 4343;

.........
.........
........

unset($a)


с написанием демона когда-нибудь сталкивался?
  • 0
Da Brudderhud Of Zёba Zёba Eata

#15 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 04 Февраль 2009 - 19:35

Кстати, покажите ситауцию, когда надо сделать переменной unset?

Например, если переменная является ссылкой (указателем) и используется в цикле.

ой как глаза режет такой порядок.

и рождается это из-за того, что нет стандарта форматирования.
у нас на работе с этим война.

Вообще-то эта конструкция имеет больше плюсов, чем "привычная", т.к. сразу видно с чем идёт сравнение и оберегает от ошибок присваивания (я правда, не могу припомнить ни одного случая, чтобы я случайно написал одно "=" при сравнении).

Стандарты есть, но т.к. их много - каждый использует что хочет. Мой стандарт так же был где-то описан. Меня например бесит фигурная скобка на строке с оператором, т.к. плохо видно структуру - это раз и отступы пробелами - это два, т.к. это часто вызывает ошибки с неверными отступами, что опять-таки портит структуру. Я в оформлении кода очень пунктуален и всегда чётко следую своим правилам.

Ну например насколько я знаю , многие ансетят зарегенные переменные в сессиях (т.е unset($_SESSION['VAR'])) , но так делают когда вроде register_globals отключен.

Это называется - удаление ключа массива. Сессии, и тем более register_globals тут ни каким боком не стоят :)

Интересно, как происходит эта операция - создаётся новый массив без одного ключа или нет? :)
  • 0

#16 Vladson

Vladson

    XTGamers.com

  • Постоялец
  • 1 921 сообщений
  • Откуда:Эстония, Таллинн

Отправлено 04 Февраль 2009 - 19:43

Лучше

if ( '' === trim( $var ) ) {
}

Намного лучше я бы сказал.
  • 0
Один Владсон может за...ать всех, кроме себя самого. Два Владсона могли бы за...ать абсолютно кого угодно, но Владсон единственный и неповторимый. ©Vladson

Вы либо способны перелопатить тонны информации и отсеять лишнее, либо программистом не будете. ©Psih

Не вазелин, а бизнес-гель ©Avagraen

#17 noise_est

noise_est
  • Пользователь
  • 71 сообщений

Отправлено 05 Февраль 2009 - 13:36

Например, если переменная является ссылкой (указателем) и используется в цикле.

Вообще-то эта конструкция имеет больше плюсов, чем "привычная", т.к. сразу видно с чем идёт сравнение и оберегает от ошибок присваивания (я правда, не могу припомнить ни одного случая, чтобы я случайно написал одно "=" при сравнении).

Стандарты есть, но т.к. их много - каждый использует что хочет. Мой стандарт так же был где-то описан. Меня например бесит фигурная скобка на строке с оператором, т.к. плохо видно структуру - это раз и отступы пробелами - это два, т.к. это часто вызывает ошибки с неверными отступами, что опять-таки портит структуру. Я в оформлении кода очень пунктуален и всегда чётко следую своим правилам.


всё очень спорно. фигурная скобка, tab вместо 4-х пробелов, название переменных и прочее.
мне, допустим, непривычно читать такое сравнение. нам ведь нужно сравнивать значение переменной с чем-либо, а не что-либо со значением переменной. сколько не встречал людей, все читают как: если переменная имеет значение...
не буду много спорить. я и так уже наспорился по поводу форматирования кода.
  • 0
Da Brudderhud Of Zёba Zёba Eata