Реклама 







Программирование на PHP ::..::..::
Приложение 0. Переход от PHP/FI 2.0 к PHP 3.0

Несовместимость в 3.0


PHP 3.0 полностью изменен. Его лексический анализатор стал намного более логичным и последовательным чем 2.0; версия 3.0 быстрее, и использует меньше ресурсов. Однако, некоторые усовершенствования повлекли частичную несовместимость в синтаксисе и функциональных возможностях.

Кроме того, в PHP 3.0 улучшен синтаксис и семантика, что также повлекло некоторую несовместимость. Однако, мы надеемся, что все эти усовершенствования к лучшему.

Эта глава поможет вам решить проблемы связанные с несовместимостью при переходе от PHP/FI 2.0 к PHP 3.0. Новые возможности здесь не рассматриваются.

Существует программа, которая может автоматически конвертировать старый PHP/FI 2.0 скрипт; вы можете найти ее в подкаталоге convertor дистрибутива PHP 3.0. Эта программа только отслеживает изменения синтаксиса, поэтому, в любом случае, вам придется прочитать эту главу внимательно.

Открывающий и закрывающий тэги

Первое, что вы вероятно заметите - это то что открывающий и закрывающий тэги PHP изменены. Старая <?> форма была заменена тремя новыми возможными формами:

Пример 0-1. Изменение: старые открывающий и закрывающий тэги: <? echo "This is PHP/FI 2.0 code.\n"; >

Начиная с версии 2.0, PHP/FI поддерживает также следующий формат:

Пример 0-2. Изменение: новые открывающий и закрывающий тэги, первый вариант: <? echo "This is PHP 3.0 code!\n"; ?>

Заметьте, что закрывающий тэг теперь состоит из знака вопроса и знака "больше" вместо только "больше". Однако, если Вы планируете использовать XML на вашем сервере, у вас будут проблемы с этим вариантом, так как PHP может попробовать исполнить разметку XML в документах XML как код PHP. Из-за этого, было внесено следующее изменение:

Пример 0-3. Изменение: новые тэги начала и конца, второй вариант: <?php echo "This is PHP 3.0 code!\n"; ?>

Из-за проблем с редакторами, не поддерживающими инструкции обработки (например Microsoft FrontPage), были введены следующие изменения:

Пример 0-4. Изменение: новые тэги начала и конца, третий вариант:
<script language="php">

  echo "This is PHP 3.0 code!\n";

</script>
Синтаксис операторов if..endif

"Альтернативный" способ описания блока if/elseif/else, с использованием, if(); elseif (); else; endif; не мог быть эффективно осуществлен без серьезного усложнения компилятора/интерпретатора, из-за этого его синтаксис был изменен:

Пример 0-5. Изменение: старый синтаксис if..endif:
if ($foo);
    echo "yep\n";
elseif ($bar);
    echo "almost\n";
else;
    echo "nope\n";
endif;
Пример 0-6. Изменение: новый синтаксис if..endif:
if ($foo):
    echo "yep\n";
elseif ($bar):
    echo "almost\n";
else:
    echo "nope\n";
endif;
Точки с запятой были заменены двоеточиями во всех операторах, за исключением завершающего блок (endif).

Синтаксис while

Точно так же как, с if..endif, был изменен синтаксис while..endwhile:

Пример 0-7. Изменения: старый, while..endwhile синтаксис:
while ($more_to_come);
    ...
endwhile;
Пример 0-8. Изменения: новый синтаксис while..endwhile:
while ($more_to_come):
    ...
endwhile;
Внимание!
Используя устаревший синтаксис в PHP 3.0 вы получите бесконечный цикл.

Типы выражений


В PHP/FI 2.0 использовалась левая часть выражения для определения типа результата. PHP 3.0 учитывает обе части выражения для определения типа результата; это может привести к неожиданным результатам работы скриптов 2.0.

Рассмотрите этот пример:
$a[0]=5;
$a[1]=7;

$key = key($a);
while ("" != $key) {
    echo "$keyn";
    next($a);
}
В PHP/FI 2.0 мы получили бы индексы $a. В PHP 3.0 мы не увидим ничего. Причина в том что в PHP 2.0, переменная в левой части выражения - строка; было выполнено сравнение, действительно "" не равно "0", и цикл был пройден. В PHP 3.0, при выполнении операции сравнения строковой и целочисленных переменных, строка будет преобразована в целое число и далее аргументы сравниваются как целые. Это означает в данном случае, что сравнивается значение функции atoi("") которое равно 0, и variablelist которое также равно 0; цикл не выполняется ни разу.

Исправить это достаточно просто. Замените начало на:

while ((string)$key != "") {

Изменены сообщения об ошибках

Сообщения об ошибках PHP 3.0, как правило, точнее чем в 2.0. Вместо указания фрагмента кода, вызвавший ошибку, вы получаете имя файла и номер строки.

Сокращенная операция вычисления логических выражений

В PHP 3.0 используется метод сокращенного вычисления логических выражений. Это означает что в выражении (1 || test_me()), функция test_me() не вызывается, так как результат функции уже не сможет изменить результат этого логического выражения.

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

Значения true/false, возвращаемые функциями

Большинство внутренних функции были переписаны; теперь они возвращают TRUE, в случае удачи и FALSE в противном случае, тогда как в PHP/FI 2.0 возвращаются 0 и -1 соответственно. Эти новые возможности позволяют создавать более логичный код, такой так $fp = fopen("/your/file") or fail("darn!");. Так как PHP/FI 2.0 не имел четких правил, относительно того, что должна вернуть функция в случае неудачи, в большинстве случаев скрипты использующие подобные функции должны быть проверены вручную после проверки конвертером.

Пример 0-9. Изменения 2.0: возвращаемые значения, старый код:
$fp = fopen($file, "r");
if ($fp == -1);
    echo("Could not open $file for reading<br>\n");
endif;
Пример 0-10. Изменения 2.0: возвращаемые значения, новый код:
$fp = @fopen($file, "r") or print("Could not open $file for reading<br>\n");

Прочие изменения
  • Модуль Apache в PHP 3.0 не поддерживает Apache версий до 1.2 - необходима версия Apache 1.2, или более поздняя.
  • echo() больше не поддерживает строку формата. Используйте printf().
  • В PHP/FI 2.0, вызов $foo[0] имел тот же эффект как и $foo. Это устранено в PHP 3.0.
  • Чтение массивов в виде $array[] больше не поддерживается

    То есть вы не можете читать массив в цикле, выполняющем $data = $array[]. Используйте current() и next().

    Кроме того, выражение $array1[] = $array2 не добавляет значения массива $array2 к $array1, но добавляет $array2 как последний элемент $array1. См. также поддержку многомерных массивов.
  • "+" Больше не используется как оператор сложения для строковых переменных, вместо этого они преобразовываются к целочисленным и выполняется операция сложения. Используйте ".".
Пример 0-11. Изменения 2.0: сложение для строковых переменных

echo "1" + "1";

В PHP 2.0 значение этого выражения - 11, а в PHP 3.0 - 2. Используйте вместо него:

echo "1"."1";
$a = 1;
$b = 1;
echo $a + $b;
Значение этого выражения = 2 для PHP 2.0 и 3.0.
$a = 1;
$b = 1;
echo $a.$b;
Это выражение вернет 11 в PHP 3.0.

Разместилл Razer


www.ACTIVNIY.narod.ru © 2oo4Design Idea by Razer © 2oo4
Меню

Программирование
Web-программирование
Гостевая книга
Фото галерея
Знакомства
Программы
Исходники
Учебники
Приколы
Баннеры
Новости
Опросы
Форум
Статьи
Игры
Чат
 
Программирование
Delphi
Visual Basic
Turbo Pascal
QBasic
C++
Java
 

Ссылки:


Hosted by uCoz