Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
Страницы: (2) [1] 2  ( Перейти к первому непрочитанному сообщению )  
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> do... while(false) ? wtf я чего то не понимаю...
viper  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 33
Пользователь №: 41966
На форуме: 1 год, 5 месяцев, 14 дней
Карма:




Добрый день! Подскажите пожалуйста смысл этого кода:

<?php
do {
if ($i < 5) {
echo "i еще недостаточно велико";
break;
}
$i *= $factor;
if ($i < $minimum_limit) {
break;
}
echo "значение i уже подходит";

/* обработка i */

} while (0);
?>

Я не могу понять, мы не уменьшаем $i, и выполняем цикл, до 0, значит цикл бесконечный?
Но на http://php.ru/manual/control-structures.do.while.html пишут что это наоборот хак, и опытные програмисты могут использовать... Если не сложно можно на пальцах обьяснить? Буду очень благодарен
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
icedfox  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 395
Пользователь №: 41702
На форуме: 1 год, 7 месяцев, 15 дней
Карма: 13




Цитата (viper @ 9.12.2015 - 14:49)
if ($i < 5) {

Проверка, если $i меньше 5 , то останавливаем.
Цитата (viper @ 9.12.2015 - 14:49)
$i *= $factor;

Выполняем операцию $i равно $i умножить на 5 умножить на $factor . Значение $factor я у вас не увидел
Цитата (viper @ 9.12.2015 - 14:49)
if ($i < $minimum_limit) {

Проверка, если $i меньше $minimum_limit, то останавливаем. Значение $$minimum_limit я у вас не увидел.
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
kaww  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1780
Пользователь №: 20757
На форуме: 7 лет, 1 месяц, 27 дней
Карма: 186




Цитата (viper @ 9.12.2015 - 08:49)
что это наоборот хак

именно. Так иногда делают, чтобы не плодить вложенных условий. Т.е. можно заменить на
if ($i >= 5) {
$i *= $factor;
if ($i >= $minimum_limit){
echo "значение i уже подходит";
/* обработка i */
}
}
else {
echo "i еще недостаточно велико";
}
PMПисьмо на e-mail пользователю
    1   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
viper  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 33
Пользователь №: 41966
На форуме: 1 год, 5 месяцев, 14 дней
Карма:




Благодарю! Теперь все стало на свои места.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Valick  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 5593
Пользователь №: 35718
На форуме: 4 года, 4 месяца, 9 дней
Карма: 170




это что за вынос мозга?
посто нет слов... я это даже говнокодом назвать не могу, так как писал это не говнокодер, а клинический идиот.


--------------------
wmr - R281553014107
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Valick  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 5593
Пользователь №: 35718
На форуме: 4 года, 4 месяца, 9 дней
Карма: 170




Цитата (viper @ 9.12.2015 - 12:35)
Благодарю! Теперь все стало на свои места.

что у вас стало на места?


--------------------
wmr - R281553014107
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
waldicom  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 6236
Пользователь №: 5552
На форуме: 8 лет, 8 месяцев, 22 дня
Карма: 163




Валик, ты чуго последнее время злой такой?


--------------------
Свои мозги еще никто не отменял.
Телепатов нету.
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Valick  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 5593
Пользователь №: 35718
На форуме: 4 года, 4 месяца, 9 дней
Карма: 170




waldicom, переутомление. Но дело не в этом. (Жена сидит подруку трындит, что злой как собака. Молчи женщина!)
Я добрый. Но как на этот код можно спокойно смотреть...


--------------------
wmr - R281553014107
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
viper  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 33
Пользователь №: 41966
На форуме: 1 год, 5 месяцев, 14 дней
Карма:




Цитата
что у вас стало на места?

Стало понятно как работает этот цикл.
Цитата
я это даже говнокодом назвать не могу, так как писал это не говнокодер, а клинический идиот.

А вот php.net как раз пишет:
Цитата

Опытные пользователи С могут быть знакомы с другим использованием цикла do-while, которое позволяет остановить выполнение хода программы в середине блока, для этого нужно обернуть нужный блок кода вызовом do-while (0) и использовать break. Следующий фрагмент кода демонстрирует этот подход:

Офф документация все таки... Ссылка
И вот уважаемые kaww и icedfox помогли мне понять как это работает

Это сообщение отредактировал viper - 9.12.2015 - 14:31
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Valick  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 5593
Пользователь №: 35718
На форуме: 4 года, 4 месяца, 9 дней
Карма: 170




viper, ок. Раз вы поняли. Расскажите в каких случаях применяется do{}while()
По поводу кода с оф сайта, просто запустите его. Отпишитесь о результате.


--------------------
wmr - R281553014107
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
viper  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 33
Пользователь №: 41966
На форуме: 1 год, 5 месяцев, 14 дней
Карма:




Хм, ну я конечно далеко не гуру, но могу предположить что его можно применять, например при отправке email что то типа такого:

//Предположим что метод валидации у нас в этом классе
// И метода add тоже в этом же классе. Это все условно, просто для примера

do {
if(!$this->validate($post)){
//вывод ошибки
break;
}
//запись в бд
if(!$this->add){
//вывод ошибки
break;
}
//Запись в excel
$xlsx = new PHPExcel();
//Запись в эксель
if(!$objWriter->save('output/' . $fileName . '.xlsx')){
//вывод ошибки
break;
}
$mail = new Mailer();
//И если все предыдущие шаги успешны отправка email
if(!$main->sendMail){
//вывод ошибки
break;
}
//Здесь можно сделать редирект куда нибудь
} while (false);


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

Это сообщение отредактировал viper - 9.12.2015 - 14:52
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Valick  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 5593
Пользователь №: 35718
На форуме: 4 года, 4 месяца, 9 дней
Карма: 170




viper, цикл do{}while() применяется там где решение о продолжении цикла, нельзя принять раньше выполнения первой итерации этого цикла. В вебе таких ситуаций крайне мало.

Цитата (viper @ 9.12.2015 - 13:50)
там явно видно что не хватает переменных, соответственно работать не будет

добавьте, всего-то две переменные.


--------------------
wmr - R281553014107
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
AllesKlar  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 3482
Пользователь №: 38635
На форуме: 3 года, 3 месяца, 2 дня
Карма: 184




Цитата (viper @ 9.12.2015 - 12:50)
Хм, ну я конечно далеко не гуру, но могу предположить что его можно применять, например при отправке email что то типа такого: .......

Это неудачный пример.
Если есть несколько условий и не хочется городить длииииное условие для if(), то делается так:

$error = false;

if(!$error && !$condition1) {
$error = true;
}

if(!$error && !$condition2) {
$error = true;
}

if(!$error && !$condition3) {
$error = true;
}

if(!$error) {
// .......
} else {
//.....
}


Поэтому, считаю, что do...while(false) - это чистой воды хрень собачая, направленная только на одно: сделать максимально затруднительным понимание логики скрипта.

do...while( $condition) же используется не тогда, когда там какое-то решение принимается, а тогда, когда гарантировано должна пройти минимум одна итерация. Все остальное - это философия отчисленных с философического факультета студентов.


--------------------
[продано копирайтерам]
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
viper  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 33
Пользователь №: 41966
На форуме: 1 год, 5 месяцев, 14 дней
Карма:




Цитата
применяется там где решение о продолжении цикла, нельзя принять раньше выполнения первой итерации этого цикла.

Да, тут вы правы, но этот код выполнится всего один раз в любом случае, независимо от условий которые написаны в теле цикла, поэтому это сложно назвать циклом, скорее, как на php.net выразились - это "хак".
Я не помню кто то на этом форуме сказал, что если это было придумано разработчиками, значит это для чего то нужно. И если не вы ни я не можем привести пример где эту конструкцию необходимо использовать, это не значит что она не нужна, и не нужно кричать что это "говнокод".
И кстати я где то тут видел, приводили пример реализации, где действительно необходим goto, хотя все кричат на каждом углу что goto - давно пора удалить из языка,

Цитата
В вебе таких ситуаций крайне мало.

Вот вы сами признали что такие ситуации существуют, хотя их и очень мало.


Цитата

Поэтому, считаю, что do...while(false) - это чистой воды хрень собачая, направленная только на одно: сделать максимально затруднительным понимание логики скрипта.


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

Это сообщение отредактировал viper - 9.12.2015 - 15:37
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
viper  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 33
Пользователь №: 41966
На форуме: 1 год, 5 месяцев, 14 дней
Карма:




P.S. я не хочу разводить холиваров smile.gif И не говорю что вы не правы, скорее наоборот правы smile.gif Просто у каждого свое мнение на счет "говнокода" smile.gif
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темыСтраницы: (2) [1] 2  Ответ в темуСоздание новой темыСоздание опроса