Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Целочисленное переполнение

Что такое PHP?

PHP - язык создания сценариев, который давно перерос свое название. Дело в том, что PHP - это аббревиатура от слов Personal Home Page. Первая версия PHP была создана Расмусом Лердорфом в 1994 г. и представляла собой набор инструментов для отслеживания посетителей Web-страницы. Со временем PHP из набора инструментов превратился в полноценный язык программирования, а его название было изменено как рекурсивное образование PHP HyperText Preprocessor (препроцессор гипертекста PHP).

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

В настоящее время основной версией PHP является пятая.

Существуют два основных конкурента PHP: Active Server Pages (ASP) компании Microsoft и ColdFusion компании Allaire. По сравнению с ними PHP обладает рядом преимуществ, в числе которых:

  • Высокая производительность. PHP-программы работают быстрее, чем ASP.
  • Функциональность. Разработку PHP-программы можно отделить от собственно разработки Web-страницы, что упростит жизнь и программисту, и дизайнеру.
  • Цена. PHP абсолютно бесплатен.
  • Простота в использовании. Имеющие опыт программирования на распространенных языках найдут синтаксис PHP хорошо знакомым.
  • Переносимость. Один и тот же PHP-код можно использовать как в среде NT, так и на платформах UNIX.

Общие правила построения PHP-программы

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

Расширение файлов PHP-программ по умолчанию в PHP4 - .php. На основании этого расширения сервер распознает файл как PHP-программу и запускает интерпретатор.

PHP-программа должна быть отделена от обычного HTML-текста. Существует четыре стиля обрамления PHP-кода:

Стиль Открывающий тег Закрывающий тег
Сокращенный <? ?>
XML (стандартный) <?php ?>
ASP <% %>
SCRIPT (программный) <SCRIPT LANGUAGE="php"> </SCRIPT>

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

Так выглядит простейший смешанный документ, состоящий из HTML-текста и PHP-кода:

Пример 1

<html><head> <title>Документ, состоящий из HTML-текста и PHP-кода</title></head><body><?phpecho "А вот и PHP!<br>";?>Всё очень просто! </body></html>

Здесь содержится один PHP-оператор echo. Этот оператор передает строку-аргумент "А вот и PHP!<br>" в HTML-страницу, которую генерирует сервер. При этом тег <br> сделает свое дело, т.е. осуществит переход на новую строку.

РЕЗУЛЬТАТ ПРИМЕРА 1:

А вот и PHP! Всё очень просто!

Для разделения операторов (по аналогии с Си) используется точка с запятой.

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

/* Многострочный комментарийв стиле классического Си */// Однострочный комментарий в стиле С++# Однострочный комментарий в стиле Perl

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

В примере 1 заменим вызов функции echo на вызов встроенной функции phpinfo(), которая выдаст список параметров PHP-среды.

Пример 2

<html><head><title>Информационная страница PHP</title></head><body><?php phpinfo();?></body></html>

Типы данных

На данный момент PHP-машина поддерживает восемь элементарных типов данных.

1. Четыре скалярных типа:
- логические значения;
- целые числа;
- вещественные числа в формате с плавающей запятой;
- строки.
2. Два сложных типа:
- массивы;
- объекты.
3. Два специальных типа:
- ресурсы;
- null.

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

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

В результате одни и те же переменные в зависимости от ситуации могут вести себя по-разному — в соответствии с их текущим типом. Подробнее этот вопрос рассматривается в раздел 3.2.9.

Логические переменные

Это, пожалуй, самый простой тип. Логическая переменная обозначает, истинно или ложно некоторое высказывание (выражение). Поэтому она может принимать только два значения: true (истина) или false (ложь).

Синтаксис

Задание литерала логической переменной или константы осуществляется с помощью ключевых слов TRUE и FALSE. Регистр используемых символов роли не играет. $foo = True; // присваивает переменной $foo значение TRUE Довольно часто логические значения используются как результат вычисления некоторых операторов, передаваемый затем в управляющие структуры:

if (Saction == "show_version")
// == представляет собой оператор, возвращающий
// логическое значение
{
echo "Текущая версия программы - 1.23R";
}
// А это несколько избыточная конструкция:
if ($show_separators == true)
{
echo <"hr>\n";
}

// поскольку, как и в Си, можно записать:
if ($show_separators)
{
echo "<hr>\n";
}

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

Чтобы явным образом привести значение некоторой переменной к логическому значению, вы можете использовать идентификатор типа (bool) или (boolean). Однако в большинстве случаев делать этого не нужно, поскольку значение конвертируется автоматически, если оператор, функция или управляющая структура требуют использования аргумента логического типа. (См. также раздел 3.2.9.)

При приведении к логическому типу перечисленные ниже значения будут интерпретированы как «ложь» (FALSE):

  • логическая константа FALSE;
  • целочисленный нуль — 0;
  • вещественный нуль — 0,0;
  • пустая строка «», а также строка «О»;
  • массив без элементов;
  • объект без элементов;
  • специальное значение NULL.

Все прочие значения при приведении к логическому типу интерпретируются как TRUE.

Целые числа

Целочисленные переменные в РНР принимают значения из множества Z =..., -2,-1,0,1,2,...

Синтаксис

Целые числа могут задаваться в десятичной, шестнадцатеричнои и восьмеричной системах счисления. Знак числа указывается символом + для положительных1 и символом - для отрицательных чисел. Если вы используете восьмеричное представление, вы должны начать число с символа 0 (нуля), а при использовании шестнадцатеричнои записи начать число с префикса 0х.

Вот несколько примеров записи целых чисел:

$а = 1234; # привычный формат представления числа
$а = -123; # отрицательное число
$а = 0123; # восьмеричное число (соответствует десятичному 83)
$а = 0xlA; # шестнадцатеричное число
# (соответствует десятичному 26)

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

Целочисленное переполнение

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

$large_number = 2147483647;
var_dump($large_number); // результат: int(2147483647)
$large_number = 2147483648;
var_dump($large_number); // результат: float(2147483648)

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

Smillion = 1000000;
$large_number = 50000 * Smillion;
var_dump($large_number); // результат: float(50000000000)

 

Выражения

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

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

$dwa = 2;

вы фактически имеете дело с двумя выражениями: константой «2» и переменной $dwa.

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

function five () {
return 5;
}

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

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

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

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

Стоит обратить внимание на один вид выражений, заимствованный из Perl, который представляет собой тернарный условный оператор, имеющий вид: $first? $second: $third

Если значение первого подвыражения $first отлично от нуля, производится оценка второго субвыражения $ second, значение которого становится результатом всего выражения в целом. Если же значение первого подвыражения равно нулю (или false), оценивается и возвращается в качестве результата третье подвыражение $third.

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

function double($i) {
return $i*2;
}

$b = $a = 5; // Присваивает целое число 5 переменным $а и $b

$с = $а++; // Присваивает 5 переменной $с, а затем
// инкрементирует значение $а

$е = $d = ++$b; // инкрементирует $а и присваивает переменным
// $d и $е значение 6.


$f = double($d++); // После вызова $f=12, $d = 7

$g = double(++$e); // после вызова $е=7, $g=14

$h = $g += 10; /* Вначале $g увеличивается на 10 и получает
значение 24. Затем это значение
присваивается переменной $h, которая тоже
становится равной 24.
*/

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

'ехрr' '; '
то есть представляет собой выражение, за которым следует точка с запятой. В частности, в примере $b=$а=5; фрагмент $а=5 не является оператором. А вот полное выражение $b=$а=5; представляет собой полный оператор.

Функции

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

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

Для определения собственной функции используется конструкция вида: function foo ($arg_l, $arg_2.....$arg_n) {
echo "Пример определения функции.\n";
return $retval;
}

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

Несмотря на свое «интерпретируемое» прошлое РНР не поддерживает перегрузку определений функций, и вы не можете отменить определение введенной ранее функции. Зато РНР 4 поддерживает как переменное количество аргументов функции, так и автоматическую подстановку значений по умолчанию.

Аргументы функции

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

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

function add_some_extra(&$string) {
$string.= 'и маленькая тележка.';
}
$str = 'Вагон ';
add_some_extra($str);
echo $str; // напечатает 'Вагон и маленькая тележка.'

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

function foo ($bar) {
$bar.= ' и маленькая тележка.';
}
$str = ' Вагон ';
foo ($str);
echo $str; // напечатает 'Вагон ' foo (&$str);
echo $str; // напечатает 'Вагон и маленькая тележка.'

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...