За последние 24 часа нас посетил 58021 программист и 1846 роботов. Сейчас ищут 1045 программистов ...

Помогите разобраться с ошибкой .

Тема в разделе "Прочие вопросы по PHP", создана пользователем sergeior, 20 мар 2015.

  1. sergeior

    sergeior Новичок

    С нами с:
    20 мар 2015
    Сообщения:
    7
    Симпатии:
    0
    Вот такая ошибка :
    Parse error: syntax error, unexpected '(', expecting T_STRING in Z:\home\olivia\www\index.php on line 22
    Сама строчка :
    goto ('/');
     
  2. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
  3. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Не надо использовать GOTO. Никогда. Чай, не на ассемблере пишете, есть более разумные способы управления потоком выполнения.
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    А может когда-то php позволял использовать goto в качестве идентификатора функции, и этот код написан в те времена? Тогда функцию переименовать надо. Вроде как оператор он появился только в php 5.3, если мне память не изменяет. А вообще, я пользую goto, но очень редко. Когда с ним более компактно. А break и continue, которые, как известно, тот же goto, вообще постоянно.
     
  5. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    верно, раньше на гоуту не ругался.
    Сейчас это зарезервированное слово.
    Использовать гоуту плохо(((
     
  6. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Никогда так никому больше не говори. Ни. Ко. Гда.
     
  7. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Я что, не прав? break равнозначен goto с меткой сразу за циклом, continue - goto на метку перед закрытием блока цикла. Поэтому их многие объединяют в одну группу.
     
  8. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    а цикл while равнозначен двум goto и одному if ))) так можно всё довести до абсурда (читай: до ассемблера).

    в двух словах критика GOTO выражается очень просто: «Хуй поймешь, в каком порядке выполняется этот код»
    я видел как неглупые люди защищали goto только потому, что не знали всех возможностей break.
     
  9. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Не прав. Не важно, как ты для себя это представляешь, это разные вещи.

    break никому не указывает на "метку сразу за циклом", break, который, кстати, в PHP еще и аргумент принимать может, сообщает пыхомашине, что:
    1) Итерацию нужно прервать.
    2) Цикл нужно остановить.
    3) Переменные в области видимости выпилить.
    4) Включая счетчик, если он был объявлен в теле цикла.
    5) После освобождения ресурсов передать управление основному потоку выполнения.

    continue тоже никуда не "указывает". Оно сообщает пыхомашине, что:
    1) Итерацию нужно прервать.
    2) Сохранив контекст выполнения.
    3) Инициировав новую итерацию с условием изменения итератора, описанного в теле цикла, если таковое было.
    4) Проверив условие завершения цикла.

    Это не просто "слышь, прыгни на такую-то строку". Даже если ты для себя это представляешь иначе.
     
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    В первый раз слышу, что в php есть область видимости "блок". Знаю глобальные, знаю локальные, знаю члены классов. А вот реально, чтоб как в C переменная была локальна внутри блока (в цикле, к примеру), а при выходе - уничтожалась, такого не читал. И вроде никогда и не было.

    Добавлено спустя 17 минут 56 секунд:
    C:
    Код (Text):
    1.  
    2. #include <stdio.h>
    3. int main() {
    4.    int i;
    5.    for (i = 0; i < 4; i++) {
    6.        int j = i * 10;
    7.    }
    8.    
    9.    printf("%d", j); /* Здесь будет ошибка компиляции */
    10. }
    PHP:
    Код (Text):
    1.  
    2. <?php
    3. for ($i = 0; $i < 4; $i++) {
    4.    $j = $i * 10;
    5. }
    6.  
    7. echo $j; // Спокойненько выведет 30
     
  11. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Ок, чертовы полурабочие области видимости. Но break и continue есть не только в пыхе, так что, по факту, написано все верно, но да, 3 и 4 пункт тут лесом конкретно в случае с PHP.

    И один хрен это не оправдывает использование GOTO нуникак. В JS тоже есть бряк и континью. А вот GOTO нет. И это прекрасно.
     
  12. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ладно, чтоб закрыть тему. 3, 4,5 в C++ срабатывает в том числе и при выходе из блока по goto. По крайней мере у GCC.

    Добавлено спустя 4 минуты 33 секунды:
    К goto у меня отношение простое - если мне удобно его где-то использовать, то я это делаю. Почему бы нет. Если он у меня встретиться 1-2 раза за пару тысяч строк кода, ничего страшного в этом нет.

    Про break и continue я тоже читал, что не гоже их использовать, поскольку можно обойтись и без них зачастую. Как пример приводят что-то в этом роде:
    Код (PHP):
    1. /* Типа плохо */
    2. while (cond1()) {
    3.    if (cond2())
    4.         continue;
    5.    // 10-15 строк кода
    6. }
    7.  
    8. /* Типа хорошо */
    9. while (cond1()) {
    10.    if (!cond2()) {
    11.       // 10-15 строк
    12.    }
    13. }
    14.  
    Я всегда пишу первый вариант, поскольку мне его легче читать
     
  13. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Аналогично. И деление на хорошо и плохо тут не катит. Как минимум, потому что кроме ифа бывает свитч, к примеру. Или бывает нужно пропустить итерации текущего и родительского цикла разом. Или брякнуть обоих.

    И тут соль еще в чем. Если ты встретил брейк или континью, то ты знаешь, в какой области оно действует и однозначно трактуешь их. Если ты встретил GOTO в чужом коде, то это ничерта не очевидная хрень, если дятел, который ее поставил, соскакивает на воооооооооооооон ту строку. Тебе приходится пытаться осмыслить логику его кода с учетом этих переходов. А где один, там и два. Где два, там и три. Или другой вариант, все было норм, но тут ты находишь помеченную строку посреди кода... Она никак не выпадает из контекста выполнения, но ты понимаешь, что все, что идет после нее, является еще и частью логики какого-то кода в другом месте.

    GOTO не аналог брейка и континью. Это, скорее, аналог процедур. Приходилось писать на убер-раннем бейсике, где вместо процедур были как раз GOTO-шечки. Наследие асма для управляемости кода. При том, что брейк и континью там тоже были. И с тех пор кочует оно по языкам.

    И, честно, с тех пор пока не было ни одной ситуации в жизни, когда GOTO был бы нужен. Вооообще ни одной.
     
  14. sergeior

    sergeior Новичок

    С нами с:
    20 мар 2015
    Сообщения:
    7
    Симпатии:
    0
    Так и не понял как исправить свою ошибку !
    Код (Text):
    1.  
    2.  
    3. <?php
    4.  
    5. session_start(); //only for language support
    6.  
    7. error_reporting(E_ALL); //DEBUG_MODE_OFF
    8. ini_set('display_errors', 'on'); //DEBUG_MODE_OFF
    9. define('VISIT_MODE', 0x000001);
    10.  
    11. $root_path = rtrim($_SERVER['DOCUMENT_ROOT'], '/').'/';
    12. define('ROOT_PATH', $root_path);
    13. $site_root_path = rtrim($_SERVER['DOCUMENT_ROOT'], '/').'/';
    14. $acp_root_path = 'acp/';
    15.  
    16. require($root_path . 'sources/core/engine.php'); //DEBUG_MODE_OFF
    17.  
    18.  
    19.  
    20. $engine->init_page_info(isset($_REQUEST['page'])?$_REQUEST['page']:'main');
    21.  
    22. //page not found
    23. if($engine->page_info==null)
    24. {
    25.     goto('/');
    26. }
    27.  
    28. //header
    29. if($engine->page_info['header_script'])
    30. {
    31.     include($root_path . 'sources/modules/' . $engine->page_info['header_script'] . '.php'); //DEBUG_MODE_OFF
    32. }
    33.  
    34.  
    35. //main
    36. if($engine->page_info['script'] && file_exists($root_path . 'sources/modules/' . $engine->page_info['script'] . '.php') )
    37. {
    38.     include($root_path . 'sources/modules/' . $engine->page_info['script'] . '.php'); //DEBUG_MODE_OFF
    39.     $engine->ParseNavigation();
    40.     $template->run();
    41. }
    42. else
    43. {  
    44.     include($root_path . 'sources/modules/template_text.php');  //DEBUG_MODE_OFF
    45.     $engine->ParseNavigation();
    46.     $template->run();
    47. }
    48.  
    49.  
    50.  
    51. //footer
    52. if($engine->page_info['footer_script'])
    53. {
    54.     include($root_path . 'sources/modules/' . $engine->page_info['footer_script'] . '.php'); //DEBUG_MODE_OFF
    55. }
    56. exit();
    57.  
    58. ?>
    Вот index.php , ошибку выдает на строчке
    Код (Text):
    1.  
    2.     goto('/');
     
  15. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    переименовать функцию гоуту в какой-нибудь редиректту
     
  16. sergeior

    sergeior Новичок

    С нами с:
    20 мар 2015
    Сообщения:
    7
    Симпатии:
    0
    Подробнее можно?
     
  17. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    У вас где-то должна быть функция
    Код (Text):
    1.  
    2. function goto($s) {
    3.   /* какой-то там код */
    4. }
    До php 5.3 оператора goto в php не существовало, поэтому этот код успешно работал. Начиная с 5.3 goto - это оператор безусловного перехода, поэтому функция так называться теперь не может. Выход - переименовать её в, к примеру, redirect_to, плюс найти все её упоминания и заменить имя в вызове так же
     
  18. sergeior

    sergeior Новичок

    С нами с:
    20 мар 2015
    Сообщения:
    7
    Симпатии:
    0
    Спасибо , помогло