Синтаксис языка и операторы
В данном разделе описываются все возможности языка, которые имеет РНР версии 4.0.6. Представленная информация ориентирована на ярус познании читателя, имеющего навыки программирования. Высказанный материал разрешает в предельно короткий срок исследовать все возможности языка, в будущем книга может применяться в качестве справочного пособия. Теги, маркирующие РНР-сценарий Сценариям Р?1Р традиционно присваивают растяжения .php, .phtml, .php3 (для версии 3). Реально это html-страницы, вовнутрь которых внедрен PHP-код, ограниченный одной из четырех пар тегов. Рекомендуется применять теги <?РНР и ?>. Сокращенной формой является пара <? и ?>; для того, дабы се применять, нужно в файле конфигурации php.ini установить параметр short_open_tag=0rr либо перекомпилировать РНР с параметром — enable-short-tags. Эта форма ограничителей может конфликтовать с синтаксисом XHTML. Ограничители в жанре html <script language="php"> и </script> применяются для того, дабы html-редакторы (скажем, FrontPage) могли адекватно интерпретировать PHP-код и отличать его от html (для HomeSite это не актуально — он горазд воспринимать все четыре формы ограничителей). ASP-ограничители <% и%> дозволено применять, если в файле конфигурации php.ini установить параметр asp_tags = On, при этом становится допустимым применение функции упрощенного итога значения переменной <%=$value!%> (ее также дозволено применять с сокращенной формой тегов, скажем <?=$value?>). Распределение инструкций Вся инструкция РНР (аналогично языкам С и Perl) должна завершаться точкой с запятой. Скажем:
Если инструкция одна, этого не требуется. Скажем:
Комментарии PHP поддерживает три жанра комментариев: С, C++ и Unix. <?php echo "Здравствуй!". РНР поддерживает пять основных типов данных1: целые числа, дробные числа, строки, массивы и объекты. В документации РНР не указано, но имеется также логичный тип (boolean): TRUE, FALSE; и особый тип NULL для пустых2 (либо неинициализированных значений). Традиционно тип переменной не указывается, а механически определяется интерпретатором во время исполнения. Дозволено принудительно задать тип переменной. Целые числа Целые числа указываются дальнейшим образом: $а = 1234; # десятичное целое $а = -123; # негативное число $а = 0123; # восьмеричное число Размерность целых чисел зависит от платформы, обыкновенно она составляет 32 бита (+ 2 млн). Дробные числа Дробные числа (doubles) могут быть инициализированы дальнейшим образом:
Размерность дробных чисел зависит от платформы, обыкновенная максимальная точность -1.8е308 либо примерно 14 десятичных значащих разрядов (64 бита в формате IEEE). В процессе арифметических реформирований неотвратима потеря точности (скажем, выражение floor((0.1+0.7)*10) возвратит 7 взамен ожидаемых 8, потому что реально ((0.1+0.7)*10)=7,99999999...). Помимо того, нереально точное сравнение иррациональных чисел (скажем, 1/3=0.3333333). Следственно невозможно доверять точности последней цифры дробных чисел, а также сопоставлять их без округления. Если требуется больше высокая точность вычислений, обратитесь к функциям GMP либо BCMath. Строки Строки могут быть обозначены двумя парами ограничителей (одинарные и двойные кавычки). При применении одинарных кавычек строка понимается «как есть»; исключительная замена, которая производится в строке, — это трансформация «\\» и «V» соответственно в «\» и «'», исполняемая для того, дабы дозволено было применять эти символы, если они обозначают самих себя. Применение двойных кавычек разрешает интерпретатору заменить указанную в строке переменную на ее значение, скажем:
Дабы вывести позже значения переменной символы без распределения их пробелами, используйте завершение переменной в фигурные скобки.
Для подстановки значений свойств вложенных объектов и многомерных массивов также используйте фигурные скобки либо конкатенацию.
Обратный слеш «\» (так же, как в С и Perl) применяется для подстановки особых символов.
Если позже слеша стоит другой сиМbол, будет выдано предупреждение (если выдача предупреждений разрешена). Другой метод обозначения длинных строк — это применение синтаксиса «here doc1 цитирование»: позже последовательности <« указывается идентификатор, и все дальнейшие строки, вплотную до того как опять встретится данный идентификатор (он должен стоять в исходной позиции строки), считаются текстом строки. К идентификатору используются те же требования, как и к именам переменных (он должен начинаться с буквы либо «_» и содержать только алфавитно-цифровые символы либо «_»). Цитирование подобно применению двойных кавычек, но кавычки тут обозначают самих себя. Такой синтаксис обширно применяется в Perl.
<?php $str = <«fndOfSl Пример многострочной строки синтаксиса «heredoc». EndOfSl. /* Пример потруднее с переменными. */ class foo { echo " строка 1 строка 2 var $foo: var $bar: function foo() { // конструктор класса $tms->foo = 'Foo'. $this->t>ar = arrayCBarl1. 'Ваг2'. 'ЕагЗ'): } } $foo = new foot); $name = 'Игорь' : echo «< EndOfS? Мое имя - "Sname". Строки дозволено объединять с поддержкой оператора конкатенации — точка, скажем: Оператор сложения «+» не объединяет строки! Строку дозволено применять как нумерованный массив символов, применяя С-сходственный синтаксис.
Реформирование типа строк При реформировании строки в числовое значение результирующая неременная будет иметь тип дробного числа, если строка содержит символы «.», «е», «Е»; в отвратном случае результирующая пере-\ менная окажется целочисленной. Значение определяется по исходным цифрам строки, а если строка начинается с букв, ее числовое значение будет равно нулю. Верным строковым представлени-_—s ем числа считается знак («-» либо «+», тот, что может отсутствовать у позитивных чисел), за которым следует последовательность чисел, среди которых могут встречаться точка и/или буква «е». Незначащий нуль может быть пропущен.
Как видите, реформирование строк в числа происходит при осуществлении с ними арифметических операций, и если строка — это 1-й элемент выражения, тип ее реформирования зависит от типа последующих чисел. Если вы хотите проверить примеры, приведенные выше, добавьте строку: echo "\$а == $а: тип (" gettype ($а) . ")<br>\n"; Массивы Массивы могут быть и делать как примитивные индексированные списки (их называют векторами — в них индексом является число) либо как ассоциативные списки (их называют хеш-таблицами — в них индексом служит строковое значение). Как в С и Perl, элементы массива нумеруются, начиная с 0, а не с 1. Одномерные массивы Массив дозволено инициализировать либо простым присваиванием ему новых элементов, либо очевидно, применяя функцию аггауО. При добавлении в массив элемента без указания его индекса он заносится в конец списка.
Массивы дозволено после этого сортировать. Число элементов массива дозволено узнать, применяя функцию countO. Для поэлементного перебора значений ассоциативного массива применяются функции next (), prev() и each(). Многомерные массивы
Для верной подстановки значений многомерных массивов используйте оператор конкатенации либо заключайте имя переменной в фигурные скобки. Напротив функция итога будет воспринимать как относящиеся к массиву только первые скобки, а дальнейшие — как текст.
Объекты Объекты создаются на основе предварительно определенных классов с поддержкой оператора new:
Определение типа PHP не требует очевидного указания типа переменной, тип определяется интерпретатором во время выполнения и зависимости от того, как переменная применяется (и какие значения ей присваиваются). Обыкновенно такие реформирования подсознательно внятны (скажем, если одно из слагаемых дробное число, то итог — дробное число). Сами переменные не меняют своего типа, изменяется их воспринятие. Тип изменяется только при присваивании либо изменении значения.
Что касается механических реформирований массивов, то тут появляются неоднозначности.
Помните, что строки могут рассматриваться как массивы символов. Как поведет себя дальнейший код:
В некоторых версиях РНР 4 итог этой операции не определен. Ожидается, что задача будет скоро разрешена. Множество функций возвращает значение FALSE при ошибке, а в случае типичного заключения — значение, чудесное от FALSE. Для того дабы дозволено было отличить значение FALSE от пустой строки либо нуля, используйте оператор идентичности (а не равенства, тот, что механически преобразует тип).
Приведенный сценарий должен вывести
Очевидное приведение типов Приведение типов сходно с С-жанром: тип переменной указывается перед начальной переменной.
Типы обозначаются как: (int), (integer) для целых; (real), (double), (float) для дробей; (string) для строк; (array) для массивов; (object) для объектов. Для логических значений: (bool) либо (boolean). Тип также дозволено изменить функцией settype(). Подметьте, некоторые виды реформирований могут быть курьезными. При реформировании скалярного1 массива либо строки в массив переменная становится нулевым элементом массива.
При реформировании скалярного массива либо строки в объект переменная становится свойством объекта с именем scalar:
Переменные помечаются знаком бакса, за которым следует имя переменной (как в Perl). Имена переменных эмоциональны к регистру (скажем, $а и $А — различные переменные); первым символом имени должна быть буква либо знак подчеркивания «_», за которым следует любая комбинация буквенно-цифровых символов и/или «_». Буквы могут быть латинскими: a-z, A-Z, либо ASCII-символами с кодами от 127 до 255. Подметьте, PHP, в различие от многих компиляторов (языков), разрешает применять символы кириллицы в именах переменных.
РПР 4 разрешает передавать значения переменных не только копированием, но и «по ссылке». Тогда новая переменная будет легко ссылаться на ветхую и станет ее псевдонимом (alias). Метаморфозы одной из них будут так же отражаться и на иной. Дабы связать по ссылке две переменных, перед начальной переменной ставится амперсант «&».
Безусловно, что ссылка может указывать только на переменную.
Предопределенные переменные Состав предопределенных переменных РНР во многом зависит от серверного ПО и его конфигурации. Не все из них доступны при запуске сценария из командной строки. Дабы узнать, какие из переменных доступны, и узнать их значения, воспользуйтесь функцией phpinfo(). Переменные РНР Эти переменные создаются самим РНР. Переменные SH7TP_*_VARS доступны, только если разрешен параметр конфигурации track_vars (в РНР 4.0.3 он разрешен неизменно, вне зависимости от файла конфигурации). При установке директивы register_globals в файле конфигурации эти переменные становятся глобально доступными (реально они копируются в массив SGLOBALSC]). Эту установку следует применять с осторожностью, а отличнее совсем исключить, потому что хранение переменных в массивах безвредно, а всеобщии эквиваленты могут быть перезаписаны передачей сценарию одноименных параметров (не исключая и злоумышленного варианта сходственной операции). В случае неосуществимости блокирования данной установки удостоверьтесь, что данные, которые вы используете из этих переменных, безвредны. $argv[] Массив доводов, передаваемых сценарию. При запуске сценария iu командной строки данный массив содержит список параметров командной строки, как и в С. При вызове способом GET он содержит строку запроса (то есть то, что следует позже имени сценария за знаком вопроса). $argc Число доводов, передаваемых сценарию (и, соответственно, содержащихся в массиве Sargv[]). Равно count(Sargv). Для сценария, запускаемого из командной строки, это число параметров; для PHP-страницы это значение 0 либо 1. $PHP_SEI.F Файловое имя нынешнего исполняемого сценария РНР касательно корневого каталога web-сервера (скажем, «/index.php»). При запуске сценария из командной строки значение недостижимо. $HTTP_COOKIE_VARSn Ассоциативный массив переменных, посылаемых сценарию через HTTP cookies. $HTTP_GET_VARS[] Ассоциативный массив переменных, посылаемых сценарию способом HTTP GET (указываются в строке HTTP запроса). $HTTP_POST_VARS[] Ассоциативный массив переменных, посылаемых сценарию способом HTTP POST (передаются от html-форм, спрятано от пользователя). $HTTP_POST_FILES[] Ассоциативный массив, содержащих информацию о файлах, загружаемых на web-сервер способом HTTP POST. $HTTP_ENV_VARS[] Ассоциативный массив переменных окружения среды, в которой запущен сценарий (скажем, OS, Path, TEMP, System Root и т. п.). $HTTP_SERVER_VARS[] Ассоциативный массив переменных web-сервера. См. ниже. Переменные web-сервера (Apache) - $HTTP_SERVER_VARS[] Приведенные переменные создаются web-сервером Apache. Другие серверы имеют сходный комплект переменных. Множество переменных декларировано спецификацией CGI 1.1 (http://hoohoo.ncsa.uiuc. edu/cgi/env.html) Если сценарий запущен из командной строки, множество из них недостижимо. GATEWAYJNTERFACE Версия CGI спецификации, применяемой web-сервером; скажем, «CGI/1.1». SERVER_NAME Имя хоста сервера, скажем «localhost». Если сценарий запускается с виртуального хоста, то применяется имя для этого хоста. SERVER_SOFTVJARE' Изложение серверного ПО, передающееся в заголовках результатов на запрос HTTP (скажем, «Microsoft-IIS/5.0»). SERVER_PROTOCOL Протокол, по которому запрашивается web-страница и ее версия, скажем «НТТР/1.0». REQUEST_METHOD Способ HTTP запроса, которым запрашивается web-страница: «GET», «HEAD», «POST» либо «PUT». QUERY_STRING Строка параметров запроса. Скажем, для запроса «http:// localhost\index.php?x=5&s=id» этой строкой будет «x=5&s=d». DOCUMENT_ROOT Корневой каталог web-сервера, определяемый его конфигурацией. НТТР_АССЕРТ Оглавление заголовка Accept: у нынешнего запроса, если он указан. HTTP_ACCEPT_CHARSET Оглавление заголовка Charset: у нынешнего запроса, если он указан. Скажем: «iso-8859-l,*,utf-8». HTTP_ENCODING Оглавление заголовка Accept-Encoding: у нынешнего запроса, если он указан. Скажем: «gzip». HTTP_ACCEPT_LANGUAGE Оглавление заголовка Accept-Language: у нынешнего запроса, если он указан. Скажем: «en». HTTP_CONNECTION Оглавление заголовка Connection: у нынешнего запроса, если он указан. Скажем: «Keep-Alive». HTTP_HOST Оглавление заголовка Host: у нынешнего запроса, если он указан. Аналогично SERVER NAME. HTTP_REFERER Адрес страницы, с которой осуществлен переход на нынешнюю. Значение посылается множеством из браузеров, но не всеми. I HTTP_USER_AGENT Оглавление заголовка User_Agent: нынешнего запроса, если он указан. Кодификация тина браузера и клиентского ПО, от которого получен запрос. Скажем: Mozilla/4.5 [en] (XI1; U; Linux 2.2.9 1586) либо MoziIla/4.0 (compatible; MSIE 5.01; Windows NT 5.0). Это значение (оно применяется функцией get_browser()) имеет толк применять для подгонки функциональности страницы (скажем, особенностей JavaScript) иод возможности браузера. REMOTE_AODR IP адрес заказчика, просматривающего нынешнюю страницу. REMOTE_PORT Порт, применяемый заказчиком для коммуникации с web-сервером. SCRIPT_FILENAME Имя сценария, включающее безусловный путь к нему (по словам web-сервера). SERVER_ADMIN Установка «менеджер сервера» конфигурации web-сервера. SERVER_PORT Порт, применяемый web-сервером для коммуникации с заказчиком. Определяется конфигурацией web-сервера. Обыкновенно 80, для SSL (безвредных соединений) по умолчанию 443. SERVER_SIGNATURE Строка, содержащая версию сервера и имя виртуального хоста, добавляемая к генерируемым страницам, если эта функция применяется. PATHJRANSLATED Имя сценария, включающее безусловный путь к нему (указывается расположение сценария в файловой системе, а не в каталогах web-сервера). Сравните со SCRIPT_FILENAME. SCRIPTJIAME Путь к нынешнему сценарию в web-каталогах. REQUESTER I Строка, которой запрашивается сценарий, скажем: «/index.html». Область видимости переменной Область видимости переменной — это контекст, в котором переменная сберегает свое значение и это значение доступно. В РНР область видимости ограничена нынешним файлом, но распространяется на файлы, присоединяемые директивами include и require.
Это отличает РНР от С, где внешние переменные неизменно доступны внутри функций, если только внутри функции не объявляется переменная с именем внешней. Это сделано для того, дабы внутри функций невозможно было нечаянно изменить внешние переменные. Если же все-таки требуется доступ к внешним переменным, они обязаны быть объявлены глобальными внутри функции.
Иной метод доступа к внешним неременным — это обращение к ассоциативному массиву $GLOBALS, в котором содержатся все переменные, используемые вне функций.
Дозволено пойти на ухищрения и сделать всеобщии переменные доступными для чтения внутри функции с подмогой функции extract():
Статические переменные Статические переменные не уничтожаются позже заключения функции и сберегают свое значение на протяжении каждого времени исполнения сценария. Инициализируются они только при первом запуске функции.
Статические переменные также применяются при рекурсивных вызовах (то есть когда функция вызывает сама себя). Не позабудьте обеспечить контроль за тем, дабы рекурсивный вызов не привел к безграничному циклу!
«Переменные» переменные (оператор $) Изредка требуется иметь изменяемые имена переменных, скажем в случае, если надобно будет изготавливать типовые действия над разными переменными, но еще незнакомо, какими именно. Такие переменные перед своим «именем» имеют двойственный знак бакса взамен одного, дабы дозволено было изменять их значения (то есть значения тех неременных, на которые они указывают). При этом если перед такой переменной стоит одинарный знак бакса, ее значение является именем реальной переменной. Возможен, $А = "X", а $$А = "value", тогда $Х = "value"'.
При применении «переменных» переменных с массивами появляется загвоздка неопределенности. Что обозначает $$а[1]? Допустимо, вы хотите применять переменную с именем, содержащимся в $а[1], либо $$а как переменную массива, а после этого ее элемент [1]. В первом случае мы имеем дело с массивом указателей, а во втором — с указателем на массив. Синтаксис фигурных скобок разрешает эту задачу: ${$а[1]} для первого случая и ${$а}[1] для второго. Для того дабы положительно интерпретировать действие двойного знака бакса, думайте о первом из них, как об операторе разыменования. От того что РНР интерпретирует код, то допустимо даже применять выражения в именах переменных (в фигурных скобках оператора разыменования):
Передача переменных PHP-сценарию HTML-формы При вызове PHP-сценария HTML-формой все переменные формы механически становятся доступными сценарию. При включенном параметре конфигурации track_vars все эти переменные после этого сохраняются в ассоциативных массивах $HTTP_POST_VARS, $HTTP_GET_VARS и/или $HTTP_POST_FILES, в зависимости от способа вызова сценария ($НТТР_ SERVERJ/ARS [REQUEST_METHOD] ).
При посылке данных этой формы текст, введенный в поле Name, сохраняется в $HTTP_POST_VARS['username']. При включенной директиве конфигурации register_globa1s на глобальном ярусе это значение становится также доступно в переменной Susername. Данные могут также быть посланы формой и после этого распознаны РНР, если они заносятся в массивы. Таким методом допустимо группировать связанные переменные либо получать данные с мультиселек-тивпых элементов ввода:
Также PHP 4 дозволяет применять в формах многомерные массивы. Имена переменных кнопки IMAGE SUBMIT Взамен кнопки submit (отправить) для форм допустимо применение картинки:
При щелчке мытью на этом рисунке и отправке данных формы посылаются два дополнительных значения: sub_x и sub_y. Они содержат относительные координаты точки нажатия на рисунок. Знатоки подметят, что браузером на самом деле посылаются переменные, поделенные точкой (sub.x и sub.у), но РНР механически преобразует точки в знаки подчеркивания. HTTP Cookies РНР неприметно для пользователя поддерживает HTTP cookies, следуя спецификации Netscape (http://www.netscape.com/newsref/std/ cookie_ spec.html). Cookies — это механизм хранения данных на стороне заказчика, осуществляемый браузером для того, дабы сервер мог опознать пользователей, некогда посетивших сайт. Применять cookies дозволяет функция SetCookie(). Cookies передаются в заголовке HTTP, следственно вызывать функцию SetCookie нужно до того, как всякий текст будет передан браузеру. С тем же лимитацией дозволено применять функцию Header(). Все cookies, отправляемые серверу заказчиком, механически становятся PHP-переменными, аналогично данным, передаваемым способами GET и POST. Если требуется назначить одному cookie несколько значений, легко добавьте [] к его имени. Скажем:
При посылке браузеру cookie с именем теснее имеющегося у браузера новейший cookie заменит ветхий, если доменное имя и путь к сценарию у ветхого и нового cookie совпадают. Следственно если требуется не замена значения, а добавление (напри-мер, для корзины покупок в «электронном магазине»), то нужно передавать значение в новом элементе массива, сопровождающееся автоинкрементируемым значением счетчика. Скажем:
Переменные окружения среды РНР механически делает переменные окружения среды доступными для сценария, как обыкновенные переменные РНР.
Потому что информация, передаваемая способами GET, POST и в Cookie, также создает переменные на глобальном ярусе РНР, и их имена могут конфликтовать между собой, бывает пригодно узнать значение неременных среды очевидно, применяя функцию getenv(). Для установки значений переменной в окружении среды применяется функция putenv(). Точки в именах получаемых переменных Традиционно РНР не изменяет имена передаваемых сценарию переменных. Но подметьте, что присутствие точки в имени переменной вызовет ошибку при попытке ее применения.
Интерпретатор РНР попытается исполнить операцию конкатенации (оператора точка), что н вызывает ошибку. Следственно РНР заменяет точку в именах получаемых переменных на знак подчеркивания. Определение типа переменных Потому что РНР механически меняет типы переменных, не неизменно вестимо, какой тип она имеет. Следственно в РНР имеются функции для определения типа переменных: gettype(), is_long(), is_double(), is_string(), is_array() и is_object().
РНР устанавливает значения нескольких констант и предоставляет механизм установки пользовательских констант во время выполнения. Константы подобны переменным с исключительным различием: их некогда установленные с поддержкой функции define() значения изменению огромнее не подвергаются. Предопределенные константы (доступные неизменно): __FILE_ Имя сценария, интерпретируемого в нынешний момент. При применении в файле, включенном либо вызванном родительским сценарием (директивой include либо require), хранит имя включаемого, а не родительского файла. __LINE_ Номер нынешней интерпретируемой строки. Для подключаемых сценариев позиция указывается касательно этих файлов. PHPJ/ERSION Строковое значение, хранящее версию РНР интерпретатора, скажем: «3.0.8-dev». PHP_OS Наименование операционной системы, в которой исполняется РНР, скажем: «Linux». TRUE Значение «Истинно». Регистр не имеет значения. FALSE Значение «Ложно». Регистр не имеет значения. EJRROR Обозначает ошибку, чудесную от ошибки интерпретатора, вызывающую скептический сбой. E_WARNING Обозначает условие, когда РНР находит ошибку, но не считает ее скептической и это не мешает РНР исполнять сам сценарий. Скажем, такой некритической оплошностью может быть неправильное регулярное выражение в функции еreg(). E_PARSE Обозначает обстановку, когда интерпретатор не может выполнить сценарий из-за дерзкого нарушения синтаксиса. EJOTICE Сообщение о событии, которое может быть либо не быть оплошностью. Исполнение сценария продолжается. Скажем, и индексе ассоциированного массива может применяться строка без кавычек либо в выражении применяться значение несуществующей неременной. E_ALL Суммирование всех Е_* констант (в РНР 4 их число увеличилось). При применении с функцией error_reportingO информирует обо всех проблемных моментах, подмеченных РНР. Константы Е_* традиционно применяются в функции error_reporting() для установки скептического яруса ошибки РНР, то есть яруса ошибки, которая вынуждает РНР перестать исполнение сценария и выдать сообщение об ошибке. Помимо этого, добавочные модули при загрузке определяют личные константы — см. изложение функций соответствующих модулей и библиотек. Следственно комплексный комплект констант зависит от того, с какими библиотеками был скомпилирован РНР и какие модули были загружены. Определять добавочные константы дозволяет функция def ine(). Не забывайте, что константе может быть присвоено только константное значение (а не выражение-макрос, как в С).
Выражения — это «все то, что имеет значение». Особенно примитивные примеры — константы и переменные. Скажем, запись $а =5 присваивает переменной $а целочисленную константу со значением 5. Сейчас $а имеет значение 5, и при дальнейшем присваивании: $b = $а оно понимается как $b = 5. Больше трудными выражениями являются функции. Скажем, мы имеем функцию: function foo (){ return 5- } Тогда запись $с = foo() обозначает то же, что и $с = 5. Функции — это выражения, имеющие возвращаемое ими значение. Значения, безусловно, могут быть и не только числовыми. РНР поддерживает три скалярных типа: целые числа, дробные числа и строки (скаляры, в различие от массивов и объектов, неделимы). РНР также поддерживает два композитных типа (не скаляры): массивы и объекты. Значения всяких типов могут быть присвоены всякий переменной либо возвращены из функций. РНР является языком, ориентированным на выражения, в том смысле, что примерно «все есть выражение». В приведенном выше примере $а = 5 имеется и третье выражение присваивания «=», объединяющее правое и левое выражение? которое также равно тут пяти. То есть запись $b = ($а = 5) подобна записи $а = 5: $b = 5;, а потому что присваивания обрабатываются справа налево, то дозволено также написать $b = $а = 5. Отменными примерами ориентации на выражения являются также операторы пре- и постинкремента и декремента. Так. выражение $а-<-+ имеет значение $а, а -н-$а имеет значение $а + 1 (по аналогии с С). Операторы «прибавления» (+= и -=) и другие операторы этого типа (*=, /=, Х~, &=, ~= и т. п.), по аналогии с инкрементом/декрементом, также являются выражениями (к примеру, допустима запись: $х = ($а += 3), являющаяся сокращением $а = $а + 3; $х = $а;). Довольно распространены выражения сопоставления, возвращающие О либо 1 (что соответствует FALSE либо TRUE). Традиционно такие выражения применяются в руководящих конструкциях. Еще одно выражение — конструкция условной альтернативы (которая существует в С). Sfirst ? Ssecond . Sthird Значение этого выражения зависит от значения переменной Sfirst: если оно правдиво (не нуль), то применяется значение переменной $second, в отвратном случае — Ithird.
Потому что РНР имеет бинарный тип (boolean), в условных конструкциях выражения приводятся к взаимоисключающему значению TRUE либо FALSE дальнейшим образом: любое численное выражение, не равное нулю, тождественно TRUE, а нуль — FALSE; негативные числа также — TRUE; пустая строка и строка «О» — FALSE, все другие строки — TRUE; не скаляры (массивы и объекты) имеют значение TRUE, если содержат хоть один элемент. (Такие же правила использует Perl.) Операторы присваивания Примитивный оператор присваивания «=». Не путайте его с оператором сопоставления «=». Присваивание осуществляется копированием значения из левой части выражения в правую. Допустимы комбинации при присваивании:
Составные операции (скажем, +=, &=, .=) дозволяют сократить запись присваивания, объединяя ее с стержневой операцией, при этом переменная слева применяется и как начальное значение, и как место сохранения итога.
От того что присваивание осуществляется посредством копирования, изредка выигрышнее применять присваивание значения по ссылке: $var = &$othervar;. Присваивание по ссылке реально меняет указатель в переменной назначения так, что сейчас он указывает на место, в котором хранится значение назначаемой переменной, то есть обе переменные сейчас ссылаются на одно и то же значение и метаморфоза одной переменной влечет за собой непосредственное метаморфоза иной. Арифметические операторы
Оператор деления «/» возвращает целое значение (то есть исполняет целочисленное деление), если делимое и делитель — целые числа (строки конвертируются в целые числа). Напротив если одно из чисел дробное, то итог будет также-дробным. Инкремент/Декремент РНР использует синтаксис С в операторах пре- и постинкремента и декремента.
Бинарные операторы Бинарные операторы изменяют значения отдельных битов в целочисленных переменных.
Схема действия побитовых операций:
Операторы сопоставления
Иной воображаемый оператор «? :» (тернарный), с синтаксисом:
действует так: это выражение имеет значение, равное ехрг2, если exprl равняется TRUE, в отвратном случае (если exprl = FALSE) оно равняется ехргЗ. Логические операторы
Повод наличия 2-х схожих вариантов для операторов and и or — их разный приоритет (см. «Приоритет операторов»).
Конкатенация — слияние строк Имеется два строковых оператора: конкатенация «.», объединяющая строки, и конкатенация с присваиванием «.=», которая разрешает сократить запись $А = $А . $Х; до $А .= $Х;.
Приоритет операторов Приоритет операторов определяет порядок вычисления значений выражений. Скажем, выражение 1+5*3 равно 16, а не 18, так как умножение имеет больше высокий приоритет и вычисляется до сложения. Скобки изменяют приоритет операторов, скажем: (1+5)* 3 == 18
Операторы контроля ошибок PHP поддерживает один оператор контроля ошибок — «0». Когда он предшествует выражению РНР, всякое сообщение об ошибке, которое появляется при выполнении этого выражения, игнорируется. Если параметр track_errors разрешен, каждое сообщение об ошибке сохраняется в всеобщей переменной $php_errormsg. Эта переменная перезаписывается всякий раз при происхождении новой ошибки.
Будьте внимательны: в текущее время префиксный оператор контроля ошибок «@» блокирует даже сообщение о скептических ошибках, прерывающих исполнение сценария. Следственно при таком варианте выполнение сценария может быть прекращено, но сообщение об ошибке выведено не будет. Оператор запуска внешней программы В РНР есть оператор «обратная галочка» (backticks): (" ') для запуска внешней программы. Запомните, это не одинарная кавычка! РНР попытается запустить программу (либо исполняемый сценарий), как если бы она запускалась из командной оболочки. То, что выдается при этом запуске на консоль итога, возвращается и может быть сохранено в переменной (и использовано для итога). Подметьте, сам запуск ничего не выводит, если он завершается удачно. См. также функции: system(), passthru(), exec(), popen() и escape-shel Icmd(). Всякий PHP-сценарий состоит из последовательности команд. Это могут быть присваивания, вызовы функций, циклы, условные конструкции и даже пустые команды, которые ничего не делают «:>>. Команды обыкновенно завершаются точкой с запятой и могут быть сгруппированы с поддержкой фигурных скобок (как в С}. Группа команд в фигурных скобках сама является командой (только без знака «;» в конце). if Одна из основных условных конструкций — if, она дозволяет выполнить фрагмент кода при определенном условии. Ее синтаксис сходен с синтаксисом в С:
Как было описано выше, условное выражение проверяется на соответствие значению «истина». Если оно равно TRUE, PHP исполняет следующую команду, напротив — игнорирует ее.
Зачастую необходимо исполнить группу команд при определенном условии, тогда они группируются с поддержкой фигурных скобок.
Изредка требуется, дабы при одном условии выполнялось одно действие, а в отвратном случае — другое; для этого применяется ключевое слово else, расширяющее возможности if.
Фрагмент else выполняется только в том случае, если условное вы-/ ражение в скобках позже if имеет значение FALSE, и другие выражения elseif (если они существуют), также имеют значение FALSE (см. ниже). elseif Условная конструкция elseif, как видно из наименования, — комбинация if и else. Аналогично else, она требует, дабы основное выражение if равнялось FALSE, но также требует, дабы се собственное выражение равнялось TRUE.
Дозволено иметь несколько подблоков elseif в одном блоке if. Из нескольких блоков elseif исполняется 1-й, тот, что равняется TRUE. В PHP elseif дозволено писать также как else if (двумя словами), и толк при этом не теряется. Таким образом, elseif-блок исполняется, только если исходное выражение if и всякое другое, предшествующее el self-выражение равняются FALSE, а нынешнее elseif — TRUE. Альтернативный синтаксис руководящих конструкций Для руководящих конструкций if, while, for, foreach, и switch PHP предоставляет альтернативный синтаксис записи. Метаморфозы выражаются в том, что позже условного выражения в круглых скобках ставится двоеточие (:), после этого следует фрагмент кода, подлежащий условному выполнению, завершающийся соответственно словами: endif;, endwhile;, endfor;, endforeach; либо endswitch;. Применение фигурных скобок (для группировки условного фрагмента кода) при этом не требуется.
В примере html-блок «A is equal to 5» включается в генерируемую страницу при условии, что $а равно 5.
if ($a == 5): print "a equals 5"; print "...".-elseif ($а == 6): print "a equals 6"; print "!!!": else- print "a is neither 5 nor 6": endif: while Цикл while — самый легкой в PHP, он аналогичен своему тезке в С.
Его толк — повторять выполнение команды до тех пор, пока выражение правдиво (TRUE). Проверка значения происходит всякий раз до выполнения команды. Если условное выражение не изменяется (в команде/блоке), то цикл будет исполняться беспредельно. Если условное выражение первоначально ложно (FALSE), воображаемый блок игнорируется и выполняться не будет. Блок условного кода может быть органичен фигурными скобками либо двоеточием и словом endwhile;. Следующие два примера приводят к одинаковому итогу (они печатают числа от \ до 10):
Циклы do. .while сходны с циклами while с тем различием, что выражение проверяется на истинность не до исполнения блока, а позже него. То есть гарантируется, что воображаемый блок будет выполнен минимум один раз.
Дальнейший пример показывает трудный (однократный) цикл и применение команды «break;» (ради тренировки испробуйте разобраться, что он делает).
for Циклы for - особенно трудные в РНР.
Первое выражение exprl выполняется безоговорочно, один раз, до начала цикла (обыкновенно это инициализация переменной-счетчика цикта) Перед началом всякой итерации цикла на истинность проверяется условие ехрг2, и если оно правдиво (TRUE), то цикл выполняется i конце всей итерации цикла выполняется ехргЗ (зачастую это инкремент счетчика цикла). Всякое из выражений может быть пустым (то есть «;»). Если выражение ехрг2 - пустое, то цикл является безграничным (РПР по умолчанию считает его равным TRUE) и его прерывание допустимо только осредством применения внутри его блока команды break. Сравните примеры ниже, все они выводят числа от 1 до 10.
Особенно «красивы» 1-й и конечный цикл. Но пустые выражения являются зачастую дюже пригодными. РНР также поддерживает синтаксис ограничения блока цикла двоеточием:
foreach В РНР 4 включена инструкция foreach, разрешающая осуществлять поэлементно идентичный комплект действий для всего элемента массива. Конструкция может иметь два варианта синтаксиса:
Первая форма цикла перемещается по элементам массива, указанным как $массив. При всей итерации значение нынешнего элемента присваивается переменной $значение_элемента, внутренний курсор массива (указатель на нынешний элемент массива) смещается на дальнейший элемент и при дальнейшей итерации мы получаем дальнейший элемент. Вторая форма делает то же самое, но мы можем добавочно применять индексное значение массива в переменной Skey (что благотворно при работе с ассоциированными массивами). Если вторая форма цикла работает с одномерным, не ассоциированным массивом, то значения Skey и $значение_элемента будут идентичны. При первом прохождении цикла foreach курсор массива механически сбрасывается для указания на 1-й элемент массива; таким образом, не требуется вызывать функцию reset() перед запуском цикла foreach. Также подметим, что цикл foreach оперирует с копией массива, а не с самим массивом, и следственно курсор самого массива не изменяется, как в конструкции each. Следующие примеры функционально одинаковы:
break break прерывает выполнение циклов for, while, и конструкций switch, break имеет добровольный довод, определяющий, сколько вложенных циклов нужно прекратить.
continue continue применяется в циклических конструкциях для того, дабы избежать выполнения оставшейся части цикла и перейти к дальнейшей итерации, continue, аналогично инструкции break; может име'гь числовой довод, показывающий, на сколько вложенных циклов должно распространяться се действие.
switch Конструкция switch эквивааснтна последовательности конструкций if, имеющих одно всеобщее условное выражение. Зачастую доводится исполнять проверку одной переменной (либо выражения) на соответствие разным значениям и соответственно исполнять разные комплекты инструкций в всем случае. Это именно то, для чего предуготовлена конструкция switch. Следующие два примера показывают замену нескольких конструкций if на одну switch:
В конструкции switch инструкции case проверяются одна за иной, и когда обнаруживается соответствие переменной (выражения) значению, указанному позже слова case, исполняются все дальнейшие строки, пока не встретится слово break. Если слово break не указано, выполнение продолжается до конца switch-блока.
В этом примере, если $i равно О, РНР исполнит все три инструкции print! Если $i равно 1, будут исполнены две последние команды print, и только если $1 равно 2, вы получите исключительное «ожидаемое»;сообщение: i равно 2. Следственно не забывайте указывать слово break в всяком блоке case. В конструкции switch условное выражение вычисляется только раз и проверяется на соответствие всему варианту case. В el seif- конструкциях условие проверяется снова (и выражение вычисляется снова), следственно switch-конструкции выполняются стремительней, если выражение трудное. Блок case также может быть пустым, тогда РНР примитивно переходит к дальнейшему case (см. трактование выше).
Нестандартный случай case — это case по умолчанию — default. Он применяется в том случае, когда ни один из вариантов не соответствует условному выражению.
Выражение позже слова case может быть любым, способным иметь значение и легкой тип, то есть целым либо дробным числом либо строкой. Массивы и объекты не могут быть использованы в этом I случае, если только они не могут быть приведены к простому типу. Для конструкций switch допустим альтернативный синтаксис.
Директивы require() и include() заменяются интерпретатором в ходе выполнения на содержимое файла, указанного в этих директивах (их параллелью является директива С препроцессора include). Если в конфигурации РНР разрешен параметр «URL fopen wrappers» (по умолчанию он разрешен), в этих директивах, наравне с локально доступными файлами дозволено применять файлы из сети Интернет путем указания их URL (для Widows эта возможность пока недостижима). См. функцию fopen(). Файл, включаемый данными директивами, считается файлом HTML, следственно если он содержит код РНР, то обязаны присутствовать теги-ограничители (скажем, <? и ?>), дабы данный код выполнялся. Обыкновенный синтаксис:
Реально require() не функция, а особая конструкция языка. В начальстве по РНР говорится, что «на нее не влияют условные конструкции». Но при проверке на практике выяснилось, что require() работает так же, как и include(), то есть на нее влияют условные конструкции и в цикле с перечислением имен включаемых файлов она заменяет имена файлов. Директива require() выполняется неизменно, вне зависимости от того, выполняется ли код, ею подставляемый. Она не возвращает значение (include() может возвращать значение с подмогой команды return). Директива include() — это «почти» функция. Классический пример ее использования:
Начальство по РНР требует завершения include() в фигурные скобки в условных конструкциях (но, как я узнал, в этом нет необходимости). Включаемые файлы также наследуют все переменные, доступные вы-зываюшему сценарию, с теми значениями, которые они имеют в той строке, где встречается директива включения. Если директива включения встречается в объявлении функций либо класса, содержимое включаемого файла ведет себя, как если бы оно находилось взамен директивы включения. include() также разрешает возвращать значение из включаемого сценария командой return (это завершает выполнение включаемого сценария).
Если нужно передать во включаемый сценарий доводы (как при вызове функций), это дозволено сделать двумя методами: установкой глобальных переменных и вызовом сценария посредством HTTP-запроса (с передачей параметров в адресе URL). Впрочем не стоит забывать, что во втором методе нужно задавать полный адрес URL (дабы обращение происходило к web-серверу, а не локальному файлу) и что при этом включаться будет не сам код, а итоги его выполнения; помимо этого, сервер должен быть горазд исполнить запрашиваемый сценарий. См. также: readfile() и virtuaH).
require_once() и include_once() Эти директивы аналогичны вышеописанным с тем различием, что они Ш не допускают повторного включения файла, если его включение теснее происходило. Это разрешает избежать происхождения ошибок при множественном включении файлов — скажем, когда это приводит к обстановки повторного определения функции (что вызывает ошибку в РНР), повторного назначения констант и т. п. См. также: get_required_files(), get_included_files(), readfile() и virtual(). Пользовательские функции могут быть определены дальнейшим образом:
Внутри тела функции может присутствовать всякий PHP-код и даже определение других функций либо классов. В РНР 3 определение функции должно предшествовать первому ее применению, в РНР 4 это требование отсутствует. РНР не допускает перегрузку функций (в различие от C++), то есть если функция некогда определена, ее код невозможно изменить либо удалить. Следственно вторичное (пере)определение функции вызовет ошибку. РНР 4 также поддерживает неопределенное число доводов функции и значение
доводов по умолчанию (см. дальше). Для применения этих возможностей
пригодны функции: Если вы помните, функциям недостижимы всеобщии переменные. Передача функциям доводов Информация передается функциям через комплект их доводов, представленных
последовательностью значений (переменных, выражений), поделенных запятыми.
РНР поддерживает: передачу значений доводов «по значению»
(по умолчанию) и передачу значений по ссылке; значения доводов по умолчанию
и переменное для функции число доводов. См. также:
Передача значений доводов по ссылке По умолчанию в функцию передаются значения доводов, то есть копии значений выражений и переменных, следственно метаморфоза значений доводов имеет толк только внутри функций и не отражается вовне. Если нужно изменять сами доводы, тогда их нужно передавать по ссылке, так как тогда в функцию передаются не значения, а ссылки переменных. Для этого перед переменной в объявлении функции ставится знак амперсант (&), тогда довод неизменно будет передаваться в функцию по ссылке: Если вы хотите передать довод по ссылке в функцию, которая по умолчанию принимает значения «по значению», то амперсант ставится перед переменной в строке вызова функции:
Значения доводов по умолчанию В определении функции дозволено применять синтаксис C++ для задания значений доводов по умолчанию: Подметим, что доводы, имеющие значения но умолчанию, обязаны стоять (в объявлении функций) позже доводов, их не имеющих.
PHP выдаст следующее:
Интерпретатор пытается присвоить первое значение (из доводов функции) первому доводу, а потому что для второго довода значение не задано (ни по умолчанию, ни очевидно), ю это вызывает ошибку (правда и не препятствует последующему выполнению сценария). Сравните со дальнейшим примером:
РНР выдаст следующее:
Неопределенное число доводов в функции РНР 4 поддерживает неопределенное число доводов в функциях пользователя. Для применения этого имеются функции func_num_ args(), func_get_arg() и func get_args(). При этом не требуется применять особый синтаксис и список доводов может указываться, как в обыкновенных функциях. Возвращение функциями значений Значения возвращаются функциями с подмогой команды return. Возвращаться может всякий тип, включая массивы и объекты.
Из функции невозможно возвратить несколько значений единовременно, и если такая надобность появляется, следует применять массив.
Дабы воротить из функции ссылку, надобно применять оператор ссылки (&) перед именем функции при ее объявлении и при присваивании ее значения переменной.
Помимо возвращения значений команда return исполняет еще одну значимую роль. Она прерывает выполнение функции аналогично команде break в условных конструкциях и циклах. Если нужно легко прекратить выполнение функции, не возвращая никакого значения, в*команде return довод дозволено не применять.
Переменные-функции РНР поддерживает доктрину переменных-функций. Это обозначает, что если позже имени переменной указаны круглые скобки, РНР будет искать функцию с именем, содержащимся в переменной, и при нахождении таковой запустит ее. Эту пригодную специфика дозволено применять для осуществления обратных вызовов, составления списков функций и многими другими методами.
Класс — это коллекция переменных и функций для работы с ними. Переменные класса объявляются словом van. В функциях класса переменная $this обозначает: «данный объект этого класса» (экземпляр). Нужно применять запись this->что-либо для доступа к всякий переменной либо функции, имеющейся в этом объекте.
Данный класс состоит из одного ассоциативного массива и 2-х функций для работы с ним. В PHP 4 только константа может инициализировать значение переменной в объявлении класса, для присваивания неконстантных значений используйте конструктор класса. Конструктор класса — эта функция класса, имеющая его имя и запускаемая механически при создании экземпляра класса. Объявление класса — каждого лишь его изложение. Для того дабы сотворить экземпляр класса — объект, нужно сделать переменную и назначить ей класс оператором new.
Класс может быть растяжением иного класса. При наследовании все переменные и функции родительского класса наследуются дочерним классом. Наследование объявляется словом extends позже имени класса. РНР не поддерживает множественное наследование (то есть одновременное наследование от нескольких классов).
Класс Моя_Корзина расширяет класс Корзина добавлением одной переменной и конструктора.
Будьте осмотрительны: для дочерних классов конструктор родительско-ю класса не вызывается при создании экземпляра дочернего класса. Если нужно вызвать конструктор родительского класса, это должно быть сделано очевидно (аналогично вызову традиционной функции родительского класса). В РНР ссылки — это метод доступа к значению переменной под разными именами. Они чудесны от указателей в С, хранящих адрес переменной, в РНР это каждого лишь псевдонимы какой-нибудь переменной. Ссылки РНР дозволяют двум переменным указывать на одно значение. Так, запись: $а =& $b обозначает, что сейчас и $а и $b указывают на одно значение. Причем $а и $b сейчас всецело одинаковы, то есть не $а указывает на $b либо напротив, а обе они указывают на одно место хранения значения. Основные варианты применения ссылок: передача доводов по ссылке и возвращение ссылок из функций, они представлены в главе «Функции». Тот же синтаксис применяется в функциях, возвращающих ссылки и при применении оператора new.
He позабудьте: для применения ссылок на объекты оператор ссылки (&), должен применяться как в конструкторе для переменной $this, так и при создании объекта (назначении его переменной), напротив вы получите два разных объекта. В дополнение к тому, что сказано о ссылках в главе «Функции», подметим, что по ссылке помимо переменных могут передаваться объекты, сделанные оператором new (скажем, foo(new foobarO), и ссылки, возвращаемые другими функциями. Удаление ссылочной связи производится применением функции unset().
Ссылки дозволено рассматривать как аналогии жестких файловых связей в системе Unix, тогда действие unseto — аналог команды unlink. |