Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP: Завершить выполнение кода из include-файла / 25 сообщений из 54, страница 1 из 3
02.06.2014, 13:42
    #38658664
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP: Завершить выполнение кода из include-файла
Подскажите, как лучше сделать?
Есть скрипт, в котором выполняется include("../lib/checks.php").
В файле checks.php выполняется куча различных проверок. Примерно так:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
if (check1) {
  if (check2) {
    if (check3) {
      $ret = 'ok';
    } else {
      $ret = 'error3';
    }
  } else {
    $ret = 'error2';
  }
} else {
  $ret = 'error1';
}



Таких проверок много и количество вложенных if слишком большое.
Хотелось бы переписать примерно так:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
if (!check1) {
  $ret = 'error1';
  break;
}
if (!check2) {
  $ret = 'error2';
  break;
}
if (!check3) {
  $ret = 'error3';
  break;
}
$ret = 'ok';



Но именно так нельзя, потому что break с верхнего уровня не выполняется.
Не подскажите, как лучше сделать?
Желательно более удобное и читаемое, чем такое:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
$stop = null
if (!$stop && !check1) {
  $ret = 'error1';
  $stop = true;
}
if (!$stop && !check2) {
  $ret = 'error2';
  $stop = true;
}
if (!$stop && !check3) {
  $ret = 'error3';
  $stop = true;
}
if (!$stop) {
  $ret = 'ok';
}



________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
02.06.2014, 13:54
    #38658689
r u
r u
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP: Завершить выполнение кода из include-файла
Alibek B.,

непонятно, в чем проблема то?
...
Рейтинг: 0 / 0
02.06.2014, 14:25
    #38658757
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP: Завершить выполнение кода из include-файла
Вот более реальный код:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
$var1 = ...;
if ($var1) {
  $res = dbquery($var);
  $var2 = func2($res['field']);
  if ($var2 === '123') {
    $var3 = func3($res['code']);
    if (check3) {
      $ret = 'ok';
    } else {
      $ret = 'error3';
    }
  } else {
    $ret = 'error2';
  }
} else {
  $ret = 'error1';
}


То есть между проверками есть еще какой-то код и в этом случае его также нужно будет заключать внутрь проверки на !$stop.

Пока что я просто использую goto вместо break и все работает.
Но может быть есть что-то более правильное.
...
Рейтинг: 0 / 0
02.06.2014, 14:30
    #38658773
r u
r u
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP: Завершить выполнение кода из include-файла
Alibek B.,


Alibek B.проверки на !$stop.
Пока что я просто использую goto вместо break и все работает.
где тут $stop и где тут GOTO?
говорите об одном коде, а показываете другой.
...
Рейтинг: 0 / 0
02.06.2014, 14:42
    #38658807
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP: Завершить выполнение кода из include-файла
Оформить всю кучу проверок как функцию и возвращать
Код: php
1.
return код_ошибки;

по мере обнаружения. В вызывающей программе проверять возвращаемое значение. Не?
...
Рейтинг: 0 / 0
02.06.2014, 14:56
    #38658829
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP: Завершить выполнение кода из include-файла
vkleОформить всю кучу проверок как функцию и возвращать
Код: php
1.
return код_ошибки;

по мере обнаружения. В вызывающей программе проверять возвращаемое значение. Не?

скажу даже больше... результатом функции include является результат возвращаемый скриптом.
потому:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
//main script
if (include "subscript.php"){echo "all right";}


//subscript.php
if (!check1) {
  $ret = 'error1';
  return false;
}
if (!check2) {
  $ret = 'error2';
  return false;
}
if (!check3) {
  $ret = 'error3';
  return false;
}
return true;
...
Рейтинг: 0 / 0
02.06.2014, 14:59
    #38658834
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP: Завершить выполнение кода из include-файла
автор$ret = 'error1';
return false;

запомните это дети и никогда больше так не делайте.
...
Рейтинг: 0 / 0
02.06.2014, 15:06
    #38658844
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP: Завершить выполнение кода из include-файла
ScareCrowавтор$ret = 'error1';
return false;

запомните это дети и никогда больше так не делайте.

))) К словам придираетесь, уважаемые?

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
//main script
if (include("subscript.php")=='ok'){echo "all right";}


//subscript.php
if (!check1) {
  return 'error1';
}
if (!check2) {
  return 'error2';
}
if (!check3) {
  return 'error3';
}
return 'ok';
...
Рейтинг: 0 / 0
02.06.2014, 15:11
    #38658854
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP: Завершить выполнение кода из include-файла
ПрограмёрScareCrowпропущено...


запомните это дети и никогда больше так не делайте.

))) К словам придираетесь, уважаемые?

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
//main script
if (include("subscript.php")=='ok'){echo "all right";}


//subscript.php
if (!check1) {
  return 'error1';
}
if (!check2) {
  return 'error2';
}
if (!check3) {
  return 'error3';
}
return 'ok';



вот так тоже не делайте.
...
Рейтинг: 0 / 0
02.06.2014, 15:12
    #38658856
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP: Завершить выполнение кода из include-файла
r uговорите об одном коде, а показываете другой.
Если мой код переписать так, как я предположил в конце первого сообщения (с помощью переменной $stop и ленивой проверки условий), то для промежуточных процедур нужно будет использовать дополнительные проверки $stop.

vkleОформить всю кучу проверок как функцию и возвращать return код_ошибки
Можно конечно и так.
Но тогда в этой функции нужно будет объявлять global для множества различных переменных и что-то можно будет упустить.
...
Рейтинг: 0 / 0
02.06.2014, 15:14
    #38658864
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP: Завершить выполнение кода из include-файла
авторif (include("subscript.php")=='ok')

кстати так не работает.
...
Рейтинг: 0 / 0
02.06.2014, 15:49
    #38658916
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP: Завершить выполнение кода из include-файла
ScareCrowавторif (include("subscript.php")=='ok')

кстати так не работает.

а как работает? ))) блин... ну видите синтаксическую ошибку, какого фига не написать "тут ошибся, вот сюда скобку надо"?!!!
Ну понятно, человек такой, ничё не поделать...

Насчёт "так не делайте" - да не хочу я общаться с тобой на эту тему... не хочешь - не делай, только вот если есть причина так не делать, то её надо описывать, а до того - это лично твоё мнение.

Вот проверенный вариант:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
<?php
   //main script
if ((include "input.txt")=='ok'){echo "all right";}else{echo "not right";}

?>

<?php
//subscript.php
if (!$check1) {
  return 'error1';
}
if (!$check2) {
  return 'error2';
}
if (!$check3) {
  return 'error3';
}
return 'ok';
?>
...
Рейтинг: 0 / 0
02.06.2014, 17:24
    #38659092
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP: Завершить выполнение кода из include-файла
поддерживаю. меня тоже заинтиговало почему не делать???

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

ответь пожалуста, почему не делать так?
...
Рейтинг: 0 / 0
02.06.2014, 17:33
    #38659101
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP: Завершить выполнение кода из include-файла
alex564657498765453поддерживаю. меня тоже заинтиговало почему не делать???

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

ответь пожалуста, почему не делать так?

все что что-то возвращает должно возвращать либо правильный ответ либо исключение.
...
Рейтинг: 0 / 0
02.06.2014, 17:53
    #38659127
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP: Завершить выполнение кода из include-файла
ScareCrowalex564657498765453поддерживаю. меня тоже заинтиговало почему не делать???

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

ответь пожалуста, почему не делать так?

все что что-то возвращает должно возвращать либо правильный ответ либо исключение.

а-а... ну всё понятно )))

А теперь главный вопрос, а кто сказал что "error1" или "error2" являются "неправильными" ответами? Вполне себе нормальная ситуация, человек проверяет состояние некоторого компонента (например некой модели) и смотрит:
1. Заполнено ли название. Если не заполнено вернуть "error1" (ну или логичнее вернуть "Не заполнено название").
2. Заполнено ли количество. Если не заполнено вернуть "error2" (ну или логичнее вернуть "Не заполнено количество элементов").
3. Заполнено ли описание. Если не заполнено вернуть "error3" (ну или логичнее вернуть "Не заполнено описание").

А потом на выход отправляется этот текст ошибки, который выводится пользователю.

Почему только один - например интерфейс предусматривает поле для вывода ошибки ввода (разумеется только одной ошибки).


P.S. Так что я говорю, без описания причины "так не делайте" - всегда Ваше личное мнение. Вот Вы посчитали что тут так, а реально тут может быть совсем и не так.
...
Рейтинг: 0 / 0
02.06.2014, 18:06
    #38659141
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP: Завершить выполнение кода из include-файла
Програмёр,

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

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

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

ведь оператор сложения это тоже функция, делает автоприведения типов, а откуда мы знаем что перед сумой учтено, что строка + число это исключение, а не равно числу(ибо строка - 0)

ЗЫ
в твоём случае всётаки лучше код возврата - мне так кажеться.
...
Рейтинг: 0 / 0
02.06.2014, 18:37
    #38659179
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP: Завершить выполнение кода из include-файла
авторА теперь главный вопрос, а кто сказал что "error1" или "error2" являются "неправильными" ответами? Вполне себе нормальная ситуация, человек проверяет состояние некоторого компонента (например некой модели) и смотрит:

а теперь посмотрите как это у нормальных людей сделанно.
...
Рейтинг: 0 / 0
02.06.2014, 19:47
    #38659229
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP: Завершить выполнение кода из include-файла
ScareCrowавторА теперь главный вопрос, а кто сказал что "error1" или "error2" являются "неправильными" ответами? Вполне себе нормальная ситуация, человек проверяет состояние некоторого компонента (например некой модели) и смотрит:

а теперь посмотрите как это у нормальных людей сделанно.

плиин, ну опять...а пример кода!!!
это очень абстрактно у нормальных людей.
вот на википедии написано, что МВЦ большинство пхп програмистов понимают не верно, и вот куда смотреть к нормальным людям?

а если в зенд, так там неделями можно смотреть пока поймёшь их концепцию...
...
Рейтинг: 0 / 0
02.06.2014, 21:50
    #38659345
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP: Завершить выполнение кода из include-файла
автора если в зенд, так там неделями можно смотреть пока поймёшь их концепцию...
медитируй, это полезно.
...
Рейтинг: 0 / 0
02.06.2014, 22:55
    #38659374
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP: Завершить выполнение кода из include-файла
150 раз уже обсасывали эту тему на форумах (и десятки раз наверное на этом форуме).

Ну что же... повторим:
Исключения - это маяк исключительной ситуации. Ситуации, за которую я как программист некоторого компонента не могу нести ответственность.

1. Ну например, я читаю данные из базы, и внутри функции чтения оказывается что не был передан идентификатор соединения. Работа функции далее бесполезна. Можно вернуть false, но лучше бросить исключение, так как и последующая программа скорее всего будет работать неверно.

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

3. Например, я читаю книжку. И дойдя до 125 страницы понимаю, что страниц больше нету, но текст оборвался на полуслове. Можно закрыть книжку и пойти спать (вернуть false), но лучше пойти в магазин и потребовать объяснений (бросить исключение), так как и последующая программа (чтение следующей книги из серии) скорее всего будет работать неверно.

1. Однако, я читаю из базы данные, и мне возвращается пустой массив (данные не найдены). Можно бросить исключение, но... лучше вернуть false, ведь вполне нормально, что на сайте нету например книжек на букву "ъ".

2. Однако, я принимаю данные через сокет и вдруг поток данных заканчивается (длина очередной порции равна нулю). Можно бросить исключение, но... лучше вернуть false, ведь вполне нормально что я принял всё, что мне отправляли и ничего страшного в окончании приёма данных нету, программа продолжает функционировать в штатном режиме.

3. Однако, я читаю книгу. Дойдя до 250-ой страницы, я понимаю, что она закончилась, пошло описание разных терминов, прослеживается законченность мысли, но не прослеживается законченность идеи. Можно конечно пойти в магазин и потребовать объяснений, почему рассказ продаётся по частям, но лучше закрыть книгу и лечь спать :) А завтра пойти в магазин и в штатном режиме купить очередную книгу из серии.


Потому бросание исключений по каждому чиху - это бред. Если моя функция предусматривает на выходе варианты "name is empty", "number is empty", "content is empty" и "ok" , то нету смысла для первых трёх вариантов бросать исключения. Ведь моя функция именно так и документирована
Код: php
1.
2.
3.
4.
5.
<?php
/**
 * Возвращает текст ошибки ввода или ok в случае правильного ввода данных
 */
?>


Потому поведение неправильного ввода является штатным.

И "уважаемый(ая)" ScareCrow, давайте впредь не троллить участников форума. Уж не знаю почему модераторы закрывают на это глаза, но Вам место в ветке ПТ. С Вашим интересом просто ля... сказать, Вам ветка с обычным трёпом ни о чём принесёт много радости :)
...
Рейтинг: 0 / 0
05.06.2014, 09:36
    #38662207
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP: Завершить выполнение кода из include-файла
Не хочу, конечно, никого обидеть, но все фрагменты кода приведенные тут, являются, ИМХО, - говнокодом, кой писать не стоит. Написав таким образом большой проект вы замучаетесь его потом поддерживать, особенно когда года через 2 забудете сами что да как там работает. Не говоря уже о том, что поддержка достанется кому-то другому.
...
Рейтинг: 0 / 0
05.06.2014, 09:39
    #38662214
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP: Завершить выполнение кода из include-файла
Пусть даже это будут не исключения, объявите в подключаемом файле внятно называнную функцию с внятными параметрами и используйте ее. Лучше даже вынести в какой-то класс. А если использовать автоподгрузку то можно вообще забыть про эти все include.
...
Рейтинг: 0 / 0
05.06.2014, 10:30
    #38662264
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP: Завершить выполнение кода из include-файла
HettНе хочу, конечно, никого обидеть, но все фрагменты кода приведенные тут, являются, ИМХО, - говнокодом, кой писать не стоит. Написав таким образом большой проект вы замучаетесь его потом поддерживать, особенно когда года через 2 забудете сами что да как там работает. Не говоря уже о том, что поддержка достанется кому-то другому.

сам я так не пишу, так как почти все приложения проектирую с использованием ООП, на больших проектах это разумеется удобнее структурного программирования. Однако, чем приведённый код будет усложнять поддержку в случае если весь сайт написан функциями, без использования объектов?

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

Правильно... единственный файл, который можно загрузить по имени не передавая в него весь список доступных аргументов явно. А модуль уж сам разберётся, что ему из данных надо, а что нет.

Придумайте систему, которую было бы проще чем эту поддерживать и расширять. :) Если предложите вариант проще, я покорно соглашусь что не прав :)

P.S. Варианты, где все используемые данные заталкиваются в один массив не предлагать, потому как именно это точно поддерживать невозможно. Поверьте, я знаю И теперь уже знаю что значит поддерживать проект, в котором модуль привязывается к сайту через специальную функцию внутрь которой передаётся предела 30 аргументов. Просто документация к этой системе велась посредственно, а в какой-то момент её вообще не стало :)

Так что, в поддержание слова "говнокод" жду не говнокод в ответ :)
...
Рейтинг: 0 / 0
05.06.2014, 11:02
    #38662313
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP: Завершить выполнение кода из include-файла
авторОднако, чем приведённый код будет усложнять поддержку в случае если весь сайт написан функциями, без использования объектов?

Хотя бы тем, что тут даже функций то и нет, вместо ее вызывается оператор include. Который юзает глобальный набор переменных и может менять их значение или вовсе удалять их.
...
Рейтинг: 0 / 0
05.06.2014, 11:04
    #38662318
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP: Завершить выполнение кода из include-файла
ПрограмёрТак что, в поддержание слова "говнокод" жду не говнокод в ответ :)
Думаю как завернуть этот же код хотя бы в функцию вы себе представить можете, поэтому не вижу смысла тратить время на ерунду, доказывая что-то тут :)
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP: Завершить выполнение кода из include-файла / 25 сообщений из 54, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]