Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
5 семестр / Инструм.средства / ЛЕКЦИИ / Лекция №4 Общие понятия и описание PHP.doc
Скачиваний:
53
Добавлен:
17.02.2016
Размер:
186.88 Кб
Скачать

Общие понятия и описание PHP

Для начала познакомимся с самим PHP. Язык программирования PHP специально предназначен для работы в Интернет, сочетающий достоинства языков С и Perl. Синтаксис языка очень сильно напоминает С — если вы программируете на С, то скоро вы это заметите.

В официальной документации язык PHP подается как server-side HTML-embedded scripting language, то есть, как встраиваемый в HTML скриптовый язык с обработкой на сервере. Это позволяет сразу же иметь ввиду следующее:

* Обработка PHP-кода производится на стороне сервера еще до того, как Web-страница будет передана браузеру. Это, кстати, отличает язык PHP от языка JavaScript.

* PHP-код может быть неспоредственно встроен в HTML-код страницы. Этим он отличается от Perl и отличается в лучшую сторону.

Мы знаем, что языки программирования бывают двух видов: интерпретаторы и компиляторы. Чем же является PHP? Чтобы выяснить это, нам нужно разобраться в терминологии. Программа, переводящая код, написанный на одном языке программирования, на другой называется транслятором. Например, программа р2с, которая переводит Pascal-код в С-код, является транслятором. Компилятор — это тоже транслятор. Он переводит код, написанный на языке высокого уровня, в машинный код. Язык высокого уровня понятен человеку и близок к человеческому (Pascal, С, PHP), а машинный код (0 и 1) понятен компьютеру — с двоичными данными компьютеру проще работать. В результате работы компилятора, как правило, создается двоичный исполняемый файл (в Windows/DOS — с расширением .ехе или .com), который можно выполнять без помощи компилятора.

Интерпретатор — это совершенно другой тип языка программирования, не имеющий ничего общего с компилятором. Интерпретатор ничего не переводит, а только исполняет код. Он анализирует код программы и исполняет каждую ее строчку. Например, предположим, что интерпретатор нашел строку «А = А + 7». Он анализирует и проверяет ее корректность, а затем ищет переменную А. Если переменная была объявлена до строки «А = А + 7», то интерпретатор увеличивает ее значение на 7 — он выполняет код. Была бы вместо строки «А = А + 7» строка print "Hello", наш интерпретатор вывел бы на экран строку «Hello». Выполнив код, интерпретатор не создает исполняемый файл, поэтому для следующего запуска вашего кода опять нужен интерпретатор.

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

PHP не является ни компилятором, ни интерпретатором. PHP представляет собою что-то среднее, между компилятором и интерпретатором. Рассмотрим, как PHP обрабатывает сценарии. На вход PHP подается сценарий. Он переводит (транслирует) его в специальный байт-код (внутреннее представление). Затем PHP выполняет байт-код (а не код самой программы!), при этом он не создает исполняемый файл. Байт-код значительно компактнее обыкновенного кода программы, поэтому его легче (и быстрее) интерпретировать (выполнять). Как видите, PHP больше является интерпретатором, нежели компилятором. Для чего нужна была такая двойная работа -- сначала переводить во внутреннее представление, а потом — выполнять? Неужели не проще сразу выполнить каждую строку программы!

Вдумайтесь в это выражение «каждую строку программы». Представим, что у нас есть цикл:

for (1=0;1<10;1++)

{

оператор_1;

...

оператор_100;

}

Наш цикл будет «крутиться» не бесконечно, а всего лишь десять раз. За каждый из этих десять проходов интерпретатор должен проанализировать и выполнить СТО строк кода. Итого ему нужно проанализировать и выполнить (я не зря дважды упоминаю эту фразу) 10x100 = 1000 строк кода. Если перевести один раз весь цикл в байт-код, то анализировать ему придется в 10 раз меньше! А это значит, что ваши сценарии будут выполняться в 10 раз быстрее.

Выходит, что PHP является транслирующим интерпретатором или интерпретирующим транслятором — как кому больше нравится. Стоит отметить, что PHP версии 3 был «чистым» интерпретатором, и только с появлением четвертой версии сценарии стали выполняться значительно быстрее. Пятая версия, как и четвертая, является интерпретирующим транслятором.

Однако, чтобы не делали разработчики PHP, откомпилированные двоичные исполняемые файлы работают значительно быстрее — в десятки, а может и в сотни раз. Но производительность PHP вполне достаточна для создания Интернет-приложений. Сейчас объясню почему.

Пусть вышеупомянутый цикл, переписанный на языке С, выполняется за 0.1 секунды. На языке PHP он будет выполняться в 10 раз дольше — за 1 секунду. Однако передача данных пользователю — результатов работы цикла — будет длиться 3 секунды. Получаем, соответственно, в сумме 3.1 и 4 секунды. Согласитесь, разница между 3.1 и 4 секунды незначительна — как пользователь Интернета вы даже ее не почувствуете. Даже если у вас быстрый выделенный канал, разница все равно не будет чувствоваться — может сказаться нагрузка на сервер или другие факторы, даже не зависящие от PHP.

Использование интерпретатора (а значит и PHP) имеет свои неоспоримые преимущества:

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

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

* Отладка программы и обнаружение ошибок существенно упрощаются — интерпретатор непременно сообщит вам, если что-то пошло не так.

* Вы можете написать программу, которая будет писать другую программу (да, это так), а потом включит в себя код только что написанной программы и выполнит его. Об этой возможности мы поговорим отдельно, когда наступит время.

Пишем первую программу (скрипт) на PHP

Согласно традиции, знакомство с любым языком программирования начинается с программы Hello, World! Эта программа ничего особого не делает, она только выводит на экран надпись «Hello World!». Мы сейчас немного отступим от традиции и напишем программу, которая будет здороваться не со всем миром (все равно этого никто не услышит), а только с нами. Текст программы приведен в листинге 1.

Листинг 1. Первая программа (скрипт) на PHP

echo "<html><bodyxhl>";

echo "Hello, $my_name";

echo "<hlx/body></html>";

?>

Прежде, чем запустить программу, ее нужно правильно «установить» на сервере. Для этого сохраните сценарий под именем first.php и скопируйте его в каталог DocumentRoot вашего сервера. Если вы работаете под Linux, таким каталогом будет /var/www/html (в старых версиях — /home/ httpd/html). Если вы работаете под Windows и следовали моим рекомендациям (см. гл. 4), каталогом DocumentRoot будет c:\www\html.

В отличие от обыкновенных CGI-программ, сценарии PHP являются для сервера обыкновенными документами и их не нужно помешать в каталог cgi-bin. Также не нужно делать их исполняемыми (в случае, если вы работаете под Linux).

Выполнив вышеуказанные рекомендации по установке, в строке браузера введите http://localhost/first.php?my_name=Denis. В результате в окне браузера вы увидите Hello, Denis (см. рис. 1).

Рис. 1. Первоя РНР-программа

Если теперь страницу, отображенную в браузере, просмотреть в виде HTML-кода, то можно увидеть следующее:

<html><body><nl>

Hello, Denis

</hl></body></html>

Как видите PHP-код выполнился, подставил нужное значение переменной $my__name и выдал готовую HTML-страницу.

Это мы PHP-сценарий запустили через CGI-интерфейс. При этом мы передали переменной $my_name значение Denis. Однако любую РНР-программу можно запустить так: php file.php. При этом CGI-переменные будут недоступны — ведь вы запустили программу из командной строки. Демонстрационные PHP-программы, не требующие CGI, в этой книге я буду запускать именно так.

Примечание. Вводить текст программы лучше в текстовом редакторе, поддерживающем подсветку синтаксиса PHP. Если вы работаете под Linux, могу порекомендовать три редактора: К Write (команда kwrite), Kate (kate) и Quanta (quanta). Под Windows также не составляет труда найти такой редактор (в Интернете). Если вы не найдете редактор с подсветкой синтаксиса PHP. можно использовать редактор с подсветкой синтаксиса языка С.

Теперь рассмотрим саму программу. Код PHP заключается в специальные теги . После тега начала сценария (echo. Оператор echo осуществляет вывод информации. Его с полной уверенностью можно назвать самым главным оператором — ведьбез него был бы невозможен вывод информации в браузер и пользователь не увидел бы результата работы сценария.

Выводимая оператором echo строка заключается в кавычки. Первый оператор выводит теги HTML, BODY и HI. В принципе, можно было бы и не выводить первые два тега, но нужно привыкнуть к дисциплине с самого начала.

Второй оператор echo "Hello, $my_name"; выводит слово Hello и значение переменной $my_name. Чтобы как-то отличать переменные от обыкновенных строк, перед именем переменной ставится знак доллара. И это касается не только строк, в любом случае перед именем переменной нужно ставить знак доллара. Знаю, что это непривычно, но вы довольно быстро привыкните к этому. Правда, поначалу вы будете допускать много «денежных» ошибок. Присваивание переменной какого-либо значения осуществляется оператором присваивания, который обозначается значком «=» (равно). Примеры использования переменных: $1 = 0; $d=7; $i=5 + $d// $1=12

Еще один пример:

$wordl = "Hello";

$word2 = "world";

echo "$wordl, $word2";

echo "$wordl, word2";

Первый оператор выведет в браузер строку «Hello, world», а второй — «Hello, word2». В этом примере мы определили две переменные — $wordl и $word2. Так как мы забыли дописать символ доллара во втором операторе, PHP воспринял «word2» как обыкновенную строку, а не как переменную.

Обратите внимание, что в нашем первом примере (first.php) мы не объявили переменную $my_name. Ее объявил автоматически сам PHP — ведь это параметр, переданный сценарию браузером. В этом заключается еще одно преимущество PHP перед другими языками программирования.

Вы когда-нибудь программировали на С или Pascal? Обращение к параметру, переданному программе, осуществляется по номеру, например, прочитать значение параметра номер 1 можно, вызвав функцию ParamStr(l), a не по имени. Ощущаете разницу? То есть, если мы программируем на Pascal или С, нам обязательно нужно знать номер параметра. Например, нам нужно передать программе два параметра — файл-источник и файл-назначение. Программа должна скопировать данные из источника в назначение. Если мы перепутаем порядок файлов, может произойти непоправимое — файл-источник будет перезаписан файлом-назначение. В PHP нам нет никакой разницы, как будут следовать параметры: src=filel&dest=file2 или dest=file2&src=filel (так передаются браузером параметры нашему сценарию). Очень удобно! И это не говоря уже о том, что PHP сам выполняет разбор переданной строки, объявляет и инициализирует переменные.

Третий оператор нашей программы в особых комментариях не нуждается, как и тег окончания РНР-программы (?>).

Модифицируем немного наш текст программы first.php, чтобы он выглядел так:

<?

echo "<html><body><hl>";

echo "Hello, $my_name";

echo "<br> $var";

echo "</hl></body></html>";

?>

Если мы не передадим программе параметр $var, то есть, как обычно, запустим программу только с параметром $my_name, то в окне браузера мы увидим сообщение о том, что переменная Svar не определена. Для того чтобы избавиться от этой ошибки, непосредственно перед оператором echo " $var"; добавьте строку: $var=" ";

Переменная будет объявлена и инициализирована. В PHP, как и в C++. вы можете объявлять переменные в любом месте сценария, но до места первого использования переменной. Как вы уже знаете, любой другой интерпретатор, например, Perl, в подобной ситуации сгенерировал бы сообщение 500: «Ошибка сценария». Интерпретатор PHP решает проблем} просто и элегантно, избавляя тем самым Web-программиста от просмотра многотомных журналов Web-сервера.

1.2. PHP-сценарии в теле HTML-документов 

Мы только что рассмотрели структуру PHP-программы, и можно бы.т бы перейти к рассмотрению переменных. Однако PHP-сценарии можн записывать и по-другому. Чтобы вы лишний раз не листали книгу, напомню текст сценария first.php:

<?

echo "<html><body><hl>";

echo "Hello, $my_name";

echo "</hl></body></html>" ;

?>

Этот же сценарий можно записать так:

<htmlxbody><hl>

<? echo "Hello, $my_name"; ?>

</hl></body></html><

Удивлены? Обыкновенный HTML-код корректно обрабатывается интерпретатором, поэтому у вас не будет ошибок при выполнении этого сценария.

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

<html><body>

<? if ($REMOTE_ADDR=="127.0.0.1") {?>

<hl>Добро пожаловать домой!</h1>

<Н1> Привет, гость ! </hi>

<? } ?>

</html></body>

Если IP-адрес удаленного компьютера равен 127.0.0.1, мы выводим HTML-код "<Н1>Добро пожаловать домой!" без использования оператора echo. В противном случае, мы выводим другое сообщение — "<Н1>Привет, гость!". Таким образом, теги <Н1> и воспринимаются и выводятся как обычный текст, а не как htmtl-теги заголовка.

Примечание. В приведенном примере был использован условный оператор if, который позволяет выполнять определенные условия в зависимости от истинности или ложности условия. После условия указывается действие, которое следует выполнять в случае его истинности, а после слова else — в случае ложности. Подробнее условный оператор будет рассмотрен далее.

При включении HTML-кода в ваши сценарии будьте внимательны, потому что легко запутаться. Вообще я рекомендую выводить HTML-код только с помощью echo.

1.3. Комментарии в рнр-сценариях

Очень немаловажный элемент любой программы — это комментарии. Комментарии в PHP могут быть трех типов:

# Это комментарий

// Это тоже комментарий

/*

А это

длинный многострочный комментарий

*/

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

2. Переменные и типы данных

Практически во всех языках программирования есть такое понятие, как переменная. Почему я употребил выражение «Практически во всех»? Существуют и такие языки, в которых нет переменных, как таковых. К счастью, PHP не относится к таким языкам — он самый обыкновенный язык, с точки зрения наличия переменных.

Переменная — это область оперативной памяти, доступ к которым осуществляется по имени. Все данные, с которыми работает программа, хранятся в виде переменных.

Правила задания переменных

Как уже отмечалось выше, в PHP обязательно перед именем переменной нужно ставить знак доллара — так интерпретатору легче выделит: переменные из «серой массы» текста программы.

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

Определим правила задания переменных в PHP:

* Имя переменной должно начинаться со знака доллара $.

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

* Имена переменных в PHP, как и в С, чувствительны к регистр) символов, то есть переменные $а и $А — это совершенно разные переменные.

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

При объявлении переменных можно не скупиться — объявляйте столько. сколько вам нужно. Привычные методы оптимизации, которые применялись 20 лет назад (например, чрезмерная экономия памяти — чем меньше переменных использует программа, тем лучше), во времена первых компьютеров, е сработают: ваша программа не будет работать быстрее, если вы будете в ущерб собственному комфорту использовать одну переменную вместо 5. К тому же можно наделать ошибок, которые очень трудно найти.

Типы данных

Переменные в PHP могут содержать все, что угодно — любую информацию. Исключение составляют только константы, которые могут содержать только число или строку.

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

Рассмотрим следующее объявление переменных: <dt>$а = 10;

$А = "Hello";

Как вы видите, при объявлении переменных мы не указали их тип. Выбор типа осуществляется самим интерпретатором. Однако иногда PHP может ошибиться и сопоставить переменной неправильный тип. Поэтому нужно задать тип явно. О том, как это сделать, мы поговорим чуть позже, а пока рассмотрим основные типы переменных (табл. 1).

Таблица 1. Типы переменных в PHP.

Тип переменной

Описание

integer

Целое число. Диапозон значений: от -2 147 483 648 до2 147 483 647 (32 бита).Данный тип соответствует типу long int в языке С

double

Вещественное число очень большой точности

string

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

array

Массив

object

Язык РНР поддерживает принцыпы объектно -орентированного програмирования, хотя и самые простые програмист может создовать свои объекты и использовать их в программе

bool

Логический тип данных. Переменные этого типа могут принемать только одно из двух значений: true(правда) false(ложь)

Функции определения и задания типа переменных

Язык PHP предоставляет много средств для определения типа переменных. Вы можете использовать целых семь функций для определения типа:

* is_int($x) или is_integer($x) — возвращает true, если переданная переменная — целое число.

* is_double($x) или is_float($x) — возвращает true, если переданная переменная — вещественное число.

* is_string($x) — возвращает true, если переданная переменная — строка.

* is_array($x) — возвращает true, если переданная переменная — массив.

* is_object($x) — возвращает true, если переменная является объектом.

* is_bool($x) — возвращает true, если переменная объявлена, как логическая.

* gettype(Sx) — возвращает строки, соответствующие типу переменной:integer, double, string, object, array, bool или unknown type, если невозможно определить тип (когда тип переменной не встраивается в PHP, а добавляется с помощью модулей, расширяющих возможности языка).

Если PHP неправильно определил тип переменной, можно указать его явно. Для этого используется функция settype($x, Stype), где $type — это одна из строк, возвращаемых функцией gettype(). Например: settype($x,"double") ; Функция возвращает значение false, если невозможно привести тип переменной $х к указанному типу $type.

Логические переменные и их особенности в PHP

Наверное, вы заметили, что большинство функций для определения типа возвращают логическое значение true или false (все функции, кроме gettype()). Сейчас самое время поговорить о логических переменных и связанных с ними «подводными камнями».

В PHP истиной являются любое не равное нулю число, любая непустая строка, значение true. Значение false, пустая строка, нуль — это ложь. Для того, чтобы понять это проведем ряд экспериментов с логическими переменными. При этом мы немного забежим вперед и будем использовать условный оператор If. Однако, если вы знакомы с каким-либо алгоритмическим языком (Си, Паскаль и т.п), то без труда поймете мысл оператора. Тем более, что текст примеров сопровождается подробными комментариями. В противном случае вы можете вернуться к этому пункту позднее.

Итак, создайте сценарий logical.php:

<?

echo false;

echo true;

?>

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

В использовании логических переменных в PHP имеется еще одна особенность. Если в операторах сравнения (= =, !=, <,>) один тип являетсялогическим, то и второй таюке воспринимается, как логический. Модифицируем наш сценарий так:,

<?

$х=10;

if ($х==1) echo " Переменная равна 1\п";

if ($x==true) echo "Переменная равна True\n";

?>

В первой строке переменной $х было присвоено значение 10. Затем. $х сравнивается с 1 и если $х равно }, то выводится строка «Переменная равна 1». Затем значение переменной $х сравнивается со значением True. И если $х равно true, то выводится строка «Переменная равна True». Исходя из приведенного выше утверждения, должна быть выведенной только вторая строка. Так; оно и происходит.

Рассмотрим еще один пример:

<?

$х = 100;

$у = true;

echo "x= $x\n";.

echo "у= $у\п";

if ($x==$y) echo "X=Y";

?>

Вот здесь уж совсем смешная ситуация: сначала программа сообщает, что X = 100, Y = 1, а затем, что X = Y.