Вот такая ошибка : Parse error: syntax error, unexpected '(', expecting T_STRING in Z:\home\olivia\www\index.php on line 22 Сама строчка : goto ('/');
Не надо использовать GOTO. Никогда. Чай, не на ассемблере пишете, есть более разумные способы управления потоком выполнения.
А может когда-то php позволял использовать goto в качестве идентификатора функции, и этот код написан в те времена? Тогда функцию переименовать надо. Вроде как оператор он появился только в php 5.3, если мне память не изменяет. А вообще, я пользую goto, но очень редко. Когда с ним более компактно. А break и continue, которые, как известно, тот же goto, вообще постоянно.
Я что, не прав? break равнозначен goto с меткой сразу за циклом, continue - goto на метку перед закрытием блока цикла. Поэтому их многие объединяют в одну группу.
а цикл while равнозначен двум goto и одному if ))) так можно всё довести до абсурда (читай: до ассемблера). в двух словах критика GOTO выражается очень просто: «Хуй поймешь, в каком порядке выполняется этот код» я видел как неглупые люди защищали goto только потому, что не знали всех возможностей break.
Не прав. Не важно, как ты для себя это представляешь, это разные вещи. break никому не указывает на "метку сразу за циклом", break, который, кстати, в PHP еще и аргумент принимать может, сообщает пыхомашине, что: 1) Итерацию нужно прервать. 2) Цикл нужно остановить. 3) Переменные в области видимости выпилить. 4) Включая счетчик, если он был объявлен в теле цикла. 5) После освобождения ресурсов передать управление основному потоку выполнения. continue тоже никуда не "указывает". Оно сообщает пыхомашине, что: 1) Итерацию нужно прервать. 2) Сохранив контекст выполнения. 3) Инициировав новую итерацию с условием изменения итератора, описанного в теле цикла, если таковое было. 4) Проверив условие завершения цикла. Это не просто "слышь, прыгни на такую-то строку". Даже если ты для себя это представляешь иначе.
В первый раз слышу, что в php есть область видимости "блок". Знаю глобальные, знаю локальные, знаю члены классов. А вот реально, чтоб как в C переменная была локальна внутри блока (в цикле, к примеру), а при выходе - уничтожалась, такого не читал. И вроде никогда и не было. Добавлено спустя 17 минут 56 секунд: C: Код (Text): #include <stdio.h> int main() { int i; for (i = 0; i < 4; i++) { int j = i * 10; } printf("%d", j); /* Здесь будет ошибка компиляции */ } PHP: Код (Text): <?php for ($i = 0; $i < 4; $i++) { $j = $i * 10; } echo $j; // Спокойненько выведет 30
Ок, чертовы полурабочие области видимости. Но break и continue есть не только в пыхе, так что, по факту, написано все верно, но да, 3 и 4 пункт тут лесом конкретно в случае с PHP. И один хрен это не оправдывает использование GOTO нуникак. В JS тоже есть бряк и континью. А вот GOTO нет. И это прекрасно.
Ладно, чтоб закрыть тему. 3, 4,5 в C++ срабатывает в том числе и при выходе из блока по goto. По крайней мере у GCC. Добавлено спустя 4 минуты 33 секунды: К goto у меня отношение простое - если мне удобно его где-то использовать, то я это делаю. Почему бы нет. Если он у меня встретиться 1-2 раза за пару тысяч строк кода, ничего страшного в этом нет. Про break и continue я тоже читал, что не гоже их использовать, поскольку можно обойтись и без них зачастую. Как пример приводят что-то в этом роде: Код (PHP): /* Типа плохо */ while (cond1()) { if (cond2()) continue; // 10-15 строк кода } /* Типа хорошо */ while (cond1()) { if (!cond2()) { // 10-15 строк } } Я всегда пишу первый вариант, поскольку мне его легче читать
Аналогично. И деление на хорошо и плохо тут не катит. Как минимум, потому что кроме ифа бывает свитч, к примеру. Или бывает нужно пропустить итерации текущего и родительского цикла разом. Или брякнуть обоих. И тут соль еще в чем. Если ты встретил брейк или континью, то ты знаешь, в какой области оно действует и однозначно трактуешь их. Если ты встретил GOTO в чужом коде, то это ничерта не очевидная хрень, если дятел, который ее поставил, соскакивает на воооооооооооооон ту строку. Тебе приходится пытаться осмыслить логику его кода с учетом этих переходов. А где один, там и два. Где два, там и три. Или другой вариант, все было норм, но тут ты находишь помеченную строку посреди кода... Она никак не выпадает из контекста выполнения, но ты понимаешь, что все, что идет после нее, является еще и частью логики какого-то кода в другом месте. GOTO не аналог брейка и континью. Это, скорее, аналог процедур. Приходилось писать на убер-раннем бейсике, где вместо процедур были как раз GOTO-шечки. Наследие асма для управляемости кода. При том, что брейк и континью там тоже были. И с тех пор кочует оно по языкам. И, честно, с тех пор пока не было ни одной ситуации в жизни, когда GOTO был бы нужен. Вооообще ни одной.
Так и не понял как исправить свою ошибку ! Код (Text): <?php session_start(); //only for language support error_reporting(E_ALL); //DEBUG_MODE_OFF ini_set('display_errors', 'on'); //DEBUG_MODE_OFF define('VISIT_MODE', 0x000001); $root_path = rtrim($_SERVER['DOCUMENT_ROOT'], '/').'/'; define('ROOT_PATH', $root_path); $site_root_path = rtrim($_SERVER['DOCUMENT_ROOT'], '/').'/'; $acp_root_path = 'acp/'; require($root_path . 'sources/core/engine.php'); //DEBUG_MODE_OFF $engine->init_page_info(isset($_REQUEST['page'])?$_REQUEST['page']:'main'); //page not found if($engine->page_info==null) { goto('/'); } //header if($engine->page_info['header_script']) { include($root_path . 'sources/modules/' . $engine->page_info['header_script'] . '.php'); //DEBUG_MODE_OFF } //main if($engine->page_info['script'] && file_exists($root_path . 'sources/modules/' . $engine->page_info['script'] . '.php') ) { include($root_path . 'sources/modules/' . $engine->page_info['script'] . '.php'); //DEBUG_MODE_OFF $engine->ParseNavigation(); $template->run(); } else { include($root_path . 'sources/modules/template_text.php'); //DEBUG_MODE_OFF $engine->ParseNavigation(); $template->run(); } //footer if($engine->page_info['footer_script']) { include($root_path . 'sources/modules/' . $engine->page_info['footer_script'] . '.php'); //DEBUG_MODE_OFF } exit(); ?> Вот index.php , ошибку выдает на строчке Код (Text): goto('/');
У вас где-то должна быть функция Код (Text): function goto($s) { /* какой-то там код */ } До php 5.3 оператора goto в php не существовало, поэтому этот код успешно работал. Начиная с 5.3 goto - это оператор безусловного перехода, поэтому функция так называться теперь не может. Выход - переименовать её в, к примеру, redirect_to, плюс найти все её упоминания и заменить имя в вызове так же