Бегун.Рекомендую - партнеру
Здесь может быть ваша реклама
|

 3 Основы PHP

3 Основы PHP

Мы посмотрели, что такое РНР и как его устанавливать и настраивать, а теперь пора познакомиться с базовыми конструкциями, образующими язык программирования РНР. Хотя синтаксис РНР был вдохновлен целым рядом источников, в особенности С, Perl и языками сценариев командной оболочки UNIX, во многом это самостоятельный язык. Последующие две главы, хотя им и не предназначалась роль полного справочника по синтаксису РНР, должны помочь тем, кто знаком с другими языками или основами РНР, понять, какие конструкции предоставляет РНР. Более доскональное изложение основ РНР-программирования можно найти в книге «Beginning РНР4» издательства Wrox Press (ISBN 1-861003-73-0).

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

В данной главе мы рассмотрим следующие темы:

•    Элементы сценариев РНР

•     Литералы

•    Переменные

•    Типы данных

Выражения и операторы 1 • Переменные форм

•    Системные переменные

Программы РНР

Программы РНР хранятся в стандартных текстовых файлах, которые можно создавать в любом редакторе (текстовые редакторы Macintosh иногда добавляют символы новой строки, которые РНР не понимает, поэтому в таких редакторах следует сохранять файлы с параметром 'UNIX-style linebreaks' -символы новой строки в стиле UNIX). Обычно надо сохранять файлы, давая им расширение . php, чтобы веб-сервер мог их выполнить, хотя с соответствующими настройками можно обрабатывать любые расширения. Вот пример настройки Apache в файле httpd. conf, которая задает расширение . prophp4:

AddType application/x-httpd-php .prophp4

С другой стороны, при написании консольных программ РНР расширение имени файла не имеет значения.

Основы работы с файлами

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

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

Можно взять обычную страницу HTML, изменить расширение файла на . php, и РНР обработает ее, но ничего с ней не сделает.

Чтобы включить в файл команды РНР, необходимо «уйти» из стандартного режима вывода в РНР. Это достигается путем заключения команд РНР в особые ограничители.

Инструкция обработки SGML: <? ?>

Инструкция обработки XML:

<?php ?>

Стиль сценария, дружественный редактору HTML:

<script language="php">

</script> Стиль ASP для редакторов, понимающих теги ASP, но не теги РНР:

*>

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

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

<?= ... ?> ■ <%=... %>

Такие сокращенные теги выполняют заключенное в них единственное выражение РНР и заменяют весь тег его результатом. Вот пример такого спорного способа:

two plus two is <?= 2 + 2 ?>

В результате должно появиться:

two plus two is 4

Чаще всего для вывода значений кодом РНР мы будем пользоваться не такими ограничителями, а командой echo, например:

two plus two is <?pfip echo(2 + 2);':?>

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

Операторы

Внутри ограничителей РНР можно написать любое количество операторов. Есть два типа операторов: однострочные и многострочные.

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

two plus two is <?php echo(2 + 2); ?>

two plus two is <?php echo (2+2) ?>

Однострочные операторы могут также содержать, как ни странно, переводы строки. Это обусловлено тем, что РНР не считает оператор законченным, пока не встретит точку с запятой, а переводы строки считаются пробельными символами, которые внутри ограничителей РНР, как правило, игнорируются. Аналогично не требуется, чтобы после точки с запятой перед началом следующего оператора был перевод строки. Таким образом, следующие два набора операторов совершенно эквивалентны:

<?php

echo(2 + 2); echo(3 * 2); echo("hello"); ?>

<?php

echo(2 +

2); echo(3 * 2

); echo(

"hello") ?>

Многострочные операторы используют конструкцию, называемую блоком кода. Блок кода содержит несколько операторов РНР, заключенных в фигурные скобки { ...}:

{

echo("hello"); echo(2 + 2);

}

Такие блоки кода можно использовать в коде РНР, но они не оказывают влияния на код (в частности, в отличие от С или Java, они не влияют на область видимости переменных). Блоки кода полезны только в управляющих структурах, таких как циклы или операторы if:

if (3 > 2) {

echo( "hello"}; echo(2 + 2);

I

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

Обратите внимание, что внутри кода блока можно «выйти» из РНР (но не внутри однострочного оператора) при условии, что дальше вы снова войдете в РНР и закончите блок, например:

<?php

if..-(3-=, t

echo( "hello");

?>

Эта строка не интерпретируется как код РНР и выводится, только если блок кода выполняется.

<?php

echo(2 + 2);

Комментарии

РНР предоставляет несколько методов вставки в код комментариев. Проще всего вставлять их с помощью двойной косой черты, после чего РНР игнорирует все, что расположено до следующего перевода строки:

<?php

echo("This is Motortown'*); // Вывод пользователю сообщения ?>

То же самое можно сделать с помощью символа решетки:

<?php

echo("This is Motortown"); # Вывод сообщения для пользователя

?>

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

<?рпр

// вывести количество конечностей

echo(2               // количество ног

+

2 # количество рук

-. У*

# количество конечностей выведено ?>

РНР также поддерживает многострочные комментарии в стиле C++/Java с ограничителями /*... */:

$Calculation = (<$х/$у) * 7.5) / $z ;

/* В приведенном вычислении берется надбавка к цене, х, и делится на количество покупателей, у. Полученное число умножается на текущую процентную ставку (7.5) и делится на десятичное число, хранящееся в г */

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

<?php

echof'This is Motortown"); // Этот комментарий РНР игнорируется

?>

// Этот комментарий РНР появится в броузере

<!-этот комментарий HTML будет виден в исходном коде HTML, но не в броузере -->

Это помогает отлаживать код HTML и облегчает его понимание.

Литералы

В приведенных примерах мы уже встречались с множеством литералов. РНР понимает три основных вида литералов: текстовые (строки), числовые (целые числа и числа с плавающей точкой) и булевы (true и false).

Текстовые литералы

Строки можно задавать тремя способами: в двойных кавычках, в одинарных кавычках и в синтаксисе встроенного документа (here document).

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

Таблица 3.1. Специальные символы и их значения

Значение

Смысл

п

Перевод строки (LF)

If

Возврат каретки (CR)

t

Табуляция

Литералы

91'

Значение

Смысл

V

Обратный слэш

$

Доллар

"

Двойная кавычка

Восьмеричное число длиной до 3 символов включительно

Символ с кодом ASCII, соответствующим восьмеричному числу

х с последующим шестнадцатеричным числом длиной до 2 символов включительно

Символ с кодом ASCII, соответствующим шестнадцатеричному числу

Таким образом, код:

<?php

echoC'This text goesnacross severalnlinesnt"and this quotation is

indentedY'");                                                                             <'.

?>

порождает:

This text goes across several lines

"and this quotation is indented"

Заметим, что при просмотре выдачи этого сценария РНР в веб-броузере получится следующее:

This text goes across several lines "and this quotation is indented"

Броузеры игнорируют при отображении перевод строки и другие пробельные символы (табуляцию, пробелы). Для того чтобы броузер выполнил перевод строки, нужен тег <br> (или <br /> в XHTML). Альтернативный способ -функция nl2br(), добавляющая перенос строки HTML перед всеми символами LF в строке.

Если кавычки одинарные, то действуют только escape-коды ' и \ - для одинарной кавычки и обратного слэша соответственно. Все остальные символы воспроизводятся буквально. Таким образом, если в предыдущем примере заменить двойные кавычки одинарными:

<?php

echo( 'This text goesnacross severalnlinesnt"and this quotation is

indentedY");

?>

то получится следующее:

This text goesnacross severalnlinesntY'and this quotation is indentedV Как видите, все символы, включая обратный слэш, воспроизводятся бук-

вально.

Встроенные документы

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

$h6r6Text=<<<6nd dGlimi'ter

Включается весь текст встроенного документа, начиная с этой строки

и охватывая несколько строк, если необходимо, ■

пока в конце на следующей строке не появится ограничитель конца

end_delimiter; .

echo($hereText);

После символов <«, которые сообщают РНР о начале встроенного документа, указывается ограничитель конца. Им может быть любая последовательность буквенно-цифровых символов и/или символов подчеркивания, но первый символ не должен быть цифрой или подчеркиванием. На следующей строке начинается текст встроенного документа. Для сообщения РНР о конце встроенного документа служит строка, начинающаяся с определенного ранее ограничителя конца.

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

Числовые литералы

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

<?php

echo(255);

echo(OxFF);

echo(0377);

?>

Шестнадцатеричные числа предваряются нулем и буквой «х». Восьмеричные числа просто начинаются с нуля.

Команда echo всегда выводит целые числа в десятичном виде, даже если они были заданы как шестнадцатеричные или восьмеричные, поэтому приведенный выше код выводит число 255 три раза.

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

<?php echo(0.001);

echo(1e-3);

echo(-3.8716E32);

?>

Символ e или E в последних двух вариантах - обычная «экспонента».

Булевы литералы

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

Переменные

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

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

$а2

$my_name

$height_in_metres_above_sea_level

Об именах переменных в РНР следует помнить, что они (в отличие от ключевых слов) чувствительны к регистру, поэтому все следующие переменные различны:

$my_name $MY_NAME $My_Name

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

Функции представляют собой исключение и обладают своей областью видимости переменных.

Присваивание

Оператор, предназначенный для присваивания переменной значения, имеет следующий вид:

$variable_name = expression;

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

<?php

$а= "Hello"; $b = 123; $с = $а; ?>

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

<?php

$а = "Hello";

echo($a);

,?>

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

<?php

$а = "Hello";

echo("$a World!");

?>

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

Hello World!

Обратите внимание, что переменная вычисляется в момент интерпретирования литерала. В следующем примере:

<?php

$а = "Hello";

$b = "$а World!";

$а = "Goodbye";

echo($b);

?>

■выводится по-прежнему Hello World!, поскольку подстановка переменной происходит в том месте, где литерал переводится в строку и записывается в переменную $Ь. Последующее изменение $а не оказывает влияния на $ь.

Константы                                                                                                                                              95

Ссылки

РНР предоставляет и другой способ ссылки на переменные. Ссылка на переменную вида:

${expression}

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

${"my_name"}

то переменной, на которую происходит ссылка, будет $my_name. Если переменная $а содержала строку "name", то

${"ту_$а")

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

${$а}

также указывает на $my_name. Однако для таких случаев РНР допускает еще более краткий синтаксис. Если имя переменной просто содержится в другой переменной, как здесь, то ссылка на переменную $my_name будет выглядеть так:

$$а

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

Константы

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

defineC'INDEPENDENCEDAY", "4th July");

В теле кода на константу можно сослаться просто по имени:

echo(INDEPENDENCEDAY);

-

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

Константы РНР фактически действуют так же, как директива ftdefines в препроцессоре С: можно определить их в некотором месте, а затем выполнять разный код в зависимости от того, определена ли константа и какое значение она имеет. Проверка выполняется с помощью функции defined():

if (defined("INDEPENDENCEDAY")> {

echoC'INDEPENDENCEDAY is defined"); } else {

echoC'INDEPENDENCEDAY is not defined"); )

Типы данных

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

•      string

■•     integer

■•    double

■•    array

•     boolean

•     object

■• resource

•     unknown

Тип double в PHP соответствует значению с плавающей точкой, хранящемуся с «двойной точностью». Поскольку в РНР нет чисел с «одинарной точностью», это отличие не имеет большой важности.

Тип, который РНР назначил переменной, можно проверить с помощью

функции gettype():

<?php

$Variable = "This is some text"; echo(gettype($Variable));

Этот код выводит string.

Можно также установить тип явным образом посредством родственной функции settype(). Ей требуется передать имя переменной и тип, который надо для нее установить:

$Change = "2"; settype($Change, integer); echo(gettype($Change)); echo($Change);

Преобразование типа

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

•      (string)

•     (integer)

•     (double)

•    (boolean)

У некоторых из этих операторов есть сокращенные версии:

•       (int)

•    (bool)

Они используются так:

<?php

$а = "123.456";

ecrio((int)$a);

?>

Этот код выводит 123, потому что РНР преобразовал строковое значение «123.456» в целое число.

При выполнении преобразований РНР иногда ведет себя интересным образом. Рассмотрим следующий код:

$Change = "2 Coffee Candies"; settype($Change, integer); echo(gettype($Change)); echo($Change);

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

$Variablel = 3;

$Variable2 = "2 Coffee Candies";

SSumTotal = $Variablel « $Variable2;

Сумма будет равна 5, потому что РНР обнаруживает операцию сложения и понимает, что таково ваше намерение. Он выполняет преобразование $Vari-able2 в целое число, а затем складывает две переменные. В других языках программирования это легко могло бы привести к ошибке, но в РНР из-за слабой типизации этого не происходит.

Для того чтобы хорошо разобраться, как РНР принимает эти решения, посмотрим, как он обращается с операторами.

Операторы и функции

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

Есть несколько способов предоставить РНР значение во всех этих ситуациях. Те объекты, которые РНР может интерпретировать в этих ситуациях как значения, называются выражениями. Мы уже встретили три типа выражений: литералы, переменные и константы.

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

Мы видели вызовы функций, которые использовались так:

echo(gettype("Hello"));

Вызов функции (gettype("Hello")) вычисляется, чтобы предоставить некоторое данное ("string"), которое передается команде echo. Это выражение -у него есть значение. Этот вызов функции может, как мы сказали, быть помещен везде, где используется переменная или литерал. Следовательно, допустим такой код:

$а = gettype("Hello"); ${gettype("Hello")} = "World"; echo(gettype(gettype("Hello")));

В первом случае строка "string" записывается в $а, во втором- строка "World" записывается в переменную $ string, а в третьем выводится результат применения gettype() к значению, возвращаемому gettype().

Операция - это выражение, содержащее оператор. В следующем коде:

echo(2 + 2);

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

echo(add(2, 2));

Оператор сложения (+) - бинарный: он действует над двумя значениями. Другие бинарные операторы: «больше» (>), оператор конкатенации (.) и оператор присваивания (=).

Существуют также унарные операторы, действующие над одиночным значением. Примерами служат оператор инкрементирования (++), булево отрицание NOT (!) и уже встречавшиеся операторы преобразования типа, например (int).

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

$а.? $Ь : $с

имеет значение $Ь, если $а имеет значение true, и получает значение $с, если $а имеет значение false:

echoC'INDEPENDENCEDAY is " . (definedC'INDEPENDENCEDAY") ? "defined" :

"not defined"));

Значение, возвращаемое функцией defined(), определяет, какая именно строка будет выведена.

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

Теперь мы рассмотрим некоторые базовые операции и функции, предоставляемые РНР, которые можно осуществлять над значениями различных типов.

Общие операции

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

Оператором присваивания, как мы видели, является знак равенства, =. Аргументом с левой стороны должен быть объект, допускающий присваивание, - обычно ссылка на переменную. Аргументом с правой стороны может быть любое выражение. В результате этой операции переменной в левой части присваивается значение выражения справа. Важно помнить, однако, что операция присваивания сама представляет собой выражение: у нее есть значение. Принимаемое им значение является значением выражения в правой части. Из сказанного следует, что возможен такой код:

echo($a = "Hello"); $а = $b = $о = "Hello";

Первый оператор выводит значение "Hello", одновременно также присваивая его переменной $а. Второй присваивает значение "Hello" переменной $с, затем присваивает его же переменной $Ь, а затем то же самое - переменной $а.

Оператор равенства состоит из двух символов =. Он принимает в качестве аргументов любые два выражения и имеет значением булево true, если значения равны, и булево false в противном случае. Оператор неравенства ! = возвращает противоположное значение:

$а = 2; echo($a == 2);

Одно предостережение при работе с числами с плавающей точкой: арифметика чисел с плавающей точкой с двойной точностью в РНР не всегда так точна, как хотелось бы. Рассмотрим следующий код РНР:

<?php $а=1.1;

$Ь= 0.4;

$с = $а - $Ь;

echo(($c== 0.7) ? "true" : "false");

?>

Он помещает величины с плавающей точкой 1.1 и 0.4 в две переменные, затем выполняет вычитание. 1 . 1 минус 0.4 должно составить 0.7, Проверяем, так ли это, с помощью тернарного оператора: первым аргументом является операция равенства, которая возвращает истину, если два значения равны, и ложь в противном случае. После этого тернарный оператор возвращает строку "true" или "false", соответственно.

Проверка равенства должна быть успешной, и выведено слово «true». К сожалению, это происходит не всегда. Точность представления чисел с плавающей точкой зависит от платформы, но на 32-разрядном компьютере под Windows эта программа выводит «false». Дело в том, что значение с плавающей точкой хранится как двоичное число, являющееся лишь приближением десятичных дробей, которые мы пытаемся представить. Семь десятых не переводится точно в половины, четверти, восьмые и шестнадцатые доли.

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

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

РНР использует в качестве оператора конкатенации строк символ точки (.), или оператор «точка» (dot operator):

$а = "Hello"; $b = "World"; ; $c = $a . $b; echo($c);

Есть также сокращенный оператор, . =:

$а .= $b

Приведенная строка эквивалентна следующей: $а = $а . $Ь

Запомните, что если между элементами строки потребуется включить пробелы или переводы строки, это придется сделать вручную. С помощью оператора «точка» можно конкатенировать несколько строк:

$а = "Hello";

$b = "World";

$с - "<b>" . $а , " " . $b . "</b>";

echo($c);

Строковые функции

PHP предлагает большой набор функций для обработки строк. Мы рассмотрим здесь только те, которые применяются чаще всего; полный список функций РНР можно найти в руководстве по РНР (http://www.php.net/ docs.php). Мы не станем здесь рассказывать о регулярных выражениях, предоставляющих самый мощный и гибкий метод обработки строк. О них подробно рассказано в главе 7.

substr()

string substr(string string, int start [, int length])

Функция substr() возвращает часть строки. Первый аргумент- вся строка, второй — положение в строке первого символа, который следует вернуть (начиная отсчет с нуля), тогда как третий - положение последнего символа в строке, который требуется вернуть. Если третий аргумент не указан, то РНР предполагает, что надо включить всю оставшуюся часть строки. Вот несколько примеров действия substr():

$String1 = substr'C'The cat sat on the mat", 4,3); // 'cat'

$String2 = substrCThe frog sat on the log", 0,1); // TV

$String3 = substrCThe aardvark sat in the dark", 17); // 'in the dark'

102

Глава 3. Основы PHP

strpos()

int strpos(string haystack, string needle [, int offset])

Функция strposO обеспечивает действие, обратное substr(). Мы передаем ей часть строки, а она возвращает первую позицию в строке, в которой найдена эта часть (если вообще найдена).

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

$String1 = strpos("The cat sat on the mat", "cat"); // Returns '4' $String2 = strpos("rhubarbrhubarbrhubarb", "rhubarb", 6); // Returns "7-

htmspecialchars()

string htmlspecialchars(string string [, int quote_style [, string charset]])

Функция htmlspecialcharsO полезна при поиске в строке некоторых символов, требующих особого представления в HTML, и преобразует их в HTML-эквиваленты. Эта функция находит и преобразует в код HTML следующие пять символов:

•    &становится&атр;

становится&д u ot;

•     < становится&Н;

•     > cтaнoвитcя&gt;

В качестве второго аргумента принимается одна из двух констант: ENTQU0TES или ENTN0QU0TES. Первая передается, если надо транслировать кавычки, вторая - если этого делать не надо. Третий аргумент приникает строку, представляющую набор символов, используемый в преобразовании, по умолчанию ISO-8859-1.

Пример npHMeHemmhtmlspecialcharsO:

echo(htmlspecialchars("<p class="class1">The cat sat on the mat</p>", ent_quotes));

Выводится следующее:

&lt;P class='class1'&gt;The cat sat on the mat&lt;/P&gt;

Веб-броузер использует это для представления исходных символов. Функция применяется, если надо вывести в броузере исходный код HTML.

trim()

Функция trim() проста: она принимает один аргумент, строку, и удаляет предшествующие или замыкающие пробелы:

$String1 = trim(" a lot of white space          "); // 'a lot of white space'

Обратите внимание, что так применять trim() для удаления из переменной концевых пробелов нельзя:

$а = " a lot of white space trim($a);

Для того чтобы получить желаемое, надо действовать так:

$а = trim($a);

chr() и ord()

Функция ch г () принимает в качестве аргумента ASCII-код символа и возвращает фактический символ. Функция ord() производит обратное действие:

echo(chr(64)); // displays '@' echo(ord('@')); //displays '64'

strlen()

Функция strlenO принимает один аргумент, строку, и возвращает длину строки в символах как целое число, например:

$Strlng1 = strlenf'one"); // '3'

$String2 = strlen("the cat sat on the mat"); // '22'

printfQ и sprintf()

int printf(string format [, mixed args...]) string sprintf(string format [, mixed args...])

printf() и sprintf() являются двумя родственными функциями, выполняющими несколько более сложные действия, чем другие рассмотренные нами функции обработки строк. Обе они заботятся о форматировании чисел и включении их в строку, а также предоставляют такие функции, как вывод даты в формате mm/dd/yyyy или денежных единиц с двумя десятичными знаками. Функция sprintf() осуществляет требуемое форматирование и возвращает строку, тогда как printf() выполняет туже задачу, но выводит результат непосредственно в выходной поток — в броузер или на консоль.

Спецификаторы преобразования

Аргумент format функций printf()/sprintf{) представляет собой строку, содержащую некоторые специальные символы, используемые при форматировании данных, находящихся в списке аргументов. Эти специальные символы называются спецификациями преобразования. Обычные символы, которые останутся неизменными в отформатированной строке, называются директивами (directives). В списке аргументов необходимо указать один аргумент для каждой спецификации преобразования, имеющейся в строке формата.

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

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

Спецификатор заполнения (Padding Specifier)

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

Спецификатор выравнивания (Alignment Specifier)

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

Спецификатор минимальной ширины (Minimum Width Specifier)

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

Спецификатор точности (PrecisionSpecifier)

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

Спецификатор типа (Type Specifier)

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

•    b - целое число, представляемое в двоичном виде

с - целое число, представляемое в виде символа, имеющего тот же код ASCII

•    d - целое число, представляемое в десятичном виде

•    f - число с плавающей точкой, представляемое в виде десятичной дроби (с десятичной точкой)

•    о - целое число, представляемое в восьмеричном виде

•    s — строка (тип string)

х - целое число, представляемое вшестнадцатеричном виде (буквами нижнего регистра)

•    X - целое число, представляемое в шестнадцатеричном виде (буквами верхнего регистра)

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

Рассмотрим теперь несколько примеров функций sprintf()/printf(). Мы уже говорили, что с их помощью можно форматировать даты и денежные величины; начнем с даты:

$day = 1;

$month = 2;

$уеаг = 2001;

printf("%02d/%02d/%04d", $month, $day, Syear);

Этот код выводит следующий результат:

01/02/2001

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

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

%02d

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

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

$Value2 = 23;

$Value2 = sp

 
MKPortal©2003-2008 mkportal.it
MultiBoard ©2007-2009 RusMKPortal