Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lektsii_poslednyaya_versia_po_BD.doc
Скачиваний:
8
Добавлен:
01.03.2025
Размер:
3 Мб
Скачать
☆

Преимущества php

Главным фактором языка РНР является практичность. РНР должен предоставить программисту средства для быстрого и эффективного решения поставленных задач. Практический характер РНР обусловлен пятью важными характеристиками:

  • традиционностью;

  • простотой;

  • эффективностью;

  • безопасностью;

  • гибкостью.

Существует еще одна «характеристика», которая делает РНР особенно привлекательным: он распространяется бесплатно! Причем, с открытыми исходными кодами ( Open Source ).

Традиционность

Язык РНР будет казаться знакомым программистам, работающим в разных областях. Многие конструкции языка позаимствованы из Си, Perl.

Код РНР очень похож на тот, который встречается в типичных программах на С или Pascal. Это заметно снижает начальные усилия при изучении РНР. PHP — язык, сочетающий достоинства Perl и Си и специально нацеленный на работу в Интернете, язык с универсальным (правда, за некоторыми оговорками) и ясным синтаксисом.

И хотя PHP является довольно молодым языком, он обрел такую популярность среди web-программистов, что на данный момент является чуть ли не самым популярным языком для создания web-приложений (скриптов).

Простота

Сценарий РНР может состоять из 10 000 строк или из одной строки — все зависит от специфики вашей задачи. Вам не придется подгружать библиотеки, указывать специальные параметры компиляции или что-нибудь в этом роде. Механизм РНР просто начинает выполнять код после первой экранирующей последовательности (<?) и продолжает выполнение до того момента, когда он встретит парную экранирующую последовательность (?>). Если код имеет правильный синтаксис, он исполняется в точности так, как указал программист.

PHP — язык, который может быть встроен непосредственно в html -код страниц, которые, в свою очередь будут корректно обрабатываться PHP -интерпретатором. Мы можем использовать PHP для написания CGI-сценариев и избавиться от множества неудобных операторов вывода текста. Мы можем привлекать PHP для формирования HTML-документов, избавившись от множества вызовов внешних сценариев.

Большое разнообразие функций PHP избавят вас от написания многострочных пользовательских функций на C или Pascal .

Эффективность

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

Очень важное преимущество PHP заключается в его «движке». «Движок» PHP не является ни компилятором, ни интерпретатором. Он является транслирующим интерпретатором. Такое устройство «движка» PHP позволяет обрабатывать сценарии с достаточно высокой скоростью.

По некоторым оценкам, большинство PHP-сценариев (особенно не очень больших размеров) обрабатываются быстрее аналогичных им программ, написанных на Perl. Однако, чтобы не делали разработчики PHP, откомпилированные исполняемые файлы будут работать значительно быстрее – в десятки, а иногда и в сотни раз. Но производительность PHP вполне достаточна для создания вполне серьезных web-приложений. Подробно об устройстве и характеристиках «движка» PHP можно ознакомиться здесь.

Безопасность

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

1. Средства безопасности системного уровня

В РНР реализованы механизмы безопасности, находящиеся под управлением администраторов; при правильной настройке РНР это обеспечивает максимальную свободу действий и безопасность. РНР может работать в так называемом безопасном режиме (safe mode), который ограничивает возможности применения РНР пользователями по ряду важных показателей. Например, можно ограничить максимальное время выполнения и использование памяти (неконтролируемый расход памяти отрицательно влияет на быстродействие сервера). По аналогии с cgi-bin администратор также может устанавливать ограничения на каталоги, в которых пользователь может просматривать и исполнять сценарии РНР, а также использовать сценарии РНР для просмотра конфиденциальной информации на сервере (например, файла passwd).

2. Средства безопасности уровня приложения

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

Гибкость

Поскольку РНР является встраиваемым (embedded) языком, он отличается исключительной гибкостью по отношению к потребностям разработчика. Хотя РНР обычно рекомендуется использовать в сочетании с HTML, он с таким же успехом интегрируется и в JavaScript, WML, XML и другие языки. Кроме того, хорошо структурированные приложения РНР легко расширяются по мере необходимости (впрочем, это относится ко всем основным языкам программирования).

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

Поскольку РНР не содержит кода, ориентированного на конкретный web-сервер, пользователи не ограничиваются определенными серверами (возможно, незнакомыми для них). Apache, Microsoft IIS, Netscape Enterprise Server, Stronghold и Zeus — РНР работает на всех перечисленных серверах. Поскольку эти серверы работают на разных платформах, РНР в целом является платформенно-независимым языком и существует на таких платформах, как UNIX, Solaris, FreeBSD и Windows 95/98/NT/2000/XP/2003.

Наконец, средства РНР позволяют программисту работать с внешними компонентами, такими как Enterprise Java Beans или СОМ-объекты Win32. Благодаря этим новым возможностям РНР занимает достойное место среди современных технологий и обеспечивает масштабирование проектов до необходимых пределов.

Бесплатное распространение

Стратегия Open Source, и распространение исходных текстов программ в массах, оказало несомненно благотворное влияние на многие проекты, в первую очередь — Linux, хотя и успех проекта Apache сильно подкрепил позиции сторонников Open Source. Сказанное относится и к истории создания РНР, поскольку поддержка пользователей со всего мира оказалась очень важным фактором в развитии проекта РНР.

Принятие стратегии Open Source и бесплатное распространение исходных текстов РНР оказало неоценимую услугу пользователям. Вдобавок, отзывчивое сообщество пользователей РНР является своего рода «коллективной службой поддержки», и в популярных электронных конференциях можно найти ответы даже на самые сложные вопросы.

История развития PHP

PHP прошёл долгий путь за последние несколько лет, становясь одним из наиболее популярных языков web-разработки.

Истоки PHP лежат в старом продукте, имевшем название PHP/FI. PHP/FI был создан Расмусом Лердорфом в 1995 году и представлял собой набор Perl-скриптов для ведения статистики посещений его резюме. Развитие web еще только начиналось, никаких специальных средств для решения этих задач не было, и к автору хлынул поток сообщений с вопросами. Лердорф начал бесплатно раздавать свой инструментарий, названный «Personal Homepages Tools» (PHP) - («Инструменты для персональных домашних страниц»). Очень скоро потребовалась большая функциональность и Расмус пишет новую, намного более обширную версию на C, работающую с базами данных и позволяющую пользователям разрабатывать простейшие web-приложения. Расмус Лердорф решил выложить исходный код PHP/FI на всеобщее обозрение, исправление ошибок и дополнение.

PHP/FI (Personal Home Page / Forms Interpreter - Персональная Домашняя страница / Интерпретатор Форм) включал в себя базовую функциональность сегодняшнего PHP. Он имел переменные в стиле Perl, автоматическую интерпретацию форм и возможность встраиваться в html-код. Собственно синтаксис языка имел много общего с Perl, хотя и был намного проще и ограниченнее.

В 1997 выходит PHP/FI 2.0. Вторая версия C-имплементации обозначила группу пользователей: несколько тысяч людей по всему миру, с примерно 50,000 доменами, что составляло около 1% всего числа доменов Интернета. Несмотря на то, что разработкой занималось уже несколько людей, PHP/FI 2.0 все еще оставался крупным проектом одного человека.

Официально PHP/FI 2.0 вышел только в ноябре 1997 года, после проведения большей части своей жизни в бета-версиях. Вскоре после выхода его заменили альфа-версии PHP 3.0.

PHP3

PHP 3.0 была первой версией, напоминающей PHP, каким мы знаем его сегодня. В 1997 году Энди Гутманс (Andi Gutmans) и Зив Сураски (Zeev Suraski) переписали код с начала: разработчики сочли PHP/FI 2.0 не пригодным для разработки приложения электронной коммерции, над которым они работали для проекта Университета. Для совместной работы над PHP 3.0 с помощью базы разработчиков PHP/FI 2.0 Энди, Расмус и Зив решили объединиться и объявить PHP 3.0 официальным преемником PHP/FI, разработка же PHP/FI была практически полностью прекращена.

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

Абсолютно новый язык программирования получил новое имя. Разработчики отказались от дополнения о персональном использовании, которое имелось в аббревиатуре PHP/FI. Язык был назван просто 'PHP' -- аббревиатура, содержащая рекурсивный акроним: 'PHP: Hypertext Preprocessor' (PHP: Препроцессор Гипертекста).

Первая статья о PHP была опубликована в чешском варианте 'Computerworld' весной 1998 и освещала PHP 3.0. Как и в случае с книгами, эта была первая в серии статья из множества посвященных PHP и опубликованных в различных известных журналах.

К концу 1998, PHP использовался десятками тысяч пользователей. Сотни тысяч web-сайтов сообщали о том, что они работают с использованием языка. В то время PHP 3.0 был установлен приблизительно на 10% серверах Интернета!

PHP 3.0 был официально выпущен в июне 1998 года после 9 месяцев публичного тестирования.

PHP4

К зиме 1998 года, практически сразу после официального выхода PHP 3.0, Энди Гутманс и Зив Сураски начали переработку ядра PHP. В задачи входило увеличение производительности сложных приложений и улучшение модульности базиса кода PHP. Расширения дали PHP 3.0 возможность успешно работать с набором баз данных и поддерживать большое количество различных API и протоколов, но PHP 3.0 не имел качественной поддержки модулей и приложения работали не эффективно.

Новый движок, названный 'Zend Engine' (www.zend.com) (от имен создателей: Zeev и Andi), успешно справлялся с поставленными задачами и впервые был представлен в середине 1999 года. PHP 4.0, основанный на этом движке и принесший с собой набор дополнительных функций, официально вышел в мае 2000 года, почти через два года после выхода своего предшественника PHP 3.0. В дополнение к улучшению производительности, PHP 4.0 имел еще несколько ключевых нововведений, таких как поддержка сессий, буферизация вывода, более безопасные способы обработки вводимой пользователем информации и несколько новых языковых конструкций.

Сегодня PHP используется сотнями тысяч разработчиков. Миллионы (!) сайтов сообщают о работе с PHP. Эти, а также многие другие факты, позволяют с уверенностью сказать, что PHP является одним из самых популярных языков web-программирования!

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

PHP5

Недавно вышла новая, пятая версия PHP (PHP5). PHP5 использует новую версию «движка» Zend – Zend Engine 2.

В PHP5 объектная модель была значительно переработана. При этом было добавлено много новых возможностей, благодаря которым PHP5 получил некоторые черты таких объектно-ориентированных языков, как C++ и Java.

Изменения коснулись производительности встроенных стандартных функций PHP. По некоторым оценкам, скорость работы стандартных функций в PHP5 увеличилась на 40% и более.

Появились новые директивы файла настройки php.ini .Претерпела изменения и поддержка потоков. Были добавлены новые функции, а также функции графической библиотеки GD.

Поддержка XML в версии PHP5 стала полной, поддерживаются новые расширения DOM и XML.

Подробную информацию о PHP5 можно узнать здесь.

Что нового в PHP5 ?

Не так давно вышла новая пятая версия PHP - PHP5. Рассмотрим основные изменения.

Новая объектная модель Zend 2.0

Zend 1.0, а также более ранние версии "движка" PHP, нерационально использовали память, поскольку объекты обрабатывались как примитивные типы (переменные, списки), то есть посредством копирования. В новой объектной модели, которая используется в Zend 2.0 используется технология объектных дескрипторов, напоминающая аналогичную технологию в Java. Теперь объекты доступны только через дескрипторы, позволяя экономить память и получать полный контроль над созданием и дублированием объектов. О новых возможностях объектно-ориентированного программирования в PHP5 вы можете ознакомиться в специальном разделе.

Улучшенная производительность

Zend Engine 2 использует новый менеджер памяти. Два главных его преимущества: улучшенная поддержка многопоточных сред (распределенные блоки не нуждаются во взаимных исключительных блокировках) и то, что после каждого запроса намного эффективнее освобождаются распределенные блоки памяти.

Изменение коснулись производительности встроенных функций PHP. По различным оценкам, увеличение производительности достигает 40%.

Новые директивы

В конфигурационном файле PHP - php.ini теперь доступны новые директивы:

  • session.hash_function - выбор функции хеширования сессий (SHA1 или MD5);

  • session.hash_bits_per_character - определяет, какое число бит в символе используется при хешировании сессий (от 4 до 6);

  • register_long_arrays - включает/отключает регистрацию длинных массивов;

  • mail.force_extra_parameters - дополнительные почтовые параметры;

  • zend.ze1_compatibility_mode - включение совместимости с Zend Engine 1 (PHP4).

Новые механизмы работы с потоками

  • Поддержка потоков претерпела множество изменений:

  • Более высокая производительность функций readfile(), fpassthru() и некоторых других стандартных функций для работы с потоками;

  • Новая функция stream_socket_client() - более мощный аналог сетевой функции fsockopen();

  • Новая функция stream_socket_accept() - принимает соединения клиента;

  • Новая функция stream_socket_get_name() - получает локальное или удаленное имя сокета;

  • Новая функция stream_copy_to_stream() - позволяет копировать поток в поток;

  • Новая функция, позволяющая читать информацию из потока до определенного символа или строки - stream_get_line();

  • Поддержка динамической загрузки OpenSSL;

  • Возможность работы функций opendir(), stat(), unlink() с FTP - соединениями.

Новы функции PHP5

В PHP5 включено достаточно большое количество новых функций:

Функции для работы с массивами (Array):

  • array_combine() - Создает массив, используя один массив для ключей и другой - для его значений;

  • array_diff_uassoc() - Вычисляет различие массивов с дополнительной индексной проверкой;

  • array_udiff() - Вычисляет различие массивов, используя функцию повторного вызова для сравнения данных;

  • array_udiff_assoc() - Вычисляет различие массивов с дополнительной индексной проверкой. Данные сравниваются с использованием функции повторного вызова;

  • array_udiff_uassoc() - Вычисляет различие массивов с дополнительной индексной проверкой. Данные сравниваются с использованием функции повторного вызова. Индексная проверка также сделана функцией повторного вызова;

  • array_walk_recursive() - Применяет пользовательскую функцию рекурсивно к каждому члену массива;

  • array_uintersect_assoc() - Вычисляет пересечение массивов с дополнительной индексной проверкой. Данные сравниваются, используя функцию повторного вызова;

  • array_uintersect_uassoc() - Вычисляет пересечение массивов с дополнительной индексной проверкой. И данные, и индексы сравниваются, используя функции повторного вызова;

  • array_uintersect() - Вычисляет пересечение массивов. Данные сравниваются, используя функцию повторного вызова;

Новые функции для работы с базой данных InterBase:

  • ibase_affected_rows() - Возвращает номер строк, которые затронул предыдущий запрос;

  • ibase_backup() - Запускает задачу резервирования в сервисном менеджере;

  • ibase_commit_ret() - Производит транзакцию без ее закрытия;

  • ibase_db_info() - Запрос статистика базы данных;

  • ibase_drop_db() - Удаляет базу данных;

  • ibase_errcode() - Возвращает код ошибки;

  • ibase_free_event_handler() - Отменяет зарегистрированный обработчик события;

  • ibase_gen_id() - Увеличивает значение генератора и возвращает его новое значение;

  • ibase_maintain_db() - Выполняет сервисную команду на сервере баз данных;

  • ibase_name_result() - Присваивает имя набору результатов;

  • ibase_num_params() - Возвращает число параметров в запросе;

  • ibase_param_info() - Возвращает информацию о параметре запроса;

  • ibase_restore() - Запускает задачу восстановления в сервисном менеджере;

  • ibase_rollback_ret() - Производит "обратную транзакцию", сохраняя контекст транзакции;

  • ibase_server_info() - Запрашивает статистику базы данных;

  • ibase_service_attach() - Осуществляет соединение с сервисным менеджером;

  • ibase_service_detach() - Разрывает соединение с сервисным менеджером;

  • ibase_set_event_handler() - Регистрирует функцию повторного вызова, которая будет вызвана, когда события будут зарегистрированы;

  • ibase_wait_event() - Ожидает события, которое будет зарегистрировано базой данных;

Функции расширения iconv:

  • iconv_mime_decode() - Декодирует поле заголовка MIME;

  • iconv_mime_decode_headers() - Декодирует множество поля заголовка MIME одновременно;

  • iconv_mime_encode() - Составляет поле заголовка MIME;

  • iconv_strlen() - Возвращает число символов строки;

  • iconv_strpos() - Находит позицию первого вхождения подстроки в строку;

  • iconv_strrpos() - Находит позицию последнего вхождения подстроки в строку;

  • iconv_substr() - Вырезает часть строки.

Функции для работы с потоками (Streams):

  • stream_copy_to_stream() - Копирование данных из одного потока, в другой;

  • stream_get_line() - Получает строку из ресурса;

  • stream_socket_accept() - Принимает соединение клиента на сокете, созданном stream_socket_server();

  • stream_socket_client() - Отрывает соединение посредством Internet или Unix сокетов;

  • stream_socket_get_name() - Возвращает имя локального или удаленного сокета;

  • stream_socket_recvfrom() - Получает данные из сокета, соединенного или нет;

  • stream_socket_sendto() - Посылает сообщение сокету, независимо, подключен он, или нет;

  • stream_socket_server() - Создает Internet или Unix сокет.

Функции, используемые для работы с датами и временем:

  • idate() - Форматирует местное время/дату как целое число;

  • date_sunset() - Время заката данного дня в зависимости от местоположения;

  • date_sunrise() - Время восхода данного дня в зависимости от местоположения;

  • time_nanosleep() - Задержка в секундах и наносекундах.

Функции для работы с строками (Strings):

  • str_split() - Преобразовывает строку в массив;

  • strpbrk() - Выполняет поиск строки с любым набором символов;

  • substr_compare() - Выполняет регистро-независимое сравнение двух строк, начиная со смещения, и до длины строки;

Прочие новые функции:

  • convert_uudecode() - Декодирует uuencoded - закодированную строку

  • convert_uuencode() - Кодирует по типу uuencoded;

  • curl_copy_handle() - Копирует дескриптор cURL;

  • dba_key_split() - Разбивает ключ на строковое представление в виде массива;

  • dbase_get_header_info() - Получает информацию о заголовке базы данных DBASE;

  • dbx_fetch_row() - Производит выборку строк из query_result, который имеет флаг DBX_RESULT_UNBUFFERED;

  • fbsql_set_password() - Изменяет пароль текущего пользователя базы данных fbsql;

  • file_put_contents() - Записывает строку в файл;

  • ftp_alloc() - Распределяет пространство для файла, который будет передан через FTP;

  • get_declared_interfaces() - Возвращает массив всех объявленных интерфейсов;

  • get_headers() - Получает все заголовки, посланные сервером в ответ на запрос HTTP;

  • headers_list() - Возвращает список посланных заголовков (или готовых к посылке);

  • http_build_query() - Генерирует URL-кодированную строку запроса;

  • image_type_to_extension() - Возвращает расширение файла графического типа, который был возвращен графическими функциями: getimagesize(), exif_read_data(), exif_thumbnail(), exif_imagetype();

  • imagefilter() - Функция, позволяющая применять к графическим изображениям различные фильтры;

  • imap_getacl() - Возвращает ACL для данного почтового ящика;

  • ldap_sasl_bind() - Связывает с каталогом LDAP, используя SASL;

  • mb_list_encodings() - Возвращает массив всех поддерживаемых кодировок;

  • pcntl_getpriority() - Возвращает приоритет любого процесса;

  • pcntl_wait() - Ожидает возврата состояния текущей дочерней ветви, определенного системным вызовом waitpid();

  • pg_version() - Возвращает массив с версиями клиента, протокола и сервера (когда доступно);

  • php_check_syntax() - Осуществляет проверку синтаксиса указанного PHP скрипта;

  • php_strip_whitespace() - Возвращает исходный код с разделенными комментариями и межстроковым пространством;

  • proc_nice() - Изменяет приоритет текущего процесса;

  • pspell_config_data_dir() - Изменяет месторасположение файлов лингвистической информации;

  • pspell_config_dict_dir() - Изменяет месторасположение основного списка слов;

  • setrawcookie() - Посылает cookies без кодирования URL-а;

  • snmp_read_mib() - Читает и производит парсинг MIB файла в активное MIB дерево;

  • sqlite_fetch_column_types() - Возвращает массив типов столбца конкретной таблицы;

Новые расширения

Расширение Tidy:

PHP 5 включает поддержку очень полезной библиотеки Tidy (http://tidy.sf.net/). Она позволяет разработчикам PHP разбирать, диагностировать, чистить и восстанавливать документы HTML. Расширение Tidy поддерживает как функциональный, так и объектно-ориентированный интерфейс, и ее API использует механизм исключений РНР 5.

Расширение Perl:

Хотя и не включенное по умолчанию в РНР 5, расширение Perl позволяет вам вызывать Perl-скрипты, использовать объекты Perl и использовать другие функциональные возможности Perl прямо из кода PHP. Это новое расширение можно найти в репозитории PECL http://pecl.php.net/package/perl/.

Расширение SQLite:

Поддержка SQLite (http://www.sqlite.org/) изначально была введена в PHP 4.3.x. Это встроенная библиотека SQL, которая не требует SQL сервера и очень подходит для приложений, которые не требуют масштабируемых SQL-серверов, или если вы разворачиваете свое приложение у провайдера, который не предоставляет вам доступ к SQL-серверу. Вопреки названию, SQLite очень богата возможностями и поддерживает транзакции, вложенные выборки, представления (view) и большие DB-файлы. Здесь это упомянуто, как возможность PHP 5, потому что поддержка SQLite была введена довольно в поздних релизах PHP 4, и поскольку PHP 5 предоставляет новый объектно-ориентированный интерфейс и поддерживает итераторы.

Новое расширение MySQLi (усовершенствованная MySQL):

В PHP 5 для MySQL AB (http://www.mysql.com/) было написано новое расширение MySQL, которое позволяет вам полностью использовать преимущества новых функциональных возможностей в MySQL 4.1 и более новых версий. В противовес старому расширению MySQL новое дает вам возможность использовать оба интерфейса: функциональный и объектно-ориентированный. Так что теперь у вас есть выбор что предпочесть. Новые возможности, поддерживаемые этим расширением, включают контроль транзакций, поддержку репликаций, SSL и многое другое...

Улучшенная поддержка XML в PHP5

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

Основы:

Поддержка XML в PHP 4 базировалась на разнообразных библиотеках XML. Поддержка SAX осуществлялась старой библиотекой Expat, для использования XSLT необходима была библиотека Sablotron, для DOM использовалась более мощная libxml2 - библиотека проекта GNOME.

Использование разнообразных сторонних библиотек не делало PHP 4 лучше других языков, когда дело касалось поддержки XML. Сопровождение библиотек расширений было слабое, новые стандарты XML не всегда поддерживались, производительность была не столь хороша, как была возможна, взаимодействия между различными расширениями XML не существовало.

В PHP 5 все расширения XML были переписаны, чтобы использовать отличный набор инструментов, предоставляемый libxml2 (http://www.xmlsoft.org/). Это библиотека богатая возможностями, отлично сопровождаемая и эффективно реализовавшая стандарты XML, предоставляющая передовые возможности технологии XML в PHP.

Все вышеупомянутые расширения (SAX, DOM и XSLT) теперь используют libxml2, включая новые дополнительные расширения - SimpleXML и SOAP.

SAX:

Как говорилось выше, новая реализация SAX переведена от использования Expat к libxml2. Хотя новое расширение должно быть совместимо, могут быть некоторые тонкие различия. Разработчики, которые хотят продолжать работать с библиотекой Expat, могут это сделать, конфигурируя и собирая PHP соответствующим образом (не рекомендовано).

DOM:

Хотя поддержка DOM в PHP 4 была также основана на библиотеке libxml2, она изобиловала ошибками, грешила утечками памяти, и API во многих случаях не соответствовал рекомендациям W3C. Расширение DOM было полностью переписано для PHP 5. Мало того, что расширение было коренным образом переписано, теперь оно соответствует рекомендациям W3C. Например, названия функций теперь используют нотацию studlyCaps (присваивание имен со смешанным употреблением заглавных и строчных букв) как предписано по стандарту W3C, облегчая для вас применение прочитанного в документации W3C в PHP. Кроме того, расширение DOM теперь поддерживает три вида схем для валидации XML документов - DTD, XML Schema и RelaxNG.

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

XSLT:

В PHP 4, было два расширения, которые поддерживали XSL-преобразования. Первое использовало Sablotron, а второе - поддержку XSLT в расширении DOM. В PHP 5 новое расширение XSL было основано на использовании libxml2. Так, в PHP 5 XSL-преобразование не принимает таблицу стилей XSLT в качестве параметра, но зависит от расширения DOM, чтобы загрузить ее. Таблица стилей может кэшироваться в памяти, и может быть применена ко многим документам для существенной экономии времени выполнения.

SimpleXML:

Вероятно, через год или два, оглянувшись назад, мы сможем сказать, что SimpleXML коренным образом изменил работу с XML-документами для PHP разработчиков. SimpleXML можно было бы действительно называть "XML для чайников". Вместо того, чтобы иметь дело с DOM или, что еще хуже, SAX, SimpleXML позволяет представить ваш XML-документ как родной объект PHP. Вы можете читать, писать или пробегаться по вашему XML-документу, с легкой непринужденностью получая доступ к элементам и атрибутам.

Рассмотрите следующий XML-документ:

<clients> <client>      <name>John Doe</name>      <account_number>87234838</account_number> </client> <client>      <name>Janet Smith</name>      <account_number>72384329</account_number> </client> </clients>

Следующий фрагмент кода печатает имя каждого клиента и номер его аккаунта:

<?php $clients = simplexml_load_file('clients.xml'); foreach ($clients->client as $client) {      print "$client->name has account number $client->account_number "; } ?>

Как видим, SimpleXML действительно прост.

А в случае, если есть необходимость сделать что-то, что невозможно выполнить в рамках SimpleXML, вы можете преобразовать свой объект SimpleXML в дерево DOM, вызвав функцию dom_import_simplexml(), выполнить необходимое, и вернуться назад к SimpleXML, используя simplexml_import_dom(). Благодаря тому, что оба расширения реализованы в одной библиотеке XML, переключения между ними теперь реальны.

SOAP:

Официально поддержка SOAP в PHP 4 отсутствовала. Обычно, при необходимости использовать SOAP, приходилось использовать PEAR, но поскольку код был написан полностью на PHP, приложение не могло выполняться так же, как встроенное С-расширение. Другие доступные С-расширения так и не смогли достичь стабильной версии и широкого применения, и поэтому не были включены в PHP 5.

Поддержка SOAP в PHP 5 была полностью переписана как С-расширение и, хотя на текущий момент находится последней стадии в бета-тестирования, было решено включить в его стандартный дистрибутив, поскольку он практически полностью реализует стандарт SOAP.

Следующий код демонстрирует вызов функции SomeFunction(), определенной в WSDL-файле:

<?php $client = new SoapClient("some.wsdl"); $client->SomeFunction($a, $b, $c); ?>

За дополнительной информацией по PHP5 обращайтесь на сайт Zend Technologies.

«Движок» PHP

Языки программирования бывают двух видов: интерпретируемые и компилируемые. А каким языком является PHP? Для того, чтобы ответить на этот вопрос, нам необходимо разобраться в терминологии.

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

Интерпретатор – это совершенно другая категория. Интерпретатор не переводит код, а исполняет его. Интерпретатор анализирует код программы и исполняет каждую его строку. Каждый раз при исполнении такого кода, необходимо пользоваться интерпретатором.

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

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

Рассмотрим рисунок:

Мы видим, что PHP составлен из двух почти независимых блоков — транслятора и интерпретатора. Зачем же понадобилось так делать? Конечно, из соображений быстродействия.

На вход PHP подается сценарий. Он переводит его (транслирует) , проверяя синтаксис, в специальный байт-код (внутреннее представление). Затем PHP выполняет байт-код (а не код самой программы), при этом он не создает исполняемый файл.

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

Рассмотрим цикл:

For (i=0;i<10; i++) {

Operator_1;

Operator_2;

Operator_3;

............

Operator_99;

Operator_100;

}

Такой цикл будет «крутиться» 10 раз. За каждый из этих десять проходов интерпретатор должен проанализировать и выполнить 100 строк кода. А в итоге ему нужно проанализировать и выполнить 10*100 = 1000 строк кода! Если перевести один раз весь цикл в байт-код, то анализировать ему придется в 10 раз меньше! А это значит, что сценарии будут выполняться в 10 раз быстрее!

Получается, что PHP является транслирующим интерпретатором.

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

Стоит вспомнить, что PHP версии 3 был «чистым» интерпретатором», а с PHP 4 сценарии стали выполняться значительно быстрее, поскольку 4-я версия PHP (и PHP5) является интерпретирующим транслятором.

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

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

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

  • Нет необходимости заботится об освобождении выделенной памяти, не нужно закрывать файлы по окончании работы с ними – всю рутинную работу сделает интерпретатор, поскольку программа выполняется под его бдительным контролем;

 

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

 

  • Отладка программ и обнаружение ошибок существенно упрощаются – интерпретатор полностью контролирует этот процесс;

 

  • В контексте web-приложений, интерпретатор также имеет еще очень важное преимущество – нет опасности «зависания» сервера при неправильной работе программы.

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

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

Лекция 15

Введение в PHP

Первая программа на PHP

Итак, будем считать, что для написания первой программы на PHP у вас все готово: установлен и настроен веб-сервер и интерпретатор PHP. Если нет, то мы вам поможем, чтобы процесс установки и настойки программного обеспечения не был для вас сложным..

Традиционно, знакомство с языком программирования начинают с пресловутой программы "Hello, World!". Что ж, мы не будем отступать от этой традиции, и напишем нашу первую программу на PHP!

Итак, берем редактор PHP-кода (сойдет и простой текстовый редактор), и напишем следующий PHP код:

<?php echo "Hello, World!";  ?>

Прежде, чем запустить программу, ее нужно установить на сервере. Для этого сохраните написанный PHP скрипт под названием start.php. Затем скопируйте его в каталог DocumentRoot вашего сервера. По умолчанию, в Linux таким каталогом является /var/www/html (в старых версиях Linux - /home/httpd/html/). В Windows расположение каталога зависит от типа установленного web-сервера и его настроек. Теперь наберите в адресной строке вашего браузера http://localhost/start.php и, если все установлено и настроено правильно, вы увидите текст Hello, World!

Увидели? Если да, то поздравляем, вы написали первую простейшую программу (скрипт) на PHP!

А теперь разберем код нашего простейшего скрипта.

Код PHP заключается в специальные теги <? и ?> Начало скрипта отмечается открывающим тегом <? , а конец - ?> После открывающего тега <? следует первый оператор echo, который осуществляет вывод информации на экран. Оператор echo можно назвать самым главным, ведь он выводит информацию в браузер, в результате его работы мы и видим наш Hello, World!

Теперь давайте несколько усложним наш скрипт, добавив в него вывод html-тегов:

<?php echo "<html><body>";  echo "<h1>Hello, World!</h1>";  echo "</body></html>";  ?>

Наш несколько модифицированный скрипт теперь будет выводить большими буквами текст Hello, World!

Настало время вывести текст на русском языке. Вы, наверняка, спросите, а почему мы сразу не могли вывести текст на русском языке? Ответ заключается в том, что текст на русском языке, без указания определенного заголовка html-документа, может быть выведен некорректно. А теперь давайте, наконец, изменим наш скрипт так, чтобы он мог приветствовать нас на русском языке:

<?php echo "<html><head>";  echo '<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">';  echo "<title>Моя первый PHP скрипт</title>";  echo "</head>";  echo "<body>";  echo "<h1>Привет! Я PHP скрипт!</h1>";  echo "</body>";  echo "</html>";  ?>

Будьте внимательны, во второй строке кода html-код заключен в апострофы, а не в кавычки! Этим мы даем интерпретатору понять, что оператор echo должен выводить символы как есть, то есть не разбирая код в апострофах. А вот строки в кавычках позволяют выводить значения переменных, информацию по которым вы найдете здесь.

В приведенном скрипте мы послали браузеру заголовок <head><meta....></head>, который дает понять браузеру, какую мы будем использовать кодировку для вывода текста html-документа, а также указали текст заголовка браузера: <title>Мой первый PHP скрипт</title>. А затем вывели текст на русском языке: <body><h1>Привет! Я PHP скрипт!</h1></body>.

Вообще, теги можно и не выводить с помощью оператора echo. Мы можем вставлять PHP-код непосредственно в html-содержимое.

PHP в HTML-документах

Если вы рассмотрели предыдущюю страницу, то увидели, что всю информацию, включая html-код, мы выводили с помощью оператора echo. Однако PHP-скрипты можно писать и по-другому. Рассмотрим пример:

<html>      <head>          <title>Пример</title>      </head>      <body>          <?php           echo "Привет, я - скрипт PHP!";           ?>      </body> </html>

Теперь вы можете сохранить приведенный PHP скрипт на сервере в виде файла .php, например start.php и проверить результат.

Html-код будет корректно обрабатываться интерпретатором PHP, поэтому у вас не будут возникать ошибки при выполнении этого скрипта.

Когда PHP обрабатывает файл, он просто передаёт его текст, пока не встретит один из специальных тегов, который сообщает ему о необходимости начать интерпретацию текста как кода PHP. Затем он выполняет весь найденный код до закрывающего тега, говорящего интерпретатору, что далее снова идет просто текст. Этот механизм позволяет вам внедрять PHP-код в HTML - все за пределами тегов PHP остается неизменным, тогда как внутри - интерпретируется как PHP код.

Существует четыре набора тегов, которые могут быть использованы для обозначения PHP-кода. Из них только два (<?php. . .?> и <script language="php">. . .</script>) всегда доступны; другие могут быть включены или выключены в конфигурационном файле php.ini. Хотя короткие теги и теги в стиле ASP могут быть удобны, они не так переносимы, как длинные версии. Кроме того, если вы намереваетесь вставлять PHP-код в XML или XHTML, чтобы соответствовать XML, вам следует использовать форму <?php. . .?>.

Теги, поддерживаемые PHP:

1.  <?php echo("если вы хотите работать с документами XHTML или XML, делайте так\n"); ?> 2.  <? echo ("это простейшая инструкция обработки SGML\n"); ?>     <?= выражение ?> Это синоним для "<? echo выражение ?>"      3.  <script language="php">         echo ("некоторые редакторы (например, FrontPage) не               любят инструкции обработки");     </script> 4.  <% echo ("Вы можете по выбору использовать теги в стиле ASP"); %>     <%= $variable; # Это синоним для "<% echo . . ." %>

Первый способ, <?php. . .?>, наиболее предпочтительный, так как он позволяет использовать PHP в коде, соответствующем правилам XML, таком как XHTML.

Второй способ не всегда доступен. Короткие теги доступны только когда они включены. Это можно сделать, используя функцию short_tags() (только в PHP 3), включив установку short_open_tag в конфигурационном файле PHP, либо скомпилировав PHP с параметром --enable-short-tags для configure. Даже если оно включено по умолчанию в php.ini-dist, использование коротких тегов не рекомендуется.

Четвертый способ доступен только если теги в стиле ASP были включены, используя конфигурационную установку asp_tags.

Замечание: Поддержка тегов в стиле ASP была добавлена в версии PHP 3.0.4.

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

Закрывающий тег блока PHP-кода включает сразу следующий за ним перевод строки, если он имеется. Кроме того, закрывающий тег автоматически подразумевает точку с запятой; вам не нужно заканчивать последнюю строку кода в блоке точкой с запятой. Закрывающий тег PHP-блока в конце файла не является обязательным.

PHP позволяет использовать такие структуры:

Профессиональная вставка:

<?php if ($expression) {      ?>     <strong>Это истина.</strong>     <?php  } else {      ?>     <strong>Это ложь.</strong>     <?php  } ?>

Этот код работает так, как ожидается, потому что когда PHP встречает закрывающие теги ?>, он просто выводит все, что он находит до следующего открывающего тега. Приведенный пример более эффективен для вывода больших блоков текста, чем отправка всего текста через echo(), print() или что-либо подобное.

Комментарии в PHP-скриптах

Написание практически любой программы не обходится без комментариев.

PHP поддерживает комметарии в стиле 'C', 'C++' и оболочки Unix.

Комментарии в PHP могут быть трех типов:

<?php      echo "Это тест"; // Это однострочный комментарий в стиле c++      /* Это многострочный комментарий         еще одна строка комментария */      echo "Это еще один тест";      echo "Последний тест"; # Это комментарий в стиле оболочки Unix ?>

Однострочные комментарии идут только до конца строки или текущего блока PHP-кода.

<h1>Это <?php # echo "простой";?> пример.</h1> <p>Заголовок вверху выведет 'Это пример'.

Будьте внимательны, следите за отсутствием вложенных 'C'-комментариев, они могут появиться во время комментирования больших блоков:

<?php   /*       echo "Это тест"; /* Этот комментарий вызовет проблему */   */ ?>

Однострочные комментарии идут только до конца строки или текущего блока PHP-кода, в зависимости от того, что идет перед ними. Это означает, что HTML-код после // ?> БУДЕТ напечатан: ?> выводит из режима PHP и возвращает в режим HTML, но // не позволяет этого сделать.

Переменные в PHP

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

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

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

Имена всех переменных в PHP должны начинаться со знака $ — так интерпретатору значительно легче "понять" и отличить их, например, в строках. Имена переменных чувствительны к регистру букв: например, $var — не то же самое, что $Var или $VAR:

<?php $var = "Bob"; $Var = "Joe"; echo "$var, $Var";      // выведет "Bob, Joe" $4site = 'not yet';     // неверно; начинается с цифры $_4site = 'not yet';    // верно; начинается с символа подчеркивания $tдyte = 'mansikka';    // верно; 'д' это (Дополнительный) ASCII 228. ?>

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

Иногда возникает потребность узнать тип переменной (например, переданной в параметрах функции) прямо во время выполнения программы.

.

Типы данных в PHP

PHP поддерживает восемь простых типов данных (переменных):

Четыре скалярных типа:

  • boolean (двоичные данные)

  • integer (целые числа)

  • float (число с плавающей точкой или 'double')

  • string (строки)

Два смешанных типа:

  • array (массивы)

  • object (объекты)

И два специальных типа:

  • resource (ресурсы)

  • NULL (пустой тип)

Существуют также несколько псевдотипов:

  • mixed (смешанный тип)

  • number (числа)

  • callback (обратного вызова)

Рассмотрим кратко перечисленные типы данных PHP.

Тип Boolean (двоичные данные)

Это простейший тип. Он выражает истинность значения - это может быть либо TRUE, либо FALSE. Булев тип был введен в PHP 4.

Чтобы определить булев тип, используйте ключевое слово TRUE или FALSE. Оба регистро-независимы.

<?php $x = True; // присвоить $x значение TRUE ?>

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

<?php // == это оператор, который проверяет // эквивалентность и возвращает булево значение if ($action == "показать_версию") {      echo "Версия 1.23"; } // это не обязательно... if ($show_separators == TRUE) {      echo "<hr>\n"; } // ...потому что вы можете просто написать if ($show_separators) {      echo "<hr>\n"; } ?>

Тип integer (целые числа)

Целое это число из множества Z = {..., -2, -1, 0, 1, 2, ...}, обычно длиной 32 бита (от –2 147 483 648 до 2 147 483 647).

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

Если вы используете восьмеричную систему счисления, вы должны предварить число 0 (нулем), для использования шестнадцатеричной системы нужно поставить перед числом 0x.

<?php $a = 1234; // десятичное число $a = -123; // отрицательное число $a = 0123; // восьмеричное число (эквивалентно 83 в десятичной системе) $a = 0x1A; // шестнадцатеричное число (эквивалентно 26 в десятичной системе) ?>

Тип float (числа с плавающей точкой)

Double - вещественное число довольно большой точности (ее должно хватить для подавляющего большинства математических вычислений).

Числа с плавающей точкой (они же числа двойной точности или действительные числа) могут быть определены при помощи любого из следующих синтаксисов:

<?php $a = 1.234; $b = 1.2e3; $c = 7E-10; ?>

Тип string (строки)

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

Строка легко может быть обработана при помощи стандартных функций, можно также непосредственно обратиться к любому ее символу.

Пример строковой переменной:

<? $a = "Это просто текст, записанный в строковую переменную"; echo $a; //Выводит 'Это просто текст, записанный в строковую переменную' ?>

Тип array (массивы)

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

Индекс (ключ) служит для однозначной идентификации элемента внутри массива. В одном массиве не может быть двух элементов с одинаковыми индексами.

PHP позволяет создавать массивы любой сложности. Рассмотрим некоторые примеры:

Простой массив (список)

Массивы, индексами которых являются числа, начинающиеся с нуля - это списки:

<?php // Простой способ инициализации массива $names[0]="Апельсин"; $names[1]="Банан"; $names[2]="Груша"; $names[3]="Помидор"; // Здесь: names - имя массива, а 0, 1, 2, 3 - индексы массива ?>

Ассоциативные массивы

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

Массивы, индексами которых являются строки, называются ассоциативными массивами. Индексы ассоциативных массивов называются ключами. Пример ассоциативного массива:

<?php // Ассоциативный массив $names["Иванов"]="Иван"; $names["Сидоров"]="Николай"; $names["Петров"]="Петр"; // В данном примере: фамилии - ключи ассоциативного массива // , а имена - элементы массива ?>

Многомерные массивы

Для создания массивов в PHP существует специальная инструкция array(). Ее удобно использовать для создания многомерных массивов. Приведем конкретный пример:

<?php // Многомерный массив $A["Ivanov"] = array("name"=>"Иванов И.И.", "age"=>"25", "email"=>"ivanov@mail.ru"); $A["Petrov"] = array("name"=>"Петров П.П.", "age"=>"34", "email"=>"petrov@mail.ru"); $A["Sidorov"] = array("name"=>"Сидоров С.С.", "age"=>"47", "email"=>"sidorov@mail.ru"); ?>

Многомерные массивы похожи на записи в языке Pascal или структуры в языке C.

Тип object (объекты)

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

Для инициализации объекта используется выражение new, создающее в переменной экземпляр объекта.

<?php class foo {      function do_foo()      {          echo "Doing foo.";       } } $bar = new foo; $bar->do_foo(); ?>

Тип resource (ресурсы)

Ресурс - это специальная переменная, содержащая ссылку на внешний ресурс. Ресурсы создаются и используются специальными функциями.

Тип NULL (пустой тип)

Специальное значение NULL говорит о том, что эта переменная не имеет значения. NULL - это единственно возможное значение типа NULL (пустой тип).

Переменная считается NULL если:

  • ей была присвоена константа NULL;

  • ей еще не было присвоено какое-либо значение;

  • она была удалена с помощью unset().

<?php $var = NULL; ?>

Псевдотип mixed (смешанный тип)

mixed говорит о том, что параметр может принимать множество (но не обязательно все) типов.

gettype(), например, принимает все типы PHP, тогда как str_replace() принимает строки и массивы.

Псевдотип number (числа)

number говорит о том, что параметр может быть либо integer, либо float.

Псевдотип callback (обратного вызова)

Некоторые функции, такие как call_user_func() или usort() принимают в качестве параметра определенные пользователем callback-функции. Callback-функции могут быть не только простыми функциями, но также методами объектов, включая статические методы классов.

PHP-функция передается просто как строка ее имени. Вы можете передать любую встроенную или определенную пользователем функцию за исключением array(), echo(), empty(), eval(), exit(), isset(), list(), print() и unset().

Приведем примеры callback функций:

<?php  // простой пример callback function my_callback_function() {      echo 'hello world!'; } call_user_func('my_callback_function');  // примеры callback-метода class MyClass {      function myCallbackMethod() {          echo 'Hello World!';      } } // вызов метода статического класса без создания объекта call_user_func(array('MyClass', 'myCallbackMethod'));  // вызов метода объекта $obj = new MyClass(); call_user_func(array(&$obj, 'myCallbackMethod')); ?>

Мы рассмотрели достаточно поверхностно типы данных PHP. Для более подробного ознакомления с этим вопросом посетите подраздел "Типы данных PHP".

Константы в PHP

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

В отличие от переменной, вы не можете изменить значение константы, которое было ей присвоено при её объявлении. Константы удобно использовать для хранения значений, которые не должны изменяться во время работы программы. Константы могут содержать только скалярные данные (логического, целого, плавающего и строкового типов).

В РНР константы определяются функцией define(). Эта функция имеет следующий формат:

define ($name, $value, $case_sen), где: $name - имя константы; $value - значение константы; $case_sen - необязательный параметр логического типа, указывающий, следует ли учитывать регистр букв (true) или нет (false).

Пример определения и использования констант в PHP:

<?php define("pi",3.14,true); echo pi; // Выводит 3.14 ?>

Если параметр $case_sen равен true, то интерпретатор будет учитывать регистр символов при работе с константой. Обратите внимание, что константы используются без предваряющего знака $.

Различия между константами и переменными:

  • У констант нет приставки в виде знака доллара ($);

  • Константы можно определить только с помощью функции define(), а не присваиванием значения;

  • Константы могут быть определены и доступны в любом месте без учета области видимости;

  • Константы не могут быть определены или аннулированы после первоначального объявления; и

  • Константы могут иметь только скалярные значения.

Проверка существования констант

Для проверки существования константы можно использовать функцию defined(). Данная функция возвращает true, если константа объявлена. Приведем пример:

<?php // Объявляем константу pi define("pi",3.14,true); if (defined("pi")==true) echo "Константа pi объявлена!"; // Скрипт выведет 'Константа pi объявлена!' ?>

Стандартные константы PHP

В PHP существуют следующие предопределенные константы:

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

Есть пять предопределенных констант, которые меняют свое значение в зависимости от контекста, в котором они используются. Например, константа __LINE__ зависит от строки в скрипте, на которой эта константа указана. Специальные константы нечувствительны к регистру и их список приведен ниже:

Имя

Описание

__LINE__

Текущая строка в файле.

__FILE__

Полный путь и имя текущего файла.

__FUNCTION__

Имя функции. (Добавлена в PHP 4.3.0.)

__CLASS__

Имя класса. (Добавлена в PHP 4.3.0.)

__METHOD__

Имя метода класса. (Добавлена в PHP 5.0.0)

Выражения в PHP

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

Основными формами выражений являются константы и переменные. Например, если вы записываете "$a = 100", вы присваиваете '100' переменной $a:

$a = 100;

В приведенном примере $a это переменная, = это оператор присваивания, а 100 это и есть выражения. Его значение 100.

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

$x = 7; $y = $x;

В первой строке рассмотренного примера выражением является константа 7, а во второй строке - переменная $x, т.к. ранее ей было присвоено значение 7. $y = $x также является выражением.

Немного более сложными примерами выражений являются функции. Например, рассмотрим следующую функцию:

<?php function funct () {      return 5; } ?>

Исходя из того, что вы хорошо знакомы с концепцией функций, вы полагаете, что запись $x = funct() абсолютно эквивалента записи $x = 5, и вы правы. Функции - это выражения, значением которых является то, что возвращает функция. Поскольку funct() возвращает 5, значением выражения 'funct()' является 5. Как правило, функции возвращают не статическое значение, а вычисленное.

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

PHP - это язык, ориентированный на выражения и рассматривающий почти все как выражение. Вернемся к примеру, с которым мы уже имели дело: '$x = 7'. Легко заметить, что здесь присутствуют два значения - значение целочисленной константы '7' и значение переменной $x, также принимающей значение 7. Но на самом деле здесь присутствует и еще одно значение - значение самого присвоения. Само присвоение вычисляется в присвоенное значение, в данном случае - в 7. На практике это означает, что '$x = 7', независимо от того, что оно делает, является выражением со значением 7. Таким образом, запись '$y = ($x = 7)' равносильна записи '$x = 5; $y = 5;' (точка с запятой обозначает конец выражения). Поскольку операции присвоения анализируются справа налево, вы также можете написать '$y = $x = 7'.

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

   Операторы PHP

Оператором называется нечто, состоящее из одного или более значений (выражений, если говорить на жаргоне программирования), которое можно вычислить как новое значение (таким образом, вся конструкция может рассматриваться как выражение). Отсюда следует, что функции или любые другие конструкции, которые возвращают значение (например, print()) являются операторами, в отличие от всех остальных языковых конструкций (например, echo()), которые ничего не возвращают.

Арифметические операторы

Помните школьные основы арифметики? Описанные ниже операторы работают так же.

Пример

Название

Результат

-$a

Отрицание

Смена знака $a.

$a + $b

Сложение

Сумма $a и $b.

$a - $b

Вычитание

Разность $a и $b.

$a * $b

Умножение

Произведение $a и $b.

$a / $b

Деление

Частное от деления $a на $b.

$a % $b

Деление по модулю

Целочисленный остаток от деления $a на $b.

Операция деления ("/") всегда возвращает вещественный тип, даже если оба значения были целочисленными (или строками, которые преобразуются в целые числа).

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

Операторы инкремента и декремента

PHP, аналогично C, поддерживает префиксные и постфиксные операторы инкремента и декремента.

Пример

Название

Действие

++$a

Префиксный инкремент

Увеличивает $a на единицу и возвращает значение $a.

$a++

Постфиксный инкремент

Возвращает значение $a, а затем увеличивает $a на единицу.

--$a

Префиксный декремент

Уменьшает $a на единицу и возвращает значение $a.

$a--

Постфиксный декремент

Возвращает значение $a, а затем уменьшает $a на единицу.

Булевые типы не подлежат инкрементированию и декрементированию.

Операторы присвоения

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

Результатом выполнения оператора присвоения является само присвоенное значение. Таким образом, результат выполнения $a = 3 будет равен 3. Это позволяет использовать конструкции вида:

<?php $a = ($b = 4) + 5; // результат: $a установлена значением 9, переменной $b присвоено 4. ?>

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

<?php $a = 3; $a += 5; // устанавливает $a значением 8, аналогично записи: $a = $a + 5; $b = "Hello "; $b .= "There!"; // устанавливает $b строкой "Hello There!",  как и $b = $b . "There!"; ?>

Обратите внимание, что присвоение копирует оригинальную переменную в новую (присвоение по значению), таким образом все последующие изменения одной из переменных на другой никак не отражаются. Начиная с PHP 4, также поддерживается присваивание по ссылке, используя синтаксис $var = &$othervar; 'Присвоение по ссылке' означает, что обе переменные указывают на одни и те же данные и никакого копирования не происходит.

Побитовые операторы

Данные операторы предназначены для установки или снятия групп битов целочисленной переменной. Ведь любое число - это просто последовательность бит. Целые числа в PHP - 32-битные.

Для представления одного числа используются 32 бита:

  • 0000 0000 0000 0000 0000 0000 0000 0000 - это ноль;

  • 0000 0000 0000 0000 0000 0000 0000 0001 - это 1;

  • 0000 0000 0000 0000 0000 0000 0000 0010 - это 2;

  • 0000 0000 0000 0000 0000 0000 0000 0011 - это 3;

  • 0000 0000 0000 0000 0000 0000 0000 0100 - это 4;

  • 0000 0000 0000 0000 0000 0000 0000 0101 - это 5;

  • ...

  • 0000 0000 0000 0000 0000 0000 0000 1111 - это 15;

  • ...

Побитовые операторы:

Пример

Название

Результат

$a & $b

Побитовое 'и'

Устанавливаются только те биты, которые установлены и в $a, и в $b.

$a | $b

Побитовое 'или'

Устанавливаются те биты, которые установлены либо в $a, либо в $b.

$a ^ $b

Исключающее или

Устанавливаются только те биты, которые установлены либо только в $a, либо только в $b

~ $a

Отрицание

Устанавливаются те биты, которые в $a не установлены, и наоборот.

$a << $b

Сдвиг влево

Все биты переменной $a сдвигаються на $b позиций влево (каждая позиция подразумевает 'умножение на 2')

$a >> $b

Сдвиг вправо

Все биты переменной $a сдвигаються на $b позиций вправо (каждая позиция подразумевает 'деление на 2')

Операторы сравнения

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

В PHP разрешается сравнивать только скалярные переменные. Массивы и объекты в PHP сравнивать нельзя.

Операторы сравнения:

Пример

Название

Результат

$a == $b

Равно

TRUE если $a равно $b.

$a === $b

Тождественно равно

TRUE если $a равно $b и имеет тот же тип. (Добавлено в PHP 4)

$a != $b

Не равно

TRUE если $a не равно $b.

$a <> $b

Не равно

TRUE если $a не равно $b.

$a !== $b

Тождественно не равно

TRUE если $a не равно $b или в случае, если они разных типов (Добавлено в PHP 4)

$a < $b

Меньше

TRUE если $a строго меньше $b.

$a > $b

Больше

TRUE если $a строго больше $b.

$a <= $b

Меньше или равно

TRUE если $a is меньше или равно $b.

$a >= $b

Больше или равно

TRUE если $a больше или равно $b.

Логические операторы

Приведем таблицу логических операторов PHP:

Пример

Название

Результат

$a and $b

Логическое 'и'

TRUE если и $a, и $b TRUE.

$a or $b

Логическое 'или'

TRUE если или $a, или $b TRUE.

$a xor $b

Исключающее 'или'

TRUE если $a, или $b TRUE, но не оба.

! $a

Отрицание

TRUE если $a не TRUE.

$a && $b

Логическое 'и'

TRUE если и $a, и $b TRUE.

$a || $b

Логическое 'или'

TRUE если или $a, или $b TRUE.

Операторы инкремента (++) и декремента (--) не работают с логическими переменными.

Приоритеты операторов PHP

Операторы с более высоким уровнем приоритета выполняются в первую очередь:

Приоритет

Оператор

Порядок выполнения

13

(постфикс)++ (постфикс)--

слева направо

12

++(префикс) --(префикс)

справа налево

11

* / %

слева направо

10

+ -

слева направо

9

<< >>

слева направо

8

< <= > >=

слева направо

7

== !=

слева направо

6

&

слева направо

5

^

слева направо

4

|

слева направо

3

&&

слева направо

2

||

слева направо

1

= += -= *= /= %= >>= <<== &= ^= |=

справа налево

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

Строковые операторы

В PHP есть два оператора для работы со строками. Первый - оператор конкатенации ('.'), который возвращает объединение левого и правого аргумента. Второй - оператор присвоения с конкатенацией, который присоединяет правый аргумент к левому. Приведем конкретный пример:

<?php $a = "Hello "; $b = $a . "World!"; // $b содержит строку "Hello World!" $a = "Hello "; $a .= "World!";     // $a содержит строку "Hello World!" ?>

Конструкции языка PHP

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

Кратко рассмотрим основные конструкции языка PHP.

Итак, основные конструкции языка PHP:

» Условные операторы:

if else elseif

» Циклы:

while do-while for foreach break continue

» Конструкции выбора:

switch

» Конструкции возврата значений:

return

» Конструкции включений:

require() include() require_once() include_once()

Условные операторы

Условные операторы являются, пожалуй, наиболее распространенными конструкциями во всех алгоритмических языках программирования. Рассмотрим основные условные операторы языка PHP.

Конструкция if

Синтаксис конструкции if аналогичен конструкции if в языке C:

<?php if (логическое выражение) оператор; ?>

Согласно выражениям PHP, конструкция if содержит логическое выражение. Если логическое выражение истинно (true), то оператор, следующий за конструкцией if будет исполнен, а если логическое выражение ложно (false), то следующий за if оператор исполнен не будет. Приведем примеры:

<?php if ($a > $b) echo "значение a больше, чем b"; ?>

В следующем примере если переменная $a не равна нулю, будет выведена строка "значение a истинно (true):

<?php if ($a) echo "значение a истинно (true) "; ?>

В следующем примере если переменная $a равна нулю, будет выведена строка "значение a ложно (false):

<?php if (!$a) echo "значение a ложно (false) "; ?>

Часто вам будет необходим блок операторов, который будет выполняться при определенном условном критерии, тогда эти операторы необходимо поместить в фигурные скобки {...} Пример:

<?php if ($a > $b) {      echo "a больше b";      $b = $a; } ?>

Приведенный пример выведет сообщение, "a больше b", если $a > $b, а затем переменная $a будет приравнена к переменной $b. Заметим, что данные операторы выполняются в теле конструкции if.

Конструкция else

Часто возникает потребность исполнения операторов не только в теле конструкции if, если выполнено какое-либо условие конструкции if, но и в случае, если условие конструкции if не выполнено. В данной ситуации нельзя обойтись без конструкции else. В целом, такая конструкция будет называться конструкцией if-else.

Синтаксис конструкции if-else такой:

if (логическое_выражение) инструкция_1; else инструкция_2;

Действие конструкции if-else следующее: если логическое_выражение истинно, то выполняется инструкция_1, а иначе — инструкция_2. Как и в любом другом языке, конструкция else может опускаться, в этом случае при получении должного значения просто ничего не делается.

Если инструкция_1 или инструкция_2 должны состоять из нескольких команд, то они, как всегда, заключаются в фигурные скобки. Например:

<?php if ($a > $b) {      echo "a больше, чем b"; } else {      echo "a НЕ больше, чем b"; } ?>

Конструкция if-else имеет еще один альтернативный синтаксис:

if (логическое_выражение): команды; elseif(другое_логическое_выражение): другие_команды; else: иначе_команды; endif

Обратите внимание на расположение двоеточия (:)! Если его пропустить, будет сгенерировано сообщение об ошибке. И еще: как обычно, блоки elseif и else можно опускать.

Конструкция elseif

elseif - это комбинация конструкций if и else. Эта конструкция расширяет условную конструкцию if-else.

Приведем синтаксис конструкции elseif:

if (логическое_выражение_1) оператор_1; elseif (логическое_выражение_2) оператор_2; else оператор_3;

Практический пример использования конструкции elseif:

<?php if ($a > $b) {      echo "a больше, чем b"; } elseif ($a == $b) {      echo "a равен b"; } else {      echo "a меньше, чем b"; } ?>

Вообще, конструкция elseif не очень удобна, поэтому применяется не так часто.

Циклы в PHP

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

Циклы позволяют повторять определенное (и даже неопределенное - когда работа цикла зависит от условия) колличество раз различные операторы. Данные операторы называются телом цикла. Проход цикла называется итерацией.

PHP поддерживает три вида циклов:

  • Цикл с предусловием (while);

  • Цикл с постусловием (do-while);

  • Цикл со счетчиком (for);

  • Специальный цикл перебора массивов (foreach).

При использовании циклов есть возможность использования операторов break и continue. Первый из них прерывает работу всего цикла, а второй - только текущей итерации.

Рассмотрим циклы PHP:

Цикл с предусловием while

Цикл с предусловием while работает по следующим принципам:

  1. Вычисляется значение логического выражения.

  2. Если значение истинно, выполняется тело цикла, в противном случае - переходим на следующий за циклом оператор.

Синтаксис цикла с предусловием:

while (логическое_выражение) инструкция;

В данном случае телом цикла является инструкция. Обычно тело цикла состоит из большого числа операторов. Приведем пример цикла с предусловием while:

<?php $x=0; while ($x++<10) echo $x; // Выводит 12345678910 ?>

Обратите внимание на последовательность выполнения операций условия $x++<10. Сначала проверяется условие, а только потом увеличивается значение переменной. Если мы поставим операцию инкремента перед переменной (++$x<10), то сначала будет выполнено увеличение переменной, а только затем - сравнение. В результате мы получим строку 123456789. Этот же цикл можно было бы записать по-другому:

<?php $x=0; while ($x<10) { $x++; // Увеличение счетчика echo $x; } // Выводит 12345678910 ?>

Если мы увеличим счетчик после выполнения оператора echo, мы получим строку 0123456789. В любом случае, мы имеем 10 итераций. Итерация - это выполение операторов внутри тела цикла.

Подобно конструкции условного оператора if, можно группировать операторы внутри тела цикла while, используя следующий альтернативный синтаксис:

while (логическое_выражение): инструкция; ... endwhile;

Пример использования альтернативного синтаксиса:

<?php $x = 1; while ($x <= 10):      echo $x;      $x++; endwhile; ?>

Цикл с постусловием do while

В отличие от цикла while, этот цикл проверяет значение выражения не до, а после каждого прохода. Таким образом, тело цикла выполняется хотя бы один раз. Синтаксис цикла с постусловием такой:

do { тело_цикла; } while (логическое_выражение);

После очередной итерации проверяется, истинно ли логическое_выражение, и, если это так, управление передается вновь на начало цикла, в противном случае цикл обрывается. Альтернативного синтаксиса для do-while разработчики PHP не предусмотрели (видимо, из-за того, что, в отличие от прикладного программирования, этот цикл довольно редко используется при программировании web-приложений).

Пример скрипта, показывающего работу цикла с постусловием do-while:

<?php $x = 1; do {      echo $x; } while ($x++<10); ?>

Рассмотренный сценарий выведет: 12345678910

Цикл со счетчиком for

Цикл со счетчиком используется для выполнения тела цикла определенное число раз. С помощью цикла for можно (и нужно) создавать конструкции, которые будут выполнять действия совсем не такие тривиальные, как простая переборка значения счетчика.

Синтаксис цикла for такой:

for (инициализирующие_команды; условие_цикла; команды_после_итерации) { тело_цикла; }

Цикл for начинает свою работу с выполнения инициализирующих_команд. Данные команды выполняются только один раз. После этого проверяется условие_цикла, если оно истинно (true), то выполняется тело_цикла. После того, как будет выполнен последний оператор тела, выполняются команды_после_итерации. Затем снова проверяется условие_цикла. Если оно истинно (true), выполняется тело_цикла и команды_после_итерации, и.т.д.

<?php for ($x=0; $x<10; $x++) echo $x; ?>

Данный сценарий выводит: 0123456789

Есть вариант вывода строки 12345678910:

<?php for ($x=0; $x++<10;) echo $x; // Выводит 12345678910 ?>

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

Если необходимо указать несколько команд, их можно разделить запятыми, пример:

<?php for ($x=0, $y=0; $x<10; $x++, $y++) echo $x; // Выводит 0123456789 ?>

Приведем еще один, более практичный пример использования нескольких команд в цикле for:

<?php for($i=0,$j=0,$k="Точки"; $i<10; $j++,$i+=$j) { $k=$k."."; echo $k; } // Выводит Точки.Точки..Точки...Точки.... ?>

Рассмотренный пример (да и вообще любой цикл for) можно реализовать и через while, только это будет выглядеть не так изящно и лаконично.

Для цикла for имеется и альтернативный синтаксис:

for(инициализирующие_команды; условие_цикла; команды_после_итерации): операторы; endfor;

Цикл перебора массивов foreach

В PHP4 появился еще один специальный тип цикла - foreach. Данный цикл предназначен специально для перебора массивов.

Синтаксис цикла foreach выглядит следующим образом:

foreach (массив as $ключ=>$значение) команды;

Здесь команды циклически выполняются для каждого элемента массива, при этом очередная пара ключ=>значение оказывается в переменных $ключ и $значение. Приведем пример работы цикла foreach:

<?php $names["Иванов"] = "Андрей"; $names["Петров"] = "Борис"; $names["Волков"] = "Сергей"; $names["Макаров"] = "Федор"; foreach ($names as $key => $value) { echo "<b>$value $key</b><br>"; } ?>

Рассмотренный сценарий выводит:

Андрей Иванов Борис Петров Сергей Волков Федор Макаров

У цикла foreach имеется и другая форма записи, которую следует применять, когда нас не интересует значение ключа очередного элемента. Выглядит она так:

foreach (массив as $значение) команды;

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

<?php $names[] = "Андрей"; $names[] = "Борис"; $names[] = "Сергей"; $names[] = "Федор"; foreach ($names as $value) { echo "<b>$value</b><br>"; } ?>

Внимание: Цикл foreach оперирует не исходным массивом, а его копией. Это означает, что любые изменения, которые вносятся в массив, не могут быть "видны" из тела цикла. Что позволяет, например, в качестве массива использовать не только переменную, но и результат работы какой-нибудь функции, возвращающей массив (в этом случае функция будет вызвана всего один раз - до начала цикла, а затем работа будет производиться с копией возвращенного значения).

Конструкция break

Очень часто для того, чтобы упростить логику какого-нибудь сложного цикла, удобно иметь возможность его прервать в ходе очередной итерации (к примеру, при выполнении какого-нибудь особенного условия). Для этого и существует конструкция break, которая осуществляет немедленный выход из цикла. Она может задаваться с одним необязательным параметром - числом, которое указывает, из какого вложенного цикла должен быть произведен выход. По умолчанию используется 1, т. е. выход из текущего цикла, но иногда применяются и другие значения. Синтаксис конструкции break:

break; // По умолчанию break(номер_цикла); // Для вложенных циклов (указывается номер прерываемого цикла)

Приведем примеры:

<?php $x=0; while ($x++<10) { if ($x==3) break; echo "<b>Итерация $x</b><br>"; } // Когда $x равен 3, цикл прерывается ?>

Рассмотренный сценарий выводит:

Итерация 1 Итерация 2

Если нам нужно прервать работу определенного (вложенного) цикла, то нужно передать конструкции break параметр - номер_цикла, например, break(1). Нумерация циклов выглядит следующим образом:

for (...) // Третий цикл {   for (...) // Второй цикл   {      for (...) // Первый цикл      {      }   } }

Конструкция continue

Конструкция continue так же, как и break, работает только "в паре" с циклическими конструкциями. Она немедленно завершает текущую итерацию цикла и переходит к новой (конечно, если выполняется условие цикла для цикла с предусловием). Точно так же, как и для break, для continue можно указать уровень вложенности цикла, который будет продолжен по возврату управления. В основном continue позволяет вам сэкономить количество фигурных скобок в коде и увеличить его удобочитаемость. Это чаще всего бывает нужно в циклах-фильтрах, когда требуется перебрать некоторое количество объектов и выбрать из них только те, которые удовлетворяют определенным условиям. Приведем пример использования конструкции continue:

<?php $x=0; while ($x++<5) { if ($x==3) continue; echo "<b>Итерация $x</b><br>"; } // Цикл прервется только на третьей итерации ?>

Рассмотренный скрипт выводит:

Итерация 1 Итерация 2 Итерация 4 Итерация 5

Грамотное использование break и continue позволяет заметно улучшить "читабельность" кода и количество блоков else.

 Конструкции выбора

Часто вместо нескольких расположенных подряд инструкций if-else целесообразно воспользоваться специальной конструкцией выбора switch-case. Данная конструкция предназначена для выбора действий, в зависимости от значения указанного выражения. Конструкция switch-case чем-то напоминает конструкцию if-else, который, по сути, является ее аналогом. Конструкцию выбора можно использовать, если предполагаемых вариантов много, например, более 5, и для каждого варианта нужно выполнить специфические действия. В таком случае, использование конструкции if-else становится действительно неудобным.

Синтаксис конструкции switch-case такой:

switch(выражение) { case значение1: команды1; [break;] case значение2: команды2; [break;] . . . case значениеN: командыN; [break;] [default: команды_по_умолчанию; [break]] }

Принцип работы конструкции switch-case такой:

  1. Вычисляется значение выражения;

  2. Просматривается набор значений. Пусть значение1 равно значению выражения, вычисленного на первом шаге. Если не указана конструкция (оператор) break, то будут выполнены команды i, i+1, i+2, ... , N. В противном случае (есть break) будет выполнена только команда с номером i.

  3. Если ни одно значение из набора не совпало со значением выражения, тогда выполняется блок default, если он указан.

Приведем примеры использования конструкции switch-case:

<?php $x=1; // Используем if-else if ($x == 0) {     echo "x=0<br>"; } elseif ($x == 1) {     echo "x=1<br>"; } elseif ($x == 2) {     echo "x=2<br>"; } // Используем switch-case switch ($x) { case 0:     echo "x=0<br>";     break; case 1:     echo "x=1<br>";     break; case 2:     echo "x=2<br>";     break; } ?>

Рассмотренный сценарий выводит x=1 дважды. Еще пример использования конструкции switch-case:

<?php $x="Яблоко"; switch ($x) { case "Яблоко":     echo "Это Яблоко";     break; case "Груша":     echo "Это Груша";     break; case "Арбуз":     echo "Это Арбуз";     break; } ?>

Данный скрипт выводит "Это Яблоко".

Конструкция switch выполняется поэтапно. Сперва никакой код не исполнен. Только, когда конструкция case найдена со значением, которое соответствует значению выражения switch, PHP начинает исполнять конструкции. PHP продолжает исполнять конструкции до конца блока switch, пока не встречается оператор break. Если не использовать конструкции (операторы) break, скрипт будет выглядеть так:

<?php $x=0; switch ($x) { case 0:     echo "x=0<br>"; case 1:     echo "x=1<br>"; case 2:     echo "x=2<br>"; } // Без использования break выводит // x=0 // x=1 // x=2 ?>

Операторный список для case может быть также пуст, он просто передает управление в операторный список до следующей конструкции case:

<?php switch ($x) { case 0: case 1: case 2:      echo "x меньше, чем 3, но не отрицателен";      break; case 3:      echo "x=3"; } ?>

Когда ни одно значение из набора не совпало со значением выражения, тогда выполняется блок default, если он указан, например:

<?php $x=3; switch ($x) { case 0:     echo "x=0";     break; case 1:     echo "x=1";     break; case 2:     echo "x=2";     break; default:     echo "x не равен 0, 1 или 2"; } ?>

Данный скрипт выводит "x не равен 0, 1 или 2", поскольку переменная $x=3.

Конструкция switch-case также имеет альтернативный синтаксис:

switch(выражение): case значение1: команды1; [break;] . . . case значениеN: командыN; [break;] [default: команды_по_умолчанию; [break]] endswitch;

Практический пример использования альтернативного синтаксиса для конструкции switch-case:

<?php $x=3; switch ($x): case 0:     echo "x=0";     break; case 1:     echo "x=1";     break; case 2:     echo "x=2";     break; default:     echo "x не равен 0, 1 или 2"; endswitch; ?>

Как вы уже поняли, данный скрипт выводит "x не равен 0, 1 или 2", так как $x=3.

Конструкции возврата значений

Конструкция return

Конструкция return возвращает значения, преимущественно из пользовательских функций, как параметры функционального запроса. При вызове return исполнение пользовательской функции прерывается, а конструкция return возвращает определенные значения.

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

Преимущественно, конструкция return используется для возврата значений пользовательскими функциями.

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

Пример использования конструкции return для возврата значений типа integer:

<?php function retfunct() {      return 7; } echo retfunct();   // выводит '7'. ?>

Пример возврата конструкцией return массивов:

<?php function numbers() {      return array (0, 1, 2); } list ($zero, $one, $two) = numbers(); echo $zero; echo $one; echo $two; // Выводит '012' ?>

Для того, чтобы функция возвращала результат по ссылке, вам необходимо использовать оператор & и при описании функции, и при присвоении переменной возвращаемого значения:

<?php function &returns_reference() {      return $someref; } $newref =& returns_reference(); ?>

Как мы видим, конструкция return весьма удобна для применения в пользовательских функциях.

Конструкции включений в PHP

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

В PHP существуют две основные конструкции включений: require и include.

Конструкция включений require

Конструкция require позволяет включать код до выполнения сценария. Общий синтаксис require такой:

require имя_файла;

При запуске (именно при запуске, а не при исполнении!) программы интерпретатор просто заменит инструкцию на содержимое файла имя_файла (этот файл может также содержать сценарий на PHP, обрамленный, как обычно, тэгами <? и ?>). Причем сделает он это непосредственно перед запуском программы (в отличие от include, который рассматривается ниже). Это бывает довольно удобно для включения в вывод сценария различных шаблонных страниц HTML-кодом. Приведем пример:

Файл header.html: <html> <head><title>It is a title</title></head> <body bgcolor=green>

Файл footer.html: © Home Company, 2005. </body></html>

Файл script.php <?php require "header.htm"; // Сценарий выводит само тело документа require "footer.htm"; ?>

Таким образом, конструкция require позволяет собирать сценарии PHP из нескольких отдельных файлов, которые могут быть как html-страницами, так и php-скриптами.

Конструкция включений include

Конструкция include также предназначена для включения файлов в код сценария PHP.

В отличие от конструкции require конструкция include позволяет включать файлы в код PHP скрипта во время выполнения сценария. Синтаксис конструкции include выглядит следующим образом:

include имя_файла;

Поясним принципиальную разницу между конструкциями require и include на конкретном практическом примере. Создадим 10 файлов с именами 1.txt, 2.txt и так далее до 10.txt, содержимое этих файлов - просто десятичные цифры 1, 2 ...… 10 (по одной цифре в каждом файле). Создадим такой сценарий PHP:

<?php // Создаем цикл, в теле которого конструкция include for($i=1; $i<=10; $i++) { include "$i.txt"; } // Включили десять файлов: 1.txt, 2.txt, 3.txt ... 10.txt // Результат - вывод 12345678910 ?>

В результате мы получим вывод, состоящий из 10 цифр: "12345678910". Из этого мы можем слелать вывод, что каждый из файлов был включен по одному разу прямо во время выполнения цикла! Если мы поставим теперь вместо include require, то сценарий сгенерирует критическую ошибку (fatal error). Сравните результат.

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

Таким образом, целесообразнее использовать конструкцию require там, где не требуется динамическое включение файлов в сценарий, а конструкцию include использовать только с целью динамического включения файлов в код PHP скрипта.

Конструкция include поддерживает включения удаленных файлов (начиная с версии PHP 4.3.0). Например:

<?php // Следующий пример не работает, поскольку пытается включить локальный файл include 'file.php?foo=1&bar=2'; // Следующий пример работает include 'http://www.example.com/file.php?foo=1&bar=2'; ?>

Для того, чтобы удаленное включение файлов было доступно, необходимо в конфигурационном файле (php.ini) установить allow_url_fopen=1.

Конструкции однократного включения require_once и include_once

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

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

Пользовательские функции в PHP

В любом языке программирования существуют подпрограммы. В языке C они называются функциями, в ассемблере - подпрограммами, а в Pascal существуют два вида подпрограмм: процедуры и функции.

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

В PHP такими подпрограммами являются пользовательские функции.

Особенности пользовательских функций PHP

Перечислим особенности пользовательских функций в PHP:

  • Доступны параметры по умолчанию. Есть возможность вызывать одну и ту же функцию с переменным числом параметров;

  • Пользовательские функции могут возвращать любой тип;

  • Область видимости переменных внутри функции является иерархической (древовидной);

  • Есть возможность изменять переменные, переданные в качестве аргумента.

При использовании пользовательских функций встает вопрос об области видимости переменных.

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

Глобальные переменные - это переменные, которые доступны всей программе, включая подпрограммы (функции).

Локальные переменные - переменные, определенные внутри подпрограммы (функции). Они доступны только внутри функции, в которой они определены.

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

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

Поясним данный факт на конкретном примере:

<?php $a = 100; function funct() { $a = 70;  echo "<h4>$a</h4>"; } funct(); echo "<h2>$a</h2>"; ?>

Сценарий выведет сперва 70, а затем 100:

70 100

Для избавления от приведенного недостатка, в PHP существует специальная инструкция global, позволяющая пользовательской функции работать с глобальными переменными.

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

Если в теле пользовательской функции объявлена статическая переменная, то компилятор не будет ее удалять после завершения работы функции. Пример работы пользовательской функции, содержащей статические переменные:

<?php    function funct()    {       static $a;       $a++;       echo "$a";    }    for ($i = 0; $i++<10;) funct(); ?>

Данный сценарий выводит строку:

1 2 3 4 5 6 7 8 9 10

Если мы удалим инструкцию static, будет выведена строка:

1 1 1 1 1 1 1 1 1 1

Это связано с тем, что переменная $a будет удаляться при завершении работы функции и обнуляться при каждом ее вызове. Переменная $a инкрементируется сразу после обнуления, а только потом выводится.

Создание пользовательских функций

Пользовательская функция может быть объявлена в любой части программы (скрипта), до места ее первого использования. И не нужно никакого предварительного объявления.

Синтаксис объявления функций следующий:

function Имя (аргумент1[=значение1],...,аргумент1[=значение1]) { тело_функции }

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

Требования, предъявляемые к именам функций:

  • Имена функций могут содержать русские буквы, но давать функциям имена, состоящие из русских букв не рекоммендуется;

  • Имена функций не должны содержать пробелов;

  • Имя каждой пользовательской функции должно быть уникальным. При этом, необходимо помнить, что регистр при объявлении функций и обращении к ним не учитывается. То есть, например, функции funct() и FUNCT() имеют одинаковые имена;

  • Функциям можно давать такие же имена, как и переменным, только без знака $ в начале имен.

Типы значений, возвращаемые пользовательскими функциями, могут быть любыми. Для передачи результата работы пользовательских функций в основную программу (скрипт) используется конструкция return. Если функция ничего не возвращает, конструкцию return не указывают. Конструкция return может возвращать все, что угодно, в том числе и массивы.

Приведем примеры испольльзования пользовательских функций:

<?php function funct() { $number = 777;  return $number; } $a = funct(); echo $a; ?>

В рассмотренном примере функция funct возвращает с помощью инструкции return число 777. Возвращенное функцией значение присваивается глобальной переменной $a, а затем оператор echo выводит значение переменной $a в браузер. В результате мы увидим в браузере число 777.

Передача аргументов пользовательским функциям

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

<?php function funct($a, $b, /* ..., */ $z) { ... }; ?>

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

Передача аргументов по ссылке

Если вы хотите, что бы аргумент передавался по ссылке, вы должны указать амперсанд (&) перед именем аргумента в описании функции:

<?php function funct(&$string) {      $string .= 'а эта внутри.'; } $str = 'Эта строка за пределами функции, '; funct($str); echo $str;    // Выведет 'Эта строка за пределами функции, а эта внутри.' ?>

Параметры по умолчанию

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

<?php function makecup($type = "Чая") {      return "Сделайте чашечку $type.\n"; } echo makecup(); echo makecup("Кофе"); ?>

Результат работы приведенного скрипта будет таким:

Сделайте чашечку Чая Сделайте чашечку Кофе

Значение по умолчанию должно быть константным выражением.

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

Основы ООП

В последнее время идея объектно-ориентированного программирования (ООП), кардинально новая идеология написания программ, все более занимает умы программистов.

Объектно-ориентированные программы более просты и мобильны, их легче модифицировать и сопровождать, чем их "традиционных" собратьев. Кроме того, похоже, сама идея объектной ориентированности при грамотном ее использовании позволяет программе быть даже более защищенной от различного рода ошибок, чем это задумывал программист в момент работы над ней. Однако ничего не дается даром: сами идеи ООП довольно трудны для восприятия "с нуля", поэтому до сих пор очень большое количество программ (различные системы Unix, Apache, Perl, да и сам PHP) все еще пишутся на старом добром "объектно-неориентированном" Си.

PHP до недавнего времени обеспечивал лишь некоторую поддержку ООП. Однако, после выхода PHP5 поддержка ООП в PHP стала практически полной.

Стратегию ООП лучше всего описать как смещение приоритетов в процессе программирования от функциональности приложения к структурам данных. Это позволяет программисту моделировать в создаваемых приложениях реальные объекты и ситуации. Технология ООП обладает тремя главными преимуществами:

  • она проста для понимания: ООП позволяет мыслить категориями повседневных объектов;

  • повышенно надежна и проста для сопровождения — правильное проектирование обеспечивает простоту расширения и модификации объектно-ориентированных программ. Модульная структура позволяет вносить независимые изменения в разные части программы, сводя к минимуму риск ошибок программирования;

  • ускоряет цикл разработки — модульность и здесь играет важную роль, поскольку различные компоненты объектно-ориентированных программ можно легко использовать в других программах, что уменьшает избыточность кода и снижает риск внесения ошибок при копировании.

Специфика ООП заметно повышает эффективность труда программистов и позволяет им создавать более мощные, масштабируемые и эффективные приложения.

Объектно-ориентированное программирование основано на:

  • Инкапсуляции;

  • Полиморфизме;

  • Наследовании.

Инкапсуляция

Инкапсуляция - это механизм, объединяющий данные и обрабатывающий их код как единое целое.

Многие преимущества ООП обусловлены одним из его фундаментальных принципов — инкапсуляцией. Инкапсуляцией называется включение различных мелких элементов в более крупный объект, в результате чего программист работает непосредственно с этим объектом. Это приводит к упрощению программы, поскольку из нее исключаются второстепенные детали.

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

Полиморфизм

Полиморфизм позволяет использовать одни и те же имена для похожих, но технически разных задач. Главным в полиморфизме является то, что он позволяет манипулировать объектами путем создания стандартных интерфейсов для схожих действий. Полиморфизм значительно облегчает написание сложных программ.

Наследование

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

Классы и объекты в PHP

Класс - это базовое понятие в объектно-ориентированном программировании (ООП). Если сказать проще, то класс - это своеобразный тип переменной.

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

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

Описание классов в PHP начинаются служебным словом class:

class Имя_класса { // описание членов класса - данных и методов для их обработки }

Для объявления объекта необходимо использовать оператор new:

Объект = new Имя_класса;

Данные описываются с помощью служебного слова var. Метод описывается так же, как и обыкновенная функция. Методу также можно передавать параметры.

Пример класса на PHP:

<?php // Создаем новый класс Coor: class Coor { // данные (свойства): var $name; var $addr; // методы:  function Name() {  echo "<h3>John</h3>";  } } // Создаем объект класса Coor: $object = new Coor; ?>

Доступ к классам и объектам в PHP

Мы рассмотрели, каким образом описываются классы и создаются объекты. Теперь нам необходимо получить доступ к членам класса, для этого в PHP предназначен оператор ->. Приведем пример:

<?php // Создаем новый класс Coor: class Coor { // данные (свойства): var $name; // методы:  function Getname() {  echo "<h3>John</h3>";  } } // Создаем объект класса Coor: $object = new Coor; // Получаем доступ к членам класса: $object->name = "Alex"; echo $object->name; // Выводит 'Alex' // А теперь получим доступ к методу класса (фактически, к функции внутри класса): $object->Getname(); // Выводит 'John' заглавными буквами ?>

Чтобы получить доступ к членам класса внутри класса, необходимо использовать указатель $this, который всегда относится к текущему объекту. Модифицированный метод Getname():

function Getname() { echo $this->name; }

Таким же образом, можно написать метод Setname():

function Setname($name) { $this->name = $name; }

Теперь для изменения имени можно использовать метод Setname():

$object->Setname("Peter"); $object->Getname();

А вот и полный листинг кода:

<?php // Создаем новый класс Coor: class Coor { // данные (свойства): var $name; // методы:  function Getname() {  echo $this->name;  }  function Setname($name) {  $this->name = $name;  } } // Создаем объект класса Coor: $object = new Coor; // Теперь для изменения имени используем метод Setname(): $object->Setname("Nick"); // А для доступа, как и прежде, Getname(): $object->Getname(); // Сценарий выводит 'Nick' ?>

Указатель $this можно также использовать для доступа к методам, а не только для доступа к данным:

function Setname($name) { $this->name = $name; $this->Getname(); }

Инициализация объектов

Иногда возникает необходимость выполнить инициализацию объекта - присвоить его свойствам первоначальные значения. Предположим, имя класса Coor и он содержит два свойства:имя человека и город его проживания. Можно написать метод (функцию), который будет выполнять инициализацию объекта, например Init():

<?php // Создаем новый класс Coor: class Coor { // данные (свойства): var $name; var $city; // Инициализирующий метод:  function Init($name) {  $this->name = $name;  $this->city = "London";  } } // Создаем объект класса Coor: $object = new Coor; // Для инициализации объекта сразу вызываем метод: $object->Init(); ?>

Главное не забыть вызвать функцию сразу после создания объекта, либо вызвать какой-нибудь метод между созданием (оператор new) объекта и его инициализацией (вызовом Init).

Для того, чтобы PHP знал, что определенный метод нужно вызывать автоматически при создании объекта, ему нужно дать имя такое же, как и у класса (Coor):

function Coor ($name) $this->name = $name; $this->city = "London"; }

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

Наследование и полиморфизм классов в PHP

Наследование классов в PHP

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

<?php class Parent { function parent_funct() { echo "<h1>Это родительская функция</h1>"; } function test () { echo "<h1>Это родительский класс</h1>"; } } class Child extends Parent { function child_funct() { echo "<h2>Это дочерняя функция</h2>"; } function test () { echo "<h2>Это дочерний класс</h2>"; } } $object = new Parent; $object = new Child; $object->parent_funct(); // Выводит 'Это родительская функция' $object->child_funct(); // Выводит 'Это дочерняя функция' $object->test(); // Выводит 'Это дочерний класс' ?>

Ключевое слово extends (см. пример) говорит о том, что дочерний класс Child наследует все методы и свойства класса Parent. Родительский класс обычно называют базовым классом или суперклассом, а дочерний класс Child - производным или подклассом.

Полиморфизм классов в PHP

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

<?php class Base {  function funct() {  echo "<h2>Функция базового класса</h2>";  }  function base_funct() {  $this->funct();  } } class Derivative extends Base {  function funct() {  echo "<h3>Функция производного класса</h3>";  } } $b = new Base(); $d = new Derivative(); $b->base_funct(); $d->funct(); $d->base_funct(); // Скрипт выводит: // Функция базового класса // Функция производного класса // Функция производного класса ?>

В рассмотренном примере функция base_funct() класса Base была перезаписана одноименной функцией класса Derivative. Функция, переопределенная таким образом, называется виртуальной.

Лекция 16

Веб-сервер Apache

Apache используется для организации большинства веб-серверов в мире и является самым массовым продуктом своего класса.

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

Специально для Apache созданы версии таких популярных языков программирования как Perl и PHP, а также этот сервер легко интегрируется с широко применяемыми СУБД (например, MySQL).

Главный сайт проекта находится по адресу httpd.apache.org, а основная документация доступна на странице httpd.apache.org/docs/.

Пользователям  предоставляется возможность самостоятельной конфигурации Apache путем использования соответствующих директив в файле .htaccess. Таким образом можно решить большинство задач по конфигурации веб-серверов.

Индексный файл

Индексный файл или файл-индекс — это тот файл, который открывается по умолчанию при обращении пользователя через веб к каталогу, а не к конкретному файлу. Например, ваш посетитель запросит адрес http://ваш_домен/price/, где price — название каталога. Индексный файл это тот файл, который будет показан пользователю при обращении к каталогу без указании имени конкретного файла в нем.

По умолчанию индексными файлами являются следующие: index.html, index.htm, index.php, index.php3, index.phtml, index.shtml, default.htm или default.html. Если вы хотите чтобы первым открывался какой-то иной файл, нужно переопределить текущие значения. Если вы хотите переопределить индексный файл и сделать так, чтобы первым открывался не index.htm, а, например, файл myindex.php, то сделать это можно поместив в файл .htaccess в соответствующем каталоге следующую инструкцию:

DirectoryIndex myindex.php

Получив .htaccess с таким содержимым, веб-сервер Apache откроет по умолчанию именно файл myindex.php.

Назначение и использование файла .htaccess

Файл .htaccess (обратите внимание, что первый символ в названии файла — точка) применяется для управления веб-сервером Apache со стороны конечного пользователя хостинга. Вы помещаете в этот файл директивы, которые веб-сервер воспринимает и обрабатывает, выполняя действия в соответствии с настройками, которые были сделаны пользователем.

Файл .htaccess может быть размещен в корневом каталоге веб-сервера (прямо в каталоге www). В этом случае директивы из такого .htaccess действуют по всему веб-серверу. Также .htaccess может находиться и в конкретном подкаталоге сервера. Тогда директивы, которые указаны в этом файле, «перекрывают» действие директив из «основного» файла, который размещен в каталоге www или в любом каталоге более высокого уровня. То есть, действие директив из .htaccess наследуется сверху вниз, но не наоборот. Изменения, внесенные в файл, вступают в силу немедленно. Это связано с тем, что информация из .htaccess перечитывается при каждом обращении к веб-серверу Apache.

В .htaccess может быть помещено большинство из доступных директив для веб-сервера. Следует заметить, что директивы, в описании которых в поле Context отсутствует упоминание .htaccess недоступны для использования в этом файле конфигурации. На примере директивы AddType видим, что поле Context содержит упоминание о .htaccess, соответственно вы можете ее использовать.

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

Как переопределить кодировку html-документов

Мы хотим «объяснить» веб-серверу что все html-документы, которые размещены на сервере, нужно «отдавать» клиенту в кодировке koi8-r, а не в windows-1251, как это сервер делает по умолчанию. Для этого поместим в .htaccess строку:

AddType "text/html; charset=koi8-r" .html .htm .shtml

Получив такой .htaccess, веб-сервер Apache станет выдавать клиентскому браузеру заголовок, в котором будет указано, что документ имеет кодировку koi8-r.

Если на вашем ресурсе существуют html-документы в разных кодировках, (ISO-8859-1, Windows-1250, Windows-1252, UTF-8), то вам, возможно, будет необходимо отключить принудительную выдачу заголовка с кодировкой windows-1251. Для этого в .htaccess добавляется строка:

AddDefaultCharset Off

При этом соответствующая кодировка должна быть прописана на каждой html-странице в виде тега <http-equiv="Content-type" content="text/html; charset=windows-1251" />

Это примеры простейшего использования возможностей конфигурирования Apache через файл .htaccess.

Как закрыть директорию паролем

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

В каталоге, к которому хотим ограничить доступ по паролю, создаем файл .htaccess с такими директивами:

AuthType Basic

AuthName "Some Name"

AuthUserFile /home/uXXXXX/.htpasswd

require valid-user 

Путь /home/uXXXXX/.htpasswd обозначает полный путь к файлу паролей на диске нашего сервера. Если, например, вы поместите файл .htpasswd (в нем будут пароли) в домашний каталог, куда вы попадаете зайдя на сервер по FTP, то путь к этому файлу будет иметь вид /home/uXXXXX/.htpasswd, где uXXXXX — наименование вашей виртуальной площадки (например, u12345).

В директиве AuthUserFile указываем абсолютный путь к файлу с логинами/паролями, который мы создадим чуть позже. Если вы создаете файл .htaccess на своем компьютере, а не сразу на сервере при помощи текстового редактора, обратите внимание на то, что .htaccess должен передаваться по FTP строго в текстовом (ASCII) режиме.

Создаем файл паролей. Файл с паролями должен содержать строки вида login:password. Пароль должен быть зашифрован с использованием алгоритма MD5. Один из способов создать такой файл — воспользоваться программой, входящей в поставку Apache — htpasswd (на  сервере она находится в каталоге /usr/local/bin/, полный путь — /usr/local/bin/htpasswd).

htpasswd -mbc .htpasswd user1 sNQ7j9oR2w

создаем новый файл .htpasswd, в который добавляем запись для пользователя user1 с паролем, указанным в командной строке. Обязательно заменить sNQ7j9oR2w на любой собственный пароль — здесь этот пароль указан только для примера

htpasswd .htpasswd user2

добавляем в уже существующий файл .htpasswd пользователя user2, а пароль вводим вручную в ответ на соответствующий запрос программы . После окончания заведения всех логинов файл нужно загрузить на сервер.

Запрет и разрешение выдачи листинга

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

Options +Indexes

Файл .htaccess необходимо создавать именно в том каталоге, в котором планируется разрешить листинг. Данная директива будет действовать также и на все подкаталоги (это достигается включенной по умолчанию в настройках виртуального хоста директивой AllowOverride All).

По умолчанию включена директива Options -Indexes, и в случае отсутствия индексной страницы вы получите HTTP ошибку 403.

Собственные страницы ошибок

Иногда посетители веб-сервера запрашивают страницы, которые по каким-то причинам на сервере не существуют: неправильная ссылка с другой страницы или с другого сайта, владелец сервера случайно удалил документ и так далее. По умолчанию Apache выдает некую довольно аскетичную страницу, на которой находится сообщение вроде «File not found». Вы можете создать альтернативную версию этой страницы, задав обработчик этой ошибки через .htaccess.

Общие сведения о кодах

Коды ошибок бывают положительными и отрицательными или успешными и неуспешными. Есть четыре типа кодов:

2xx — запрос выполнен успешно — сервер успешно отправил клиенту запрашиваемый документ

3xx — запрос успешно перенаправлен — тоже положительный код. Он говорит о том, что запрос клиента был перенаправлен. Используется при работе с кэширующими серверами, а также в алгоритме, когда браузер клиента проверяет актуальность документа на сервере (дату создания, размер и так далее)

4xx — ошибка — документ не был отправлен клиенту, так как произошла критическая ошибка. Например, запрошенный документ не найден на сервере, доступ к документу запрещен и так далее

5xx — ошибка сервера — критическая ошибка на сервере. Например, на сервере не смог нормально отработать скрипт пользователя.

Возможные ошибки при первичном размещении сайта

Вы разместили сайт на хостинге компании .masterhost, загрузили файлы и получили ошибку 403 при попытке открыть сайт через браузер. Эта ошибка возникает в случае, если вы неправильно назвали индексный файл, который должен показываться при обращении к каталогу. Индексный файл может иметь названия index.html, index.htm, index.php, index.php3, index.phtml, index.shtml, default.htm или default.html. Также возможно, что в названии индексного файла присутствуют заглавные (большие) буквы. В UNIX-системах регистр букв в названиях файлов имеет значение (!).

Ошибка — показывается список файлов вместо первой страницы.

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

Ошибка 403 «Доступ запрещен» — устраняем причины

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

В каталоге нет индексного файла (index.html, например) и при этом запрещен просмотр списка файлов в данном каталоге* или на всем виртуальном сервере.

Можно попробовать создать файл с именем index.html и посмотреть не исчезнет ли ошибка.

Выставлены такие «права» доступа на файл, что веб-сервер Apache не смог прочитать файл на диске сервера. Попробуйте изменить права доступа на 644, например.

Пользователь попытался обратиться к скрипту (в каталоге cgi-bin), на который выставлены неправильные права — нет права на чтение+исполнение (r+x) конкретного скрипта. Измените права на 755.

*По умолчанию просмотр списка файлов в каталоге запрещен. Для того, чтобы разрешить вывод списка файлов необходимо создать файл .htaccess, в котором прописать директиву Options +Indexes в виде отдельной строки.

Обработка ошибки 404 «Файл не найден»

Ошибка 404 (Файл не найден) возникает тогда, когда пользователь запрашивает у веб-сервера документ, которого нет на диске. То есть, когда пользователь запрашивает несуществующий файл. Это наиболее «популярная» из всех ошибок. Вы можете наблюдать возникновение таких ошибок в файле error_log и учитывать это — отслеживать какие документы на сервере «не найдены» и корректировать неправильные ссылки из своих html-документов. Также ссылки на несуществующие документы могут вести с других сайтов.

Для удобства посетителей сайта можно обрабатывать ошибки 404 заменяя стандартные ответы веб-сервера на свои страницы с нужным описанием причины возникновения ошибки и советами что делать в этом случае. Также полезно разместить на такой странице карту вашего сайта или ссылку на поисковую систему.

Как обрабатывать ошибку 404.

Создайте в каталоге www файл .htaccess и поместите в него следующую инструкцию для веб-сервера Apache:

ErrorDocument 404 /not-found.html

Затем создайте файл not-found.html в который поместите описание возникшей ошибки и советы о том, что делать в этом случае посетителю вашего сайта. Теперь пользователь, который наберет в своем браузере адрес несуществующей страницы, будет автоматически перенаправлен сервером на файл not-found.html.

С помощью директивы ErrorDocument можно обрабатывать не только ошибку 404, но и практически все другие ошибки. Например, можно обработать так и ошибку 403.Внимание: особенность браузеров MS Internet Explorer версий 5.xx и 6.xx состоит в том, что если ваш файл ошибок будет иметь размер менее 512 байт, то браузер покажет пользователю не ваш файл, а свое собственное сообщение об ошибке 404. Самым простым решением в данной ситуации является заполнение файла ошибок пробелами так, чтобы его размер превысил 512 байт. Подробнее об этом вы можете прочитать на сайте компании Microsoft.

Ошибка 500 «Internal Server Error»

Ошибка 500 «Internal Server Error» возникает в случае невозможности запуска скрипта, который вы разместили на сервере, в случае ошибок в скрипте, а также в случае, когда размещена неправильная инструкция в файле .htaccess. Этот список причин возникновения ошибки 500 не конечный, есть еще масса причин, по которым может возникнуть ошибка 500. Однако, упомянутые три случая встречаются наиболее часто.

Рассмотрим сначала случай, когда вы поместили некорректную инструкцию в файл .htaccess. Если вы ошиблись в написании названия нужной директивы или параметров к ней, в файле error.log вы найдете примерно такую ошибку:

[Wed Apr 14 17:01:38 2004] [alert] [client 217.16.16.16] /home/uXXXXX/aaa.ru/www/.htaccess:Invalid command 'DrectoryIndex', perhaps mis-spelled or defined bya module not included in the server configuration

Веб-сервер укажет вам, какую конкретно директиву он посчитал ошибочной — ее нужно будет исправить. В данном случае веб-сервер сообщил, что директивы DrectoryIndex он не знает. И действительно — нет директивы DrectoryIndex, есть DirectoryIndex. Имеет место опечатка.

Запрет доступа с некоторых IP-адресов.

Иногда возникает необходимость запретить доступ к сайту или его части с некоторых IP-адресов.

В  таком случае необходимо создать в нужной директории файл .htaccess с директивами. Например, чтобы запретить доступ с IP-адреса 172.16.16.16:

Order Allow,Deny

Allow from All

Deny from 172.16.16.16

Теперь при попытке обратиться к сайту с IP-адреса 172.16.16.16 посетитель получит ошибку 403 или вашу страницу для этой ошибки.

Указание части адреса в виде 172.16.16 ограничит доступ из подсети 172.16.16/24.

Запрет доступа к некоторым файлам.

Иногда возникает необходимость запретить доступ к определенным файлам. Например, к конфигурационным файлам, содержащим реквизиты доступа к базам данных, интерфейсам и т.п. Допустим, в файле config.cfg вы храните логин/пароль доступа к базе данных. Создаем в этой директории файл .htaccess с директивами:

<FilesMatch "\.(cfg)$">

Order allow,deny

Deny from all

</FilesMatch>

Теперь, если посетитель наберет в браузере нечто вида http://www.ваш_домен.ru//config.cfg, он получит ошибку 403 или вашу страницу для этой ошибки.

Заголовок last-modified

В ряде случаев требуется, чтобы web-сервер выдавал HTTP-заголовок Last-Modified. К примеру, при регистрации вашего ресурса на Яндексе, возникает ошибка «Неправильные даты». Для статических документов cервер будет выдавать значение last-modified всегда. Это действительно для html-файлов. Для SSI cервер будет выдавать значение last-modified в том случае, если прописана директива «XBitHack full» (просто пропишите эту строку в .htaccess), и для файла, к которому происходит обращение, выставлен атрибут «исполняемый» для группы. В скриптах last-modified выдается иными средствами. Например, если учесть то, что php-скрипт генерирует код динамически, то самым логичным будет в качестве last-modified отдавать текущую дату и время./>

Реализуется это следующим образом:

<? header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); ?>

Внимание: команда header должна выполняться в php-скрипте до того, как скрипт начнет выдавать html-текст в браузер пользователя.

Управление кэшированием.

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

Настройка параметров модуля mod_expires производится в файле .htaccess, что позволяет сделать индивидуальные настройки для каждого каталога.

В приведенном ниже примере отключено кэширование для текстовых документов, установлен период обновления для файлов с расширением gif — 3 месяца с момента изменения файла, для файлов с расширением jpeg — 1 день с момента обращения:

ExpiresActive on

ExpiresByType image/jpeg "access plus 1 day"

ExpiresByType image/gif "modification plus 3 months"

ExpiresByType text/html "now"

Примечание: При использовании Parser если вам необходимо полностью исключить заголовки от модуля Apache mod_expires, то для этого необходимо в директории с parser3.cgi создать файл .htaccess и внести в него следующую директиву: ExpiresActive off

Как создать переадресацию.

Если у вас размещены 2 домена (не обязательно на одной площадке) domain1.tld и domain2.tld, и вам необходимо, чтобы при обращении к domain2.tld у пользователей изменялся адрес на «правильный», и сразу происходило перенаправление, тогда добавьте для домена domain2.tld переадресацию на http://domain1.tld/.

Если вам необходимо, чтобы при обращении к вашему домену domain.tld происходило автоматическое перенаправление на www.domain.tld, создайте на виртуальной площадке в директории /home/uXXXX/domain.tld/www файл .htaccess (обратите внимание на то, что название файла начинается с точки) следующего содержания:

RewriteEngine on

RewriteCond %{HTTP_HOST} ^domain\.tld

RewriteRule ^(.*)$ http://www.domain.tld/$1 [R=permanent,L]

где uXXXX — имя вашей виртуальной площадки, domain.tld — имя вашего домена

Особенность переадресации на синонимах.

Предположим, есть домен domain1.tld и синоним domain2.tld. Если запросить в браузере адрес http://domain2.tld/dir/ со знаком слэша в конце, то будет отображена индексная страница из директории dir основного домена, при этом содержимое адресной строки браузера останется без изменений. Но если запросить http://domain2.tld/dir без слэша в конце, то произойдёт переадресация на http://domain1.tld/dir/, и содержимое адресной строки изменится соответствующим образом.

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

Если такое поведение веб-сервера вас не устраивает, добавьте в файл .htaccess следующие строки:

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} -d

RewriteCond %{REQUEST_URI} !^domain2.tld$

RewriteRule ^(.+[^/])$ http://domain2.tld/$1/ [R]

Установленные модули Apache.

Список стандартных и дополнительных модулей для веб-сервера Apache, которые установлены на хостинговых машинах:

mod_env

mod_log_config

mod_mime

mod_status

mod_include

mod_autoindex

mod_dir

mod_cgi

mod_actions

mod_alias

mod_rewrite

mod_access

mod_auth

mod_expires

mod_setenvif

mod_php

Лекция 17. Хостинг

Хостинг — это услуга по размещению сайтов, веб-сервисов, приложений и многого другого.

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

Домен – это уникальное символьное имя сайта, состоящее из букв и цифр

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]