- •Пособие по работе в среде программирования php 4
- •1.Установка php
- •Настройка Apache для работы с php
- •Тестирование php
- •Установка дополнительных модулей
- •2. Характеристика языка php
- •Интерпретатор или компилятор?
- •Достоинства и недостатки интерпретатора
- •Использование php в Web
- •3. Переменные, константы, выражения
- •Переменные
- •Integer
- •Действия с переменными
- •1.Присвоение значения.
- •2.Проверка существования.
- •3.Уничтожение.
- •4.Определение типа переменной.
- •Константы
- •Выражения
- •Операции
- •4. Работа с данными формы
- •5. Конструкции языка
- •6. Ассоциативные массивы
- •Операции над массивами
- •1.Одинаковые ключи
- •2.Нулевой ключ
- •7. Функции и области видимости
- •8. Строковые функции
- •9. Работа с массивами
- •10. Математические функции
- •11. Работа с файлами
- •12. Работа с каталогами
- •13. Каналы и символические ссылки
Операции
На самом деле, к этому моменту вы уже знакомы практически со всеми операциями над переменными и выражениями в PHP. И все же я приведу здесь их полный список с краткими комментариями, заменяя выражения-операнды буквами a и b.
В большинстве публикаций, как только разговор заходит о выражениях и операциях, проводят громоздкую и неуклюжую таблицу приоритетов (порядка действий) и ассоциативности операторов. Пожалуй, я воздержусь от такой практики (ввиду ее крайней ненаглядности) и отошлю интересующихся к официальной документации по PHP. Вместо этого я посоветую вам везде, где возможна хоть малейшая неоднозначность, использовать скобки.
Арифметические операции
●a + b – сложение
●a – b – вычитание
●a * b – умножение
●a / b – деление
●a % b – остаток от деления a на b
Операция деления / возвращает целое число (то есть, результат деления нацело), если оба выражения a и b – целого типа (или же строки, выглядящие как целые числа), в противном случае результат будет дробным. Операция вычисления остатка от деления % работает только с целыми числами, так что применение ее к дробным может привести к, мягко говоря, нежелательному результату.
Строковые операции
●a.b – слияние строк a и b
●a[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 ввели, как и в Си, специальные операторы. Итак:
●$a++о – увеличение переменной $a на 1;
●$a-- – уменьшение переменной $a на 1.
Как и в языке Си, эти операторы увеличивают или уменьшают значение переменной, а в выражении возвращают значение переменной $a до изменения. Например:
$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 в двоичной записи). Если переменная не целая, то она вначале округляется, а уж затем к ней применяются перечисленные ниже операторы.
●a & b – результат – число, у которого установлены только те биты, которые установлены и у a, и у b одновременно.
●a | b – результат – число, у которого установлены только те биты, которые установлены либо в a, либо в b (либо одновременно).
●~ a – результат, у которого на месте единиц в a стоят нули, и наоборот.
●a << b – результат – число, полученное поразрядным сдвигом a на b битов влево.
●a >> b – аналогично, только вправо.
Операции сравнения
Это в своем роде уникальные операции, потому что независимо от типов своих аргументов они всегда возвращают одно из двух: false или true. Операции сравнения позволяют сравнивать два значения между собой и, если условие выполнено, возвращают true, а если нет – false.
●a == b – истина, если a равно b.
●a != b – истина, если a не равно b.
●a < b – истина, если a меньше b.
●a > b – аналогично больше.
●a <= b – истина, если a меньше либо равно b.
●a >= b – аналогично больше либо равно.
Следует отметить, что в PHP сравнивать можно только скалярные (то есть строки и числа) переменные. Для массивов и объектов этого делать нельзя. Их даже нельзя сравнивать на равенство (при помощи оператора ==), но при выполнении такой операции PHP не выдает предупреждения. Так что удивившись как-то раз, почему это два совершенно разных массива при сравнении их с помощью == оказываются вдруг одинаковыми, вспомните, что перед сравнением оба операнда преобразуются в слово array, которое потом и сравнивается.
Операции эквивалентности
В PHP версии 4 появился новый оператор сравнения – тройной знак равенства ===, или оператор проверки на эквивалентность. Как мы уже замечали ранее, PHP довольно терпимо относится к тому, что строки неявно преобразуются в числа, и наоборот. Например, следующий код выведет, что значения переменных равны:
$a=10;
$b="10";
if($a==$b) echo "a и b равны";
И это несмотря на то, что переменная $a представляет собой число, а $b – строку. Впрочем, данный пример показывает, каким PHP может быть услужливым, когда нужно. Давайте теперь посмотрим, какой казус может породить эта "услужливость".
$a=0; // ноль
$b=""; // пустая строка
if($a==$b) echo "a и b равны";
Хотя $a и $b явно не равны даже в обычном понимании этого слова, программа заявит, что они совпадают. Почему так происходит? Дело в том, что если один из операндов логического оператора может трактоваться как число, то оба операнда трактуются как числа. При этом пустая строка превращается в 0, который затем и сравнивается с нулем. Неудивительно, что оператор echo срабатывает.
Проблему решает оператор эквивалентности === (тройное равенство). Он не только сравнивает два выражения, но также их типы. Перепишем наш пример с использованием этого оператора:
$a=0; // ноль
$b=""; // пустая строка
if($a===$b) echo "a и b равны";
Вот теперь ничего напечатано не будет. Но возможности оператора эквивалентности идут далеко за пределы сравнения "обычных" переменных. С его помощью можно сравнивать также и массивы, объекты и т. д. Это бывает иногда очень удобно. Вот пример:
$a=array(’a’=>’aaa’);
$b=array(’b’=>’bbb’);
if($a==$b) echo "С использованием == a=b<br>";
if($a===$b) echo "С использованием === a=b<br>";
Если запустить представленный код, то выведется первое сообщение, но не второе. Произойдет это по той причине, что, как мы уже говорили, операнды-массивы преобразуются в строки array, которые затем и будут сравниваться. Оператор === лишен этого недостатка, поэтому работает верно.
Разумеется, для оператора === существует и его антипод – оператор !=== (он состоит из целых четырех символов!). Думаю, что не нужно объяснять, как он работает.
Логические операции
Эти операции предназначены исключительно для работы с логическими выражениями и также возвращают false или true.
●! а – истина, если a ложно, и наоборот.
●a && b – истина, если истинны и a, и b.
●a || b – истина, если истинны или a, или b, или они оба.
Следует заметить, что вычисление логических выражений, содержащих такие операции, идет всегда слева направо, при этом, если результат уже очевиден (например, false&&что-то всегда дает false), то вычисления обрываются, даже если в выражении присутствуют вызовы функций. Например, в операторе $logic = 0&&(time()>100); стандартная функция time() никогда не будет вызвана.
Будьте осторожны с логическими операциями – не забывайте про удваивание символа. Обратите внимание, что, например, | и || – два совершенно разных оператора, один из которых может потенциально возвращать любое число, а второй – только false и true.
Оператор отключения предупреждений
Выдаче ясных и адекватных сообщений о возникших во время выполнения сценария ошибках разработчики PHP заслуженно уделили особое внимание. Наверное, вы уже запускали несколько простых PHP-программ из браузера и имели удовольствие видеть, что все ошибки выводятся прямо в окно браузера вместе с указанием, на какой строке и в каком файле они обнаружены. Остается только в редакторе найти нужную строку и исправить ошибку. К сожалению, PHP – чуть ли не первый язык, который выводит предупреждения в браузер, а не в файлы журналов. Если вы работали некоторое время с таким языком, как Perl, то, наверное, уже успели устать от бесконечных верениц "500-х ошибок", которые Perl выдает при малейшей оплошности в сценарии. Теперь можете вздохнуть с облегчением: PHP никогда не выдаст сообщение о 500-й ошибке, что бы ни произошло.
PHP устроен так, что ранжирует ошибки и предупреждения по четырем основным "уровням серьезности". Вы можете настроить его так, чтобы он выдавал только ошибки тех уровней, которые вас интересуют, игнорируя остальные (то есть, не выводя предупреждений о них). Впрочем, я рекомендую всегда включать контроль ошибок по-максимуму, т. к. это может существенно упростить отладку программ. Допустим, мы так и поступили, и теперь PHP "ругается" даже на незначительные ошибки. Однако не всегда это бывает удобно. Более того, иногда предупреждения со стороны интерпретатора просто недопустимы. Рассмотрим, например, такой сценарий (листинг 3.4):
Листинг 3.4. Навязчивые предупреждения
<form action=test.php>
<input type=submit name="doGo" value="Click!">
</form>
<?
if($doGo) echo "Вы нажали кнопку!";
?>
Мы хотели сделать так, чтобы при нажатии на кнопку выдавалось соответствующее сообщение, но вот беда: теперь при первом запуске сценария PHP выдаст предупреждение о том, что "переменная $doCliсk не инициализирована". Ну не отключать же из-за такой мелочи контроль ошибок во всем сценарии, не правда ли? Как бы нам временно блокировать проверку ошибок, чтобы она не действовала только в одном месте, не влияя на остальной код?
Вот для этого и существует оператор @ (отключение ошибок). Если разместить данный оператор перед любым выражением (возможно, включающим вызовы функций, генерирующих предупреждения), то сообщения об ошибках в этом выражении будут подавлены и в окне браузера не отображены.
На самом деле текст предупреждения сохраняется в переменной PHP $php_errormsg, которая может быть в будущем проанализирована. Эта возможность доступна, если в настройках PHP включен параметр track_errors (по умолчанию он как раз и установлен в yes). Вот теперь мы можем переписать наш пример, грамотно отключив надоедливое предупреждение (листинг 3.5).
Листинг 3.5. Отключение навязчивого предупреждения
<form action=test.php>
<input type=submit name="doGo" value="Click!">
</form>
<?
if(@$doGo) echo "Вы нажали кнопку!";
?>
Как можно заметить, листинг 3.5 отличается от листинга 3.4 всего лишь наличием оператора @ внутри скобок инструкции if. Еще раз хочу посоветовать вам включать максимальный контроль ошибок в настройках PHP, а в спорных местах применять оператор @. Это просто, красиво, удобно. К тому же, как я уже говорил, способно в несколько раз облегчить отладку сценариев, не работающих по загадочным причинам.
