Jump to content
  • 0

Работа с переменными в PHP


Veseloff
 Share

Question

В этом топике я приведу примеры и разъяснения по правильному использованию «!», «isset» и «empty» в PHP.

Так уж сложилось, что PHP — язык с отсутствием строгой типизации, в результате чего можно использовать функции и операторы не совсем по назначению и они всё равно будут давать какой-то результат. Разберём что из себя представляют такие вещи как «!», «isset» и «empty».

1. Про «!». Знаку «!» можно дать вольный перевод на русский язык как «не». То есть «!правда» будет «неправда», то есть «ложь», а «!ложь» будет «не ложь», то есть «правда». Данный оператор можно применять только к существующим переменным. Приведу несколько примеров:

var_dump(!true);
var_dump(!false);

Выведут нам

bool(false)

bool(true)

Всё логично. «!true» значит «неправда», то есть «false». Ну и «!false» значит «не ложь», то есть правда. Следующий пример:

$var=true;
var_dump($var);
var_dump(!$var);

результат будет таким:

bool(true)

bool(false)

Ну, в общем, тоже всё понятно. Выставляем значение переменной «var» в «true». Ну и, соответственно, «не var» будет «false». Как выяснилось, при помощи «!» некоторые люди проверяют существование переменной и вообще Бог знает что. Это неправильно, так делать нельзя, хотя, раз уж PHP такой PHP, то резутьтат от операции «!» над несуществующей переменной тоже будет, но мы увидим ноутис (если они включены, а при разработке их надо включать обязательно). Итак такой код:

var_dump($var);
var_dump(!$var);

выдаст нам примерно такой результат:

Notice: Undefined variable: var in /webs/test.local/www/test.php on line 2 NULL

Notice: Undefined variable: var in /webs/test.local/www/test.php on line 4 bool(true)

Как видим, результат всё же есть и применением «!» к переменной, в принципе можно проверить её существование, но если переменная будет существовать и иметь значение «false», то результат будет тот же. Ну и, плюс ко всему, имеем ненужные ноутисы. И еще вот такой код

$var=array();
var_dump(!$var);

тоже выдаст «true», то есть, в принципе, можно проверить массив на заполненность. И еще «true» будет в последнем примере, если «var» будет иметь значения «array()», «0», «'0'», «''». Вывод: оператор «!» можно применять только к существующим переменным, чтобы сделать их «отрицание», применять их правильно к тем и только к тем переменным, которые могут быть «true» или «false», т.е. логического типа данных «bool». Остальные случаи, кончено, тоже работают, но, если, дай Бог, всё-таки введут в PHP строгую типизацию, то всё полетит к чертям.

2. Про isset. isset — это такая функция. Она проверяет переменную на существование и не «NULL». То есть «isset($var);» вернёт true только в случае, если переменная объявлена и имеет значение отличное от NULL. Вот такой код:

var_dump(isset($var));
$var=123;
var_dump(isset($var));
$var=NULL;
var_dump(isset($var));

выдаст нам такой результат:

bool(false)

bool(true)

bool(false)

В первом случае переменной еще не существует, поэтому «false», во втором мы переменной присвоили целочисленное значение «123», то есть переменная появилась и имеет значение, отличное от «NULL», поэтому «true», в третьем мы присвоили этой переменной значение «NULL», поэтому снова «false». Честно, говоря, я ни разу не использовал в PHP значение NULL и при помощи isset проверяю существование переменной. Вывод: isset проверяет существование переменной и возвращает «true», если эта переменная существует и её значение отличное от «NULL». Глобальные переменные типа $_POST существуют всегда, поэтому isset($_POST) всегда выдаст true.

3. Про empty. Вот тут столько же «непонятностей», что и с «!», как раз из-за отсутствия строгой типизации и, как следствие возможности сравнить, например строку с целым числом. «empty($var);» вернёт «true», если $var=0, $var='', $var='0', $var=NULL, $var=false, $var=array(), то есть пустой массив, или переменной вообще не существует. При попытке «скормить» функции несуществующую переменную, ноутиса не будет. Для чего я употребляю «empty»: в первую очередь для проверки «пришло ли что-нибудь из формы», т.е.

if (!empty($_POST))

во вторых, для проверки массивов на заполненность. Ну и еще, например, удобно её использовать для одновременной проверки существования и непустости переменной: например, имеем урл и нам надо проверить что в нём содержится — допустим три варианта «/catalog», «/catalog/», «/catalog/10». Первые два варианта надо сделать равнозначными, а воторой уже выведет нам конкретную запись в каталоге. Делаем что-то типа

$url=explode('/', $_SERVER['REQUEST_URI']);
if (empty($url[2]))
...
else
...

Эта запись будет равнозначна следующей:

if (!isset($url[2]) || (isset($url[2]) && $url[2]!=''))

Однако, следует иметь ввиду, что если на втором месте в урле будет стоять ноль, то этот empty выдаст true. Пример высосан из пальца, но общую суть, я думаю, он показывает.

Вот такие дела. Если что-то непонятно — задавайте вопросы. Если что-то забыл или написал неверно — поправляйте.

Link to comment
Share on other sites

8 answers to this question

Recommended Posts

  • 0

Про $_POST

If($_POST) - Истинна в случаяе, если существуют элементы массива даже если пустые, Лож в случае отсутствия элементов.

ну а «и вот эта: if(!$_POST['text']) ?»

Вернёт истину когда : $_POST['text']==NULL или ==0 или =="" или не существует, Ничего не пропустил ?

Link to comment
Share on other sites

  • 0
ну вот скажи, что означает вот эта запись: if($_text) ?

и вот эта: if(!$_POST['text']) ?

1. По-хорошему, это должно быть равносильно if ($_text===true). Что означает в данном случае зависит от кривизны рук программиста и контекста.

2. Ну то же самое, только if ($_POST['text']===false). Боюсь, что тут просто идёт проверка на заполненность.

Отсутствие строгой типизации — абсолютное зло.

Link to comment
Share on other sites

  • 0
$_POST['text']='0';

if (!$_POST['text']) echo '1';

должно вывести 1, если не ошибаюсь. Для PHP null, 0, '', array(), '0' - это вроде как одно и то же в ситуации с отрицанием.

Чтобы не гадать, нужно запомнить всего лишь два правила языка.

1. Оператор ! приводит значение выражения к boolean

2. Правила приведения различных типов к boolean. В разных языках они очень сильно разные.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy