|
|
|
| в каком случае trim возвращает 1 (единицу)? | |
|
|
|
|
|
|
|
для: moonfox
(19.06.2014 в 03:54)
| | Только в том случае, если строка будет содержать символ 1 или его и пробелы.
Если вы об истинности, то никогда, ибо trim возвращает не булево значение, а строку в которой удалены крайние символы ею удаляемые.
А вот проверка истинности возвращаемого значения любой функции (которая возвращает не булево значение) или выражения может вернуть true/false (1/0). В каком случае при этом будет 1? | |
|
|
|
|
|
|
|
для: confirm
(19.06.2014 в 04:56)
| |
А вот проверка истинности возвращаемого значения любой функции
|
вот в чем суть...
тогда встречный вопрос
$pass = 'aaaa';
$fio ='vasya pupkin';
if($pass = trim($pass) && $fio = trim($fio))
{}
echo $pass // 1
echo $fio // vasya pupkin
|
почему так происходит? | |
|
|
|
|
|
|
|
для: moonfox
(19.06.2014 в 05:12)
| | Потому, что конструкция вашего выражения неверна для ваших ожиданий.
Поясните как вы понимаете это выражение, то есть как это работает:
if($v = trim($v))
? | |
|
|
|
|
|
|
|
для: confirm
(19.06.2014 в 05:20)
| | если v истинно в свою очередь v присвоен результат ф-ции
хотите сказать не хватает скобок в моем примере? | |
|
|
|
|
|
|
|
для: moonfox
(19.06.2014 в 05:23)
| | Нет не так.
Сначала функция обрежет крайние символы, затем возвращенное ею значение будет присвоено указанной переменной, и только затем будет проверено истинно ли значение этой переменной. То есть сама переменная при этом будет хранить не булево значение.
Что получается, если конструкция if обязана проверить истинность N значений?
if($a && $b && $c ...)
В этом случае она проверяет значение каждой переменной (или выражения) этой конструкции (обязательно с учетом приоритетов), и присваивает БУЛЕВ результат каждой из этой переменной (хранить то ведь их надо), затем производит логическую операцию (в данном случае AND) над этими результатами, и уже этот результат является конечным.
Из этого следует, что, для того чтобы запомнить в переменных не булево значение проверки в логических конструкциях, нужно заключать в скобки выражения присваивания, слева на право, то есть:
<?
if(($a = exp($a)) && ($b = exp($b)) && $c = exp($)) ...
|
Последнее правое присваивание можно не заключать в скобки. | |
|
|
|
|
|
|
|
для: confirm
(19.06.2014 в 05:40)
| |
Сначала функция обрежет крайние символы, затем возвращенное ею значение будет присвоено указанной переменной, и только затем будет проверено истинно ли значение этой переменной. То есть сама переменная при этом будет хранить не булево значение.
|
вообщето я это и написал)
спасибо | |
|
|
|
|
|
|
|
для: moonfox
(19.06.2014 в 05:42)
| | Нет, вы написали совсем не это. Если бы это, значит бы понимали, что и где вынуждены хранить, тогда бы и вопроса у вас не возникло. | |
|
|
|
|
|
|
|
для: confirm
(19.06.2014 в 05:48)
| | очевидно true не может быть на $v если в ней не состоялось присвоение от ф-ции
очевидно под под "свою очередь" понимается отработка ф-ции и присвоение соответственно
так что я написал именно то.
почему не считать по умолчанию, что если в if есть присвоение, то проверять переменную со значением ? | |
|
|
|
|
|
|
|
для: moonfox
(19.06.2014 в 05:58)
| | То, что результат присваивания, это значение вас интересующее, а не булев результат проверки истинности. Другими словами, РНР нет нужды запоминать в этом случае булев результат, достаточно его просто вернуть. Вот из этого как раз и вытекает, что по логике конструкция должна быть такой:
if(if($a == 1) && if($b == 2) && if($c == 3) ...)
Ваше действие простое, а ведь могут быть сложные логически конструкции, в которых тоже нужно сохранить возвращаемое значение, и при этом учитывать еще и приоритет, что тогда?
Кстати, именно потому, что крайние пробелы, а также слеши, это мусор (и крайняя нежелательность, особенно второго), а их удаление с последующим присваиванием результата непосредственно в логическом выражении может сделать это выражение чрезмерно громоздким, и надо выполнять эти операции до проверки непосредственно условий. Как это можно сделать, я вам уже писал.
Только сейчас обратил внимание на:
>почему не считать по умолчанию, что если в if есть присвоение, то проверять переменную со значением ?
То что я писал выше, это упрощенное и обобщенное, а на самом деле, поведение этого обуславливается тем, что в РНР оператор присваивания (=) имеет самый низший приоритет по сравнению с другими операторами.
Обязательно зайдите в раздел руководства "Операторы -> Приоритет оператора". В нем есть пояснение и об "ассоциативности", что нужно очень хорошо понимать, дабы правильно расставить те же скобки. | |
|
|
|
|
|
|
|
для: confirm
(19.06.2014 в 06:14)
| | > в РНР оператор присваивания (=) имеет самый низший приоритет по сравнению с другими операторами
Здесь не согласен. Согласно раздела руководства, который вы упоминали http://www.php.net//manual/ru/language.operators.precedence.php операторы and,xor,or и "," имеют приоритет ниже, чем оператор присваивания. Что легко доказывается примером:
<?
$pass = 'aaaa';
$fio ='vasya pupkin';
if($pass = trim($pass) AND $fio = trim($fio))
{}
echo $pass; // aaaa
echo $fio; // vasya pupkin
|
поменяли && на AND и получили "ожидаемый" результат | |
|
|
|
|
|
|
|
для: Igorek
(19.06.2014 в 09:29)
| | Это же руководство гласит дословно "большинства операторов". Я просто не упоминаю всех, речь шла о конкретном примере (конкретных операторов). Поэтому и надо читать и о приоритетах, и об ассоциативности, чтобы понять что значит && и AND.
PS. Наверное проще всего понять что значит приоритет, это в тернарном операторе, пытаясь присвоить, а затем использовать, но написать так:
$a = $c = $m-$n ? $c : null; | |
|
|
|
|
|
|
|
для: Igorek
(19.06.2014 в 09:29)
| | спасибо) | |
|
|
|
|
|
|
|
для: moonfox
(19.06.2014 в 03:54)
| | Функция trim() возвращает строку, переданную в качестве первого параметра, удалив из ее начала и конца строку, переданную в качестве второго параметра. Если второй параметр не передан, она удаляет пробелы. | |
|
|
|
|
|
|
|
для: Commander
(19.06.2014 в 07:00)
| | Не правда, не только пробелы. | |
|
|
|
|
|
|
|
для: confirm
(19.06.2014 в 07:02)
| | А что еще? | |
|
|
|
|
|
|
|
для: Commander
(19.06.2014 в 19:49)
| | Ещё символы с ASCII кодами 0x09, 0x0A, 0x0D, 0x00 и 0x0B. | |
|
|
|
|
|
|
|
для: Commander
(19.06.2014 в 07:00)
| | вопрос не об этом был) | |
|
|
|