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

Самоучитель PHP 4 - Котеров Д. В

..pdf
Скачиваний:
92
Добавлен:
24.05.2014
Размер:
4.38 Mб
Скачать

128

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

list

Обычно это массив с целыми ключами, пронумерованными от 0 и следующими подряд. Так как список является разновидностью ассоциативного массива, то обычно вместо параметров функций типа list можно подставлять и параметры типа array. При этом, скорее всего, функция "ничего не заметит" и будет работать с этим массивом как со списком, "мысленно" пронумеровав его элементы. Можно также сказать, что список представляет собой упорядоченный набор значений (который можно, например, отсортировать в порядке возрастания), тогда как ассоциативный массив — упорядоченный набор пар значений, каждую из которых логически бессмысленно разъединять.

object

Объект какой-то структуры. Обычно эта структура будет уточняться.

void

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

mixed

Все, что угодно. Это может быть целое или дробное число, строка, массив или объект... Например, параметр типа mixed имеет стандартная функция gettype() или функция settype(). Если написано, что функция возвращает mixed, это значит, что тип результата зависит от операндов и уточняется при описании функции.

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

Константы

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

Глава 7. Переменные, константы, выражения

129

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

// Предположим, определена константа PI, равная 3.146

$a=2.34*sin(3*PI/8)+5;

// использование константы

echo "Это число PI";

// выведет "Это число PI"

echo "Это число ".PI;

// выведет "Это число 3.14"

То, что не надо писать "доллар" перед именем константы — это, конечно хорошо. Однако, как мы можем видеть из примера, есть и минусы: мы уже не можем использовать имя константы непосредственно в текстовой строке.

Предопределенные константы

Константы бывают двух типов: одни — предопределенные (то есть устанавливаемые самим интерпретатором), а другие определяются программистом. Существуют несколько предопределенных констант.

r__FILE__

Хранит имя файла программы, которая выполняется в данный момент.

r__LINE__

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

rPHP_VERSION

Версия интерпретатора PHP.

rPHP_OS

Имя операционной системы, под которой работает PHP.

rTRUE или true

Эта константа нам уже знакома и содержит значение "истина".

rFALSE или false

Содержит значение "ложь".

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

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

130

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

void define(string $name, string $value, bool $case_sen=true);

Определяет новую константу с именем, переданным в $name, и значением $value. Если необязательный параметр $case_sen равен true, то в дальнейшем в программе регистр букв константы учитывается, в противном случае — не учитывается (по умолчанию, как мы видим, регистр учитывается). Созданная константа не может быть уничтожена или переопределена.

Например:

define("pi",3.14); define("str","Test string"); echo sin(pi/4);

echo str;

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

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

В PHP существует также функция, которая проверяет, существует ли (была ли определена ранее) константа с указанным именем. Вот она.

bool defined(string $name)

Возвращает true, если константа с именем $name была ранее определена.

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

Выражения

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

Самый простой пример выражения — переменная или константа, стоящая, скажем, в правой части оператора присваивания. Например, цифра 5 в операторе

$a=5;

есть выражение, т. к. оно имеет значение 5. После такого присваивания мы вправе ожидать, что в $a окажется 5. Теперь, если мы напишем

$b=$a;

то, очевидно, в $b окажется также 5, ведь выражение $a в правой части оператора имеет значение 5.

Глава 7. Переменные, константы, выражения

131

Посмотрим еще раз на этот пример. Помните, я говорил, что практически все, из чего мы составляем программу — это выражения? Так вот, $b=$a —тоже выражение! (Впрочем, это не будет сюрпризом для знатоков Си или Perl). Нетрудно догадаться, какое оно имеет значение: 5 (тут просто не может быть никаких других вариантов, не правда ли?). А это значит, что мы можем написать что-то типа следующих команд:

$a=($b=10); // или просто $a=$b=10

При этом переменным $a и $b присвоится значение 10. А вот еще пример, уже менее тривиальный:

$a=3*sin($b=$c+10)+$d;

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

$b=$c+10; $a=3*sin($c+10)+$d;

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

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

$a=10*20; $b="".(123*3);

echo "$a:",gettype($a)," $b:",gettype($b); // выведет "200:integer 200:string"

Чтобы преобразовать одно значение в другое (например, нам может не понравиться, что $b — типа string, хотя содержит целое число), используются операторы преобразования типов. Эти операторы доступны как в функциональной, так и в префиксной операторной форме. Например, следующие две инструкции эквивалентны:

$a = intval($b); $a = (int)$b;

Итак, вот эти операторы:

r$b=intval(выражение) или $b=(int)(выражение)

Переводит значение выражения в целое число и присваивает его $b.

r$b=doubleval(выражение) или $b=(double)(выражение)

Переводит значение в действительное число и присваивает его $b.

r$b=strval(выражение) или $b=(string)(выражение)

132

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

Переводит значение выражения в строку.

r$b=(bool)(выражение)

Преобразует значение выражения в логический тип. То есть, после выполнения этого оператора в $b окажется либо true, либо false.

Вообще-то, есть еще два хитроумных оператора (array) и (object), но эти операторы мы рассматривать не будем в силу их крайне слабой распространенности.

Логические выражения

Логические выражения — это выражения, у которых могут быть только два значения: ложь и истина (или, что почти то же самое, 0 и 1). Что, поверили? Напрасно — на самом деле абсолютно любое выражение может рассматриваться как логическое в "логическом" же контексте (например, как условие для конструкции if-else). Ведь, как уже говорилось, в качестве истины может выступать любое ненулевое число, непустая строка и т. д., а под ложью подразумевается все остальное.

Для логических выражений справедливы все те выводы, которые мы сделали насчет логических переменных. Эти выражения чаще всего возникают при применении операторов >, < и == (равно), || (логическое ИЛИ), && (логическое И), ! (логическое НЕ) и других. Например:

$a = 10<5;

// $a=false

$a = $b==1;

// $a=true, åñëè $b=5

$a = $b>=1&&$b<=10

// $a=true, если $b в пределах от 1 до 10

$a = !($b||$c)&&$d;

// $a=true, если $b и $c ложны, а $d — истинно

Как осуществляется проверка истинности той или иной логической переменной? Да точно так же, как и любого логического выражения:

$b = $a>=1&&$a<=10; // присваиваем $b значение логического выражения if($b) echo "a в нужном диапазоне значений";

Строковые выражения

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

$a="Это текст, начинающийся на одной строке и продолжающийся на другой, третьей и т. д.";

Глава 7. Переменные, константы, выражения

133

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

Строка в апострофах

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

rпоследовательность \' трактуется PHP как апостроф и предназначена для вставки апострофа в строку, заключенную в апострофы;

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

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

Строка в кавычках

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

r\n обозначает символ новой строки;

r\r обозначает символ возврата каретки;

r\t обозначает символ табуляции;

r\$ обозначает символ $, чтобы следующий за ним текст случайно не был интерполирован, как переменная;

r\" обозначает кавычку;

r\\ обозначает обратный слэш;

r\xNN обозначает символ с шестнадцатеричным кодом NN.

Переменные в строках интерполируются. Например:

$a="Hello"; echo "$a world!"

Этот фрагмент выведет Hello world!, т. е. $a в строке была заменена на значение переменной $a (этому поспособствовал знак доллара, предваряющий любую переменную).

Давайте рассмотрим еще один пример. $a="Hell"; // слово Hello без буквы "o" echo "$ao world!";

134

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

Мы ожидаем, что выведется опять та же самая строка. Но задумаемся: как PHP узнает, имели ли мы в виду переменную $a или же переменную $ao? Очевидно, никак. Запустив фрагмент, убеждаемся, что он генерирует сообщение о том, что переменная $ao не определена. Как же быть? А вот как:

$a="Hell"; // слово Hello без буквы "o" echo $a."o world!"; // один способ echo "{$a}o world!"; // другой способ echo "${a}o world!"; // третий способ!

Мы видим, что существует целых три способа преодолеть проблему. Каким из них воспользоваться — дело ваше. Мне больше нравится вариант с {$a}, хотя он и введен в PHP лишь недавно.

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

Here-документ

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

$a=<<<MARKER

Далее идет какой-то текст, возможно, с переменными, которые интерполируются:

например, $name будет интерполирована здесь. MARKER;

Строка MARKER может быть любым алфавитно-цифровым идентификатором, не встречающимся в тексте here-документа в виде отдельной строки. Синтаксис накладывает 2 ограничения на here-документы:

rпосле <<<MARKER и до конца строки не должны идти никакие непробельные символы;

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

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

echo strip_tags(<<<EOD);

Глава 7. Переменные, константы, выражения

135

Какой-то текст с <b>тэгами </b> — этот пример НЕ работает! EOD;

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

Вызов внешней программы

Последняя строковая "константа" — строка в обратных апострофах (например, `команда`), заставляет PHP выполнить команду операционной системы и то, что она вывела, подставить на место строки в обратных апострофах. Вот так, например, мы можем в системе Windows узнать содержимое текущего каталога, которое выдает команда dir:

$st=`dir`;

echo "<pre>$st</pre>";

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

Операции

На самом деле, к этому моменту вы уже знакомы практически со всеми операциями над переменными и выражениями в PHP. И все же я приведу здесь их полный список с краткими комментариями, заменяя выражения-операнды буквами a и b.

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

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

ra + b — сложение

ra — b — вычитание

ra * b — умножение

ra / b — деление

ra % b — остаток от деления a на b

136

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

Операция деления / возвращает целое число (то есть, результат деления нацело), если оба выражения a и b — целого типа (или же строки, выглядящие как целые числа), в противном случае результат будет дробным. Операция вычисления остатка от деления % работает только с целыми числами, так что применение ее к дробным может привести к, мягко говоря, нежелательному результату.

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

ra.b — слияние строк a и b

ra[n] — символ строки в позиции n

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

Операции присваивания

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

$a = ($b = 4) + 5;

После этого $a равно 9, а $b равно 4.

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

Помимо этого основного оператора, существует еще множество комбинированных — по одному на каждую арифметическую, строковую и другую операцию. Например:

$a = 10;

$a += 4; // прибавить к $a 4 $s = "Hello";

$s .= " world!"; // теперь в $s "Hello world!"

Думаю, не стоит особо на них задерживаться.

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

Для операций $a+=1 и $b-=1 в связи с их чрезвычайной распространенностью в PHP ввели, как и в Си, специальные операторы. Итак:

r$a++ — увеличение переменной $a на 1;

r$a-- — уменьшение переменной $a на 1.

Как и в языке Си, эти операторы увеличивают или уменьшают значение переменной, а в выражении возвращают значение переменной $a до изменения. Например:

Глава 7. Переменные, константы, выражения

137

$a=10; $b=$a++;

echo "a=$a, b=$b"; // выведет a=11, b=10

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

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

$a=10; $b=--$a;

echo "a=$a, b=$b"; // выведет a=9, b=9

Операторы инкремента и декремента на практике применяются очень часто. Например, они встречаются практически в любом цикле for.

Битовые операции

Эти операции предназначены для работы (установки/снятия/проверки) групп битов в целой переменной. Биты целого числа — это не что иное, как отдельные разряды того же самого числа, записанного в двоичной системе счисления. Например, в двоичной системе число 12 будет выглядеть как 1100, а 2 — как 10, так что выражение 12|2 вернет нам число 14 (1110 в двоичной записи). Если переменная не целая, то она вначале округляется, а уж затем к ней применяются перечисленные ниже операторы.

ra & b — результат — число, у которого установлены только те биты, которые установлены и у a, и у b одновременно.

ra | b — результат — число, у которого установлены только те биты, которые установлены либо в a, либо в b (либо одновременно).

r~ a — результат, у которого на месте единиц в a стоят нули, и наоборот.

ra << b — результат — число, полученное поразрядным сдвигом a на b битов влево.

ra >> b — аналогично, только вправо.

Операции сравнения

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

r a == b — истина, если a равно b.