Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: trim
 
 автор: moonfox   (19.06.2014 в 03:54)   письмо автору
 
 

в каком случае trim возвращает 1 (единицу)?

  Ответить  
 
 автор: confirm   (19.06.2014 в 04:56)   письмо автору
 
   для: moonfox   (19.06.2014 в 03:54)
 

Только в том случае, если строка будет содержать символ 1 или его и пробелы.
Если вы об истинности, то никогда, ибо trim возвращает не булево значение, а строку в которой удалены крайние символы ею удаляемые.
А вот проверка истинности возвращаемого значения любой функции (которая возвращает не булево значение) или выражения может вернуть true/false (1/0). В каком случае при этом будет 1?

  Ответить  
 
 автор: moonfox   (19.06.2014 в 05:12)   письмо автору
 
   для: 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



почему так происходит?

  Ответить  
 
 автор: confirm   (19.06.2014 в 05:20)   письмо автору
 
   для: moonfox   (19.06.2014 в 05:12)
 

Потому, что конструкция вашего выражения неверна для ваших ожиданий.

Поясните как вы понимаете это выражение, то есть как это работает:

if($v = trim($v))

?

  Ответить  
 
 автор: moonfox   (19.06.2014 в 05:23)   письмо автору
 
   для: confirm   (19.06.2014 в 05:20)
 

если v истинно в свою очередь v присвоен результат ф-ции
хотите сказать не хватает скобок в моем примере?

  Ответить  
 
 автор: confirm   (19.06.2014 в 05:40)   письмо автору
 
   для: moonfox   (19.06.2014 в 05:23)
 

Нет не так.
Сначала функция обрежет крайние символы, затем возвращенное ею значение будет присвоено указанной переменной, и только затем будет проверено истинно ли значение этой переменной. То есть сама переменная при этом будет хранить не булево значение.

Что получается, если конструкция if обязана проверить истинность N значений?

if($a && $b && $c ...)

В этом случае она проверяет значение каждой переменной (или выражения) этой конструкции (обязательно с учетом приоритетов), и присваивает БУЛЕВ результат каждой из этой переменной (хранить то ведь их надо), затем производит логическую операцию (в данном случае AND) над этими результатами, и уже этот результат является конечным.

Из этого следует, что, для того чтобы запомнить в переменных не булево значение проверки в логических конструкциях, нужно заключать в скобки выражения присваивания, слева на право, то есть:

<?
if(($a exp($a)) && ($b exp($b)) && $c exp($)) ...


Последнее правое присваивание можно не заключать в скобки.

  Ответить  
 
 автор: moonfox   (19.06.2014 в 05:42)   письмо автору
 
   для: confirm   (19.06.2014 в 05:40)
 

Сначала функция обрежет крайние символы, затем возвращенное ею значение будет присвоено указанной переменной, и только затем будет проверено истинно ли значение этой переменной. То есть сама переменная при этом будет хранить не булево значение.


вообщето я это и написал)
спасибо

  Ответить  
 
 автор: confirm   (19.06.2014 в 05:48)   письмо автору
 
   для: moonfox   (19.06.2014 в 05:42)
 

Нет, вы написали совсем не это. Если бы это, значит бы понимали, что и где вынуждены хранить, тогда бы и вопроса у вас не возникло.

  Ответить  
 
 автор: moonfox   (19.06.2014 в 05:58)   письмо автору
 
   для: confirm   (19.06.2014 в 05:48)
 

очевидно true не может быть на $v если в ней не состоялось присвоение от ф-ции
очевидно под под "свою очередь" понимается отработка ф-ции и присвоение соответственно
так что я написал именно то.


почему не считать по умолчанию, что если в if есть присвоение, то проверять переменную со значением ?

  Ответить  
 
 автор: confirm   (19.06.2014 в 06:14)   письмо автору
 
   для: moonfox   (19.06.2014 в 05:58)
 

То, что результат присваивания, это значение вас интересующее, а не булев результат проверки истинности. Другими словами, РНР нет нужды запоминать в этом случае булев результат, достаточно его просто вернуть. Вот из этого как раз и вытекает, что по логике конструкция должна быть такой:

if(if($a == 1) && if($b == 2) && if($c == 3) ...)

Ваше действие простое, а ведь могут быть сложные логически конструкции, в которых тоже нужно сохранить возвращаемое значение, и при этом учитывать еще и приоритет, что тогда?

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

Только сейчас обратил внимание на:
>почему не считать по умолчанию, что если в if есть присвоение, то проверять переменную со значением ?

То что я писал выше, это упрощенное и обобщенное, а на самом деле, поведение этого обуславливается тем, что в РНР оператор присваивания (=) имеет самый низший приоритет по сравнению с другими операторами.

Обязательно зайдите в раздел руководства "Операторы -> Приоритет оператора". В нем есть пояснение и об "ассоциативности", что нужно очень хорошо понимать, дабы правильно расставить те же скобки.

  Ответить  
 
 автор: Igorek   (19.06.2014 в 09:29)   письмо автору
 
   для: 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 и получили "ожидаемый" результат

  Ответить  
 
 автор: confirm   (19.06.2014 в 09:40)   письмо автору
 
   для: Igorek   (19.06.2014 в 09:29)
 

Это же руководство гласит дословно "большинства операторов". Я просто не упоминаю всех, речь шла о конкретном примере (конкретных операторов). Поэтому и надо читать и о приоритетах, и об ассоциативности, чтобы понять что значит && и AND.

PS. Наверное проще всего понять что значит приоритет, это в тернарном операторе, пытаясь присвоить, а затем использовать, но написать так:

$a = $c = $m-$n ? $c : null;

  Ответить  
 
 автор: moonfox   (19.06.2014 в 13:38)   письмо автору
 
   для: Igorek   (19.06.2014 в 09:29)
 

спасибо)

  Ответить  
 
 автор: Commander   (19.06.2014 в 07:00)   письмо автору
 
   для: moonfox   (19.06.2014 в 03:54)
 

Функция trim() возвращает строку, переданную в качестве первого параметра, удалив из ее начала и конца строку, переданную в качестве второго параметра. Если второй параметр не передан, она удаляет пробелы.

  Ответить  
 
 автор: confirm   (19.06.2014 в 07:02)   письмо автору
 
   для: Commander   (19.06.2014 в 07:00)
 

Не правда, не только пробелы.

  Ответить  
 
 автор: Commander   (19.06.2014 в 19:49)   письмо автору
 
   для: confirm   (19.06.2014 в 07:02)
 

А что еще?

  Ответить  
 
 автор: Саня   (02.07.2014 в 16:33)   письмо автору
 
   для: Commander   (19.06.2014 в 19:49)
 

Ещё символы с ASCII кодами 0x09, 0x0A, 0x0D, 0x00 и 0x0B.

  Ответить  
 
 автор: moonfox   (19.06.2014 в 13:38)   письмо автору
 
   для: Commander   (19.06.2014 в 07:00)
 

вопрос не об этом был)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования