Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Котеров Д. В., Костарев А. Ф. - PHP 5. 2-е издание (В подлиннике) - 2008

.pdf
Скачиваний:
6114
Добавлен:
29.02.2016
Размер:
11.36 Mб
Скачать

154

Часть III. Основы языка PHP

Интерпретатор или компилятор?

Возможно, вы уже слышали, что PHP версий 4 и 5, в отличие от своих предшест-

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

интерпретирующими трансляторами, т. е. по своей главной функции — интерпре-

таторами. Так обстоит дело и с PHP версий 4 и 5.

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

Основные термины

Транслятор — это программа, которая переводит код с одного языка программирования на другой. Например, утилита, преобразующая исходный Pascal-код на C (бы-

вают и такие), — транслятор. Любую программу, которая принимает на свой вход

программу на некотором языке и выдает некоторое ее исполняемое представление (это не обязательно EXE-файл), называют транслятором. Примеры трансляторов — C, Pascal, Ассемблер, а также javac (транслятор Java; обратите внимание, не виртуальная машина Java, а именно утилита трансляции) и т. д.

Часто трансляторы называют компиляторами, хотя это и не совсем верно. Компилятор — это такой транслятор, который переводит программу на некотором языке программирования в машинный код.

Машинный код вы можете "увидеть", открыв в Блокноте любой EXE-файл. Если вы не увидите там японских иероглифов, отраженных зеркально, не расстраивайтесь — у машин еще все впереди.

Иными словами, подав на вход компилятору программу, мы на выходе получим готовый к исполнению EXE-файл. Если нет исполняемого файла на выходе, то это

уже не компилятор. Тем не менее путаница двух терминов — транслятор и компилятор — настолько распространена, что вам следует ее учитывать.

Интерпретатор — это программа, которая просматривает код на некотором языке

программирования и "выполняет" одну его инструкцию за другой. Интерпретатор

полностью контролирует процесс исполнения. Например, если он видит команду echo, он тут же выводит некоторый текст в выходной поток; если он видит — if (выражение), то вычисляет логическое выражение в скобках и переходит к следующей команде только в случае, если оно истинно. Интерпретаторами являются:

командный язык DOS (выполняющий BAT-файлы), оболочки Unix (shell), классический Basic, а также Perl, PHP, Java (виртуальная машина) и другие распространен-

ные в Web языки.

Одна и та же программа может быть одновременно и транслятором, и компилятором, объединяя в себе достоинства каждого из этих классов. Так устроены, напри-

мер, языки Perl и PHP.

Глава 8. Характеристика языка PHP

155

Как работает PHP

Давайте посмотрим, как работает PHP. Получая на свой вход исходный код про-

граммы, он в первую очередь анализирует его (в частности, проверяет синтаксис) и

транслирует в особое внутреннее представление. Оно выглядит как специальный

байт-код, который, конечно, невозможно прочитать глазами, но с которым в дальнейшем проще всего будет оперировать PHP. Вот эту-то фазу чаще всего и называют ошибочно компиляцией. Далее, PHP исполняет (интерпретирует) полученный байт-код. В этот момент он представляет собой классический интерпретатор.

Байт-код — это не то же самое, что машинный код. Машинный код может быть непосредственно исполнен процессором — это его "родной" язык. В то же время, байт-код — это просто последовательность байтов, которая "для глаза" выглядит месивом, но которую прекрасно "понимает" тот или иной программный интерпретатор.

Итак, мы видим, что PHP составлен из двух почти независимых блоков — трансля-

тора и интерпретатора. Зачем же понадобилось так делать? Конечно, из соображе-

ний быстродействия. Посудите сами: синтаксический разбор осуществляется всего один раз на этапе трансляции, а исполняется уже "полуфабрикат" — байт-код, который гораздо удобнее для этих целей.

В языке Java фазы трансляции и интерпретации полностью разделены: трансляцией в байт-код занимается утилита javac.exe, а исполнением полученного кода — программа java.exe (расширение EXE, конечно, специфично для Windows).

Пусть, например, в программе есть цикл с большим числом итераций. PHP версии 3, в котором отсутствует фаза трансляции, вынужден перед исполнением оче-

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

Язык Perl, который практически всегда называют компилятором, работает по аналогичной схеме — он транслирует текст программы во внутреннее представление, а затем использует результирующий код при исполнении. Так что, можно сказать, PHP представляет собой компилятор ровно настолько, насколько им является Perl.

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

внешнего файла, имя которого выясняется только на этапе исполнения программы — к примеру, вводится пользователем). В этом случае PHP просто пропускает их, "откладывая на потом", и транслирует, как только до них дойдет управление.

Конечно, это несколько замедляет выполнение программы, но если подобных кон-

156

Часть III. Основы языка PHP

струкций в ней немного (и они не вставлены в цикл с большим количеством итера-

ций), замедление не так уж и существенно.

Как вы видите, PHP версий 4 и 5 коренным образом отличается от своего предшественника — PHP версии 3. Фактически, весь код программы в очередной раз был переписан заново. При этом возникла серьезная проблема с переносимостью программ: не так-то легко обеспечить совместимость классического интерпретатора с новым транслирующим блоком (вообще, трансляторы по своей природе ограничивают свободу действий, зато привносят быстродействие). Тем не менее разработчики PHP блестяще справились с проблемой: практически любая программа, работающая на PHP версии 3 и не использующая недокументированных возможностей языка, будет работать и на старших версиях.

Что же такое PHP? Как мы выяснили, уж точно не компилятор, т. к. не имеет ни малейшего отношения к машинному коду. И, конечно же, не транслятор в чистом виде — ведь оттранслированный байт-код нельзя ни сохранить в файле, ни использовать повторно.

Правда, существует и платный транслятор с языка PHP: Zend Encoder. Он используется для повышения производительности скриптов, а также их шифрования (с целью защиты авторских прав). Ознакомиться с этой утилитой вы можете на сайте производителя — http://www.zend.com.

В то же время, главной фазой работы PHP является интерпретация внутреннего представления программы и ее исполнение. Именно эта фаза и занимает больше всего времени в серьезных сценариях. Итак, мы вынуждены заключить, что PHP является интерпретатором со встроенным блоком трансляции, оптимизирующим ход интерпретации.

Множество читателей, возможно, не согласятся с такой формулировкой. Конечно, слово "компилятор" звучит солиднее, чем какой-то там "интерпретирующий транслятор". Но все дело в том, что английское слово compiler переводится не только как "компилятор", но также и как "транслятор". Задумайтесь над этим, если окончательно решили для себя считать PHP и Perl компиляторами.

Достоинства и недостатки интерпретатора

Если вы — бывший системный или прикладной программист и не знакомы с языком Perl, довольно непросто будет привыкнуть к тому, что PHP, как и большинство языков для Web, является интерпретатором (правда, как мы уже говорили, с транслирующим оптимизатором).

Что ж, это так. Да, сценарии, написанные на PHP, работают в тысячи раз медленнее, чем C-программы (но почти с такой же скоростью, как созданные на Perl — может быть, отстают максимум в несколько раз на особо критических участках), и к

этому придется привыкнуть. Например, если мы напишем на C пустой цикл с миллионом итераций примерно такого вида:

for(long i=0; i<1000000; i++);

Глава 8. Характеристика языка PHP

157

то он будет работать всего долю секунды, в то время как аналогичный цикл на PHP:

for($i=0; $i<1000000; $i++);

проработает на эталонном процессоре Pentium 100 несколько секунд.

Приведенные оценки, особенно сравнения с Perl, касаются только PHP версий 4 и 5, но не версии 3. Последний отстает даже от Perl по быстродействию почти в 100 раз. Так что стоит задуматься, допустимо ли вообще применять PHP версии 3 при написании нетривиальных программ.

Однако для сценариев, не содержащих в себе громадных циклов (а таких программ,

как мы вскоре увидим, большинство), время работы будет отличаться очень несуще-

ственно. Ну, в самом деле, какая разница, работает ли сценарий 0,01 секунды или

0,1 секунды, если передача данных по каналам Интернета через модем будет длиться, например, 5 секунд?

Впрочем, тут все-таки есть стимул стараться по возможности ускорить сценарий: если на вашей машине размещены сотни виртуальных хостов, способных работать с PHP, и каждый из них весьма популярен у пользователей Интернета, то суммарный проигрыш в быстродействии может быть вполне ощутим. В этом случае придется просто отказаться от PHP и перейти на более быстрый (но и более сложный) язык — например, C или Java.

PHP è ÑÓÁÄ

"А как же быть, — спросят некоторые, — если нам нужно написать сценарий для работы, скажем, с тысячами и десятками тысяч пользователей, адреса и телефоны которых хранятся в файле? Ведь, чтобы найти какого-то пользователя (особенно если его имя задано не точно), придется просматривать их всех, а это как раз и будет цикл с огромным количеством итераций?" Да, это действительно так. Если нуж-

но обрабатывать очень большие массивы данных, лучше использовать C или... систему управления базами данных (СУБД).

СУБД — это программа, которая поддерживает работу с набором очень большого

количества записей с одинаковой структурой. Этот набор называют базой данных (БД). Обычно СУБД пишется на C и оптимизируется очень тщательно. Примеры систем управления базами данных — СУБД MySQL, PostgreSQL, Microsoft SQL

Server и т. д.

PHP поддерживает работу с очень большим числом разнообразных СУБД, поэтому

написание сценариев с применением баз данных не должно вызвать особых проблем. Кстати, и выполняться такие скрипты будут быстрее, чем аналогичные им "самодельные", написанные на C — ведь разработкой систем управления базами данных и эффективных алгоритмов работы с ними занималось множество людей. А в PHP останется лишь вызвать нужную функцию (например, поиск в базе дан-

ных) и сразу получить результат — многие базы данных даже умеют нужным образом его отсортировать и вообще выполняют всю "грязную работу"...

158

Часть III. Основы языка PHP

Интерпретатор и компилятор

У интерпретатора есть и другие преимущества перед классическим компилятором,

например, перед C. Вот некоторые из них.

Упрощается обнаружение ошибок во время выполнения программы. В случае сбоя интерпретатор сразу же выведет сообщение, что именно и где произошло не так.

Можно не заботиться об освобождении выделенной памяти. Интерпретатор сам

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

Существует возможность написать программу, которая будет формировать и тут

же исполнять другую программу, что очень часто практикуется при шаблонной

системе организации скриптов. В частности, мы можем формировать идентифи-

каторы во время исполнения программы, создавать массивы анонимных функ-

ций и т. д.

Не нужно думать о типах переменных (как это, кстати, было сделано в приведенном цикле for). Мы еще вернемся к данному вопросу позднее.

Есть и другие достоинства. Вообще, использование интерпретатора способно дать

сценариям ту мощь, которую пользователи Web от них и ожидают.

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

Проигрыш особенно заметен в случае больших и сложных циклов, при обработке

большого количества строк и т. д. Однако заметьте, это единственный недостаток PHP, который будет все меньше и меньше проявляться по мере выхода более мощных процессоров, чтобы в конце концов вообще сойти на нет.

PHP версии 5

До сих пор мы в основном подчеркивали различия между PHP версий 3 и 4. Это

объясняется тем, что они отличаются друг от друга значительно сильнее, чем PHP версий 4 и 5.

Что хорошего можно сказать о пятой версии? Конечно, прежде всего, еще немного возросла скорость работы. Этим мы обязаны переходу на новое ядро системы — Zend Engine 2. Но главная причина смены номера версии с 4 на 5 — это существенное улучшение объектно-ориентированных возможностей PHP и встраивание в ядро

интерпретатора двух мощных библиотек: СУБД SQLite (в данной книге не рассматривается) и модуля для работы с XML (ему посвящена часть VI книги).

PHP версии 5 совместим с PHP 4 значительно лучше, чем PHP 4 с PHP 3. Это значит, что программы, разрабатывающиеся в расчете на PHP версии 4, с высокой вероятностью заработают на PHP 5 без всяких изменений. Единственный возможный камень преткновения — это изменение механизма работы ссылок на объекты. Мы

обязательно остановимся на этом вопросе в гл. 32, посвященной объектно-ориен- тированному программированию.

Глава 8. Характеристика языка PHP

159

Пример PHP-программы

Традиционно, любая книга начинается с программы "Hello, world!". Что ж, не будем

отходить от этих канонов и приведем сразу два примера такой программы. Вот первый из них:

<?php

echo "Hello world!";

?>

PHP-сценарий по своей природе несколько отличается от обычных CGI-сценариев,

которые мы рассматривали в части I. Следующий пример поставит все точки над

"i". Для тех, кто еще не сталкивался с синтаксисом PHP, он будет особенно интересен. Вот как выглядит второй пример программы на PHP:

<body>

Hello world!

</body>

Да-да, вы не ошиблись — тут действительно нет вообще никаких операторов PHP, и содержимое файла с "программой" состоит целиком из статического текста. Что же происходит? Получается, что обычный HTML-текст также правильно обрабатывается PHP? Да, это так. Но рассмотрим чуть более сложный пример (листинг 8.1).

Листинг 8.1. Файл sq.php

<!-- Простейший PHP-сценарий. --> <html><body> <h1>Здравствуйте!</h1>

<?php

//Вычисляем текущую дату в формате "день.месяц год" $dat = date("d.m y");

//Вычисляем текущее время

$tm = date("h:i:s");

# Выводим их

echo "Текущая дата: $dat года<br>\n"; echo "Текущее время: $tm<br>\n";

# Выводим цифры

echo "А вот квадраты и кубы первых 5 натуральных чисел:<br>\n"; for ($i=1; $i<=5; $i++) {

echo "<li>$i в квадрате = " . ($i*$i); echo ", $i в кубе = " . ($i*$i*$i) . "\n";

}

?>

</body></html>

Вероятно, синтаксис любого языка программирования гораздо легче "почувствовать" на примерах, нежели использовать какие-то диаграммы и схемы. Мы будем придер-

живаться этого принципа на протяжении всей книги. Что ж, приступим к разбору программы.

160

Часть III. Основы языка PHP

Начало сценария, если бы не был представлен второй пример, может озадачить: раз-

ве это сценарий? Откуда HTML-теги <html> и <body>? Вот тут-то и кроется главная особенность (кстати, чрезвычайно удобная) языка PHP: PHP-скрипт может вообще не отличаться от обычного HTML-документа, как мы это уже заметили ранее.

А помните, как мы раньше в примерах на C писали много одинаковых функций printf() для того, чтобы выводить HTML-код страницы? На PHP это можно делать

естественным образом, без всяких операторов. Иными словами, все, что расположено в нашем примере до начала PHP-кода, отображается непосредственно, как будто

при помощи нескольких вызовов printf() в C.

Идем дальше. Вы, наверное, догадались, что сам код сценария начинается после открывающего тега <? и заканчивается закрывающим ?>. Итак, между этими двумя тегами текст интерпретируется как программа, и в HTML-документ не попадает. Если же программе нужно что-то вывести, она должна воспользоваться оператором echo (это не функция, а конструкция языка: ведь, в конце концов, если это функция, то где же скобки?). Мы подробно рассмотрим ее работу в дальнейшем. Итак, PHP устроен так,

что любой текст, который расположен вне программных блоков, ограниченных <? и ?>, выводится в браузер непосредственно, т. е. воспринимается, как вызов оператора echo (последняя аналогия очень точна, и мы остановимся на ней чуть позже).

Нетрудно догадаться, что часть строки после // является комментарием и на программу никак не влияет. Однострочные комментарии также можно предварять символом # вместо //, как мы можем это увидеть в примере. Комментарии еще бывают и такие:

/*

это комментарий

...и еще одна строка

*/

То есть, комментарии могут, как и в C, быть однострочными и многострочными. Однако в некоторых реализациях PHP многострочные комментарии почему-то вступают в конфликт с "русскими" буквами, которые могут находиться между ними.

Аименно, появляются бессмысленные сообщения о синтаксических ошибках, при-

чем совершенно не в том месте. Почему так происходит, неясно: видимо, ошибка

в PHP. Насчет комментариев и контроля ошибок мы еще поговорим, а пока вот вам

совет: никогда не пользуйтесь многострочными комментариями в PHP, если хотите

жить долго и счастливо (тем более, что не допускаются вложенные многострочные

комментарии).

Апока давайте лучше посмотрим, что происходит дальше. Вот строка:

$dat = date("d.m y");

Делает она следующее: переменной с именем $dat (заметьте, что абсолютно все пере-

менные в PHP должны начинаться со знака $, потому что "так проще для интерпретации") присваивается значение, которое вернула функция date(). Итак, мы видим, что в PHP, во-первых, нет необходимости явно описывать переменные (как это де-

лается, например, в программах на Pascal или C), а во-вторых, нигде не указывается

их тип (строка, число и т. д.). Интерпретатор сам решает, что, где и какого типа.

А насчет функции date()... Можно заметить, что у нее задается один параметр, ко-

Глава 8. Характеристика языка PHP

161

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

вида "11.07 04".

В конце каждого оператора должна стоять точка с запятой (;), как в C. Заметьте — именно как в C, а не как в Pascal. Иными словами, вы обязаны ставить точку с запятой перед else в конструкции if-else, но не должны после заголовка функции.

На следующей строке мы опять видим комментарии, а дальше — еще один оператор, похожий на ранее описанный. Он присваивает переменной $tm текущее время в формате "часы:минуты:секунды", опять же при помощи вызова date(). Все воз-

можности этой полезной функции будут подробно описаны в части IV.

Далее следуют операторы echo, выводящие текстовые строки, а также дату и время. Рассмотрим один из них:

echo "Текущая дата: $dat года<br>\n";

Заметьте: то, что любая переменная должна начинаться с символа $, позволяет интерпретатору вставить ее прямо в строку символов на место $dat (конечно, в любую строку, а не только в параметры echo). Разумеется, можно было бы написать и так

(поскольку конструкция echo не ограничена по числу параметров): echo "Текущая дата: ",$dat," года<br>\n";

или даже так:

echo "Текущая дата: ".$dat." года<br>\n";

т. к. для слияния строк используется операция "." (к этому придется пока привык-

нуть).

Кстати, на вопрос, почему для конкатенации строк применяется точка (.), а не, скажем, плюс (+), довольно легко ответить примером:

$a = "100";

$b = "200";

echo $a + $b; // выведет "300"

echo $a . $b; // выведет "100200"

Итак, мы видим, что плюс используется именно как числовой оператор, а точка — как строковой. Все нюансы применения операторов мы рассмотрим в следующей главе.

Еще один пример "внедрения" переменных непосредственно в строку:

$path = "c:/windows"; $name = "win"; $ext = "com";

$fullPath = "$path/$name.$ext";

Последнее выглядит явно изящнее, чем:

$path = "c:/windows"; $name = "win"; $ext = "com"; $fullPath = $path . "/" . $name . "." . $ext;

В терминах языка Perl можно сказать, что переменные в строках, заключенных в кавычки, интерполируются, т. е. расширяются. Существует и другой способ представления строк в PHP — это строки в апострофах, и в них переменные не интерполируются.

162

Часть III. Основы языка PHP

Ну вот, мы почти подобрались к сердцу нашего сценария — "уникальному" алгорит-

му поиска квадратов и кубов первых 5 натуральных чисел. Выглядит он так:

for ($i=1; $i<=5; $i++) {

echo "<li>$i в квадрате = " . ($i*$i); echo ", $i в кубе = " . ($i*$i*$i) . "\n";

}

В первой строке находится определение цикла for (счетчик $i, которому присваива-

ется начальное значение 1, инкрементируется на единицу на каждом шаге, пока не

достигнет шести). Затем следует блок, выполняющий вывод одной пары "квадраткуб". Мы намеренно сделали вывод в две строки, а не в одну, чтобы показать, что в PHP применяются те же самые правила группировки операторов, что и в C. А именно: несколько операторов можно сделать одним сложным оператором, заключив их в фигурные скобки, как это сделано выше.

Наконец, после всего этого расположен закрывающий тег PHP ?>, а дальше — опять обычные HTML-теги, завершающие нашу страничку.

Вот какой HTML-код получился в результате работы нашего сценария:

<!-- Простейший PHP-сценарий. --> <html><body> <h1>Здравствуйте!</h1>

Текущая дата: 20.07 04 года<br> Текущее время: 10:00:32<br>

А вот квадраты и кубы первых 5 натуральных чисел:<br> <li>1 в квадрате = 1, 1 в кубе = 1

<li>2 в квадрате = 4, 2 в кубе = 8 <li>3 в квадрате = 9, 3 в кубе = 27 <li>4 в квадрате = 16, 4 в кубе = 64 <li>5 в квадрате = 25, 5 в кубе = 125 </body></html>

Как видите, выходные данные сценария скомбинировались с текстом, расположенным вне скобок <? и ?>. В этом-то и заключена основная сила PHP: в легком встраивании кода в тело документа.

Ограничительные теги <?...?>, <?php...?> и даже <%...%>, как правило, обозначают одно и то же. Однако учтите, что для работоспособности "сокращенных" тегов

<?...?> необходимо включение опции short_open_tag в конфигурационном файле

PHP php.ini (по умолчанию включена), а для конструкции <%...%> — настройки asp_tags (по умолчанию выключена).

Если вы используете XML-вставки в код сценария, которые выглядят так: <?xml...?>, убедитесь, что директива short_open_tag установлена в Off, иначе PHP будет трактовать слово xml как начало PHP-программы и выдавать ошибку ("Parse error").

Глава 8. Характеристика языка PHP

163

Использование PHP в Web

Пока мы с вами теоретически разобрали работу сценария на PHP. Давайте же нако-

нец займемся практикой. Но сначала поговорим вот о чем.

Итак, PHP — язык, который позволяет встраивать в код программы "куски" HTMLкода. Мы можем использовать его для написания CGI-сценариев и избавиться от множества неудобных операторов вывода текста. Не так ли?

Посмотрим. Вот другое утверждение. PHP — язык (надстройка над HTML), который позволяет встраивать программный код в HTML-документы. Мы можем привлекать

его для формирования HTML-документов и избавиться от множества вызовов

внешних сценариев.

Вы озадачены — какое же из утверждений (в чем-то противоречивых, кстати) верно? Это хорошо: значит, мы достигли цели. Мы с вами только что избежали одной из

самых популярных ошибок начинающих программировать на PHP людей — считать

единственно верным только первое или только второе утверждение. В действительности PHP представляет собой язык, в котором в одних ситуациях следует придерживаться одного, а в остальных — другого соглашения.

Если вы думаете, что все это лишь игра слов, и "хоть горшком назови, только в печь не ставь", то ошибаетесь. Дело в том, что затронутая тема почти вплотную стыкуется с идеологией отделения кода сценария от дизайна страницы — идеей очень важной, особенно при работе нескольких человек над одним проектом, и довольно нетривиальной самой по себе. Мы очень подробно рассмотрим ее в части V, которая посвящена методам программирования на PHP.

Ну что, стало понятнее? Давайте пока будем рассматривать все наши примеры так,

как будто они подходят под второе утверждение (хотя в последнем примере — по-

ложа руку на сердце — больше программного кода, чем HTML-тегов). Итак, программа, показанная в листинге 8.1, представляет собой HTML-страницу с "вкрап-

ленным" кодом на PHP. А раз так, то назовем ее, например, simple.php и расположим в каталоге для документов на Web-сервере. Теперь с точки зрения Web-

пользователя она — просто страница.

Для иллюстрации примеров здесь и далее мы будем использовать локальный сервер Apache для платформы Win32, установка которого подробно описана в части II. Примеры мы располагали на хосте localhost в его корневом каталоге (каталог Z:/home /localhost/www). Конечно, это ни в коей мере не означает, что примеры будут работать только под Windows-версией PHP. Язык PHP задумывался как платформенно-неза- висимый, поэтому, если вы не задействуете в сценарии особенностей той или иной операционной системы, он будет одинаково хорошо (или одинаково плохо) работать в любой системе — будь то Unix у хостинг-провайдера или Windows дома.

Рис. 8.1 является иллюстрацией открытого в браузере примера

Обратите внимание на URL в строке браузера (http://src.original.book/basics/sq.php;

он может выглядеть и так: http://localhost/basics/sq.php — все зависит от того, на

Тут вы можете оставить комментарий к выбранному абзацу или сообщить об ошибке.

Оставленные комментарии видны всем.