Главная страница

Лабораторная работа 3. Разработка скриптов для генерации страниц


Скачать 248.71 Kb.
НазваниеЛабораторная работа 3. Разработка скриптов для генерации страниц
Дата25.02.2019
Размер248.71 Kb.
Формат файлаdocx
Имя файлаLab_03.docx
ТипЛабораторная работа
#68820
страница3 из 7
1   2   3   4   5   6   7

John

";

}


}


  • Создаем объект класса Coor:

$object = new Coor;!

  • Получаем доступ к членам класса:

$object->name = "Alex";

echo $object->name;

  • Выводит 'Alex'







$object->Getname();

  • Выводит 'John' крупными буквами!

?>

Вот так, кратко описав синтаксис, можно охарактеризовать язык PHP.

Двоичные данные (Boolean)

Это простейший тип. Он выражает истинность значения - это может быть либо TRUE, либо FALSE. Булев тип был введен в PHP4.

Чтобы определить булев тип, используйте ключевое слово TRUE или FALSE. Оба регистро-независимы.


$x = True; // присвоить $x значение TRUE ?>

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



  • == это оператор, который проверяет



  • эквивалентность и возвращает булево значение if ($action ==





  • "показать_версию") {





echo "Версия 1.23";


}

  • это не обязательно...

if ($show_separators == TRUE) { echo "
\n";


}

  • ...потому что вы можете просто написать if ($show_separators) {

echo "
\n";


} ?>

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

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

При преобразовании в логический тип, следующие значения рассматриваются как FALSE:

  • Сам булев FALSE



  • целое 0 (ноль)

• число с плавающей точкой 0.0(ноль)

  • пустая строка и строка "0"



  • массив с нулевыми элементами



  • объект с нулевыми переменными-членами

• специальный типNULL (включая неустановленные переменные)

Все остальные значения рассматриваются как TRUE (включая любой ресурс).

Внимание! -1 считается TRUE, как и любое ненулевое (отрицательное или положительное) число!
















var_

dump((bool) "");

// bool(false)






var_dump((bool) 1);

// bool(true)









var_dump((bool) -2);

// bool(true)






var_dump((bool) "foo");

// bool(true)






var_dump((bool) 2.3e5);

// bool(true)



var_dump((bool) array(12));

// bool(true)



var_dump((bool) array());

// bool(false)






var_dump((bool) "false");

// bool(true)






?>










Целые числа (Integer)

Целое - это число из множества Z = {..., -2, -1, 0, 1, 2, ...}, обычно длиной 32 бита (от –2 147 483 648 до 2 147 483 647).

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

Если вы используете восьмеричную систему счисления, вы должны предварить число 0 (нулем), для использования шестнадцатеричной системы нужно поставить перед числом 0x.


$a = 1234; // десятичное число

$a = -123; // отрицательное число

$a = 0123; // восьмеричное число (эквивалентно 83 в дес ятичной системе)

$a = 0x1A; // шестнадцатеричное число (эквивалентно 26

  • десятичной системе)

?>

Формально возможная структура целых такова:

десятичные : [1-9][0-9]*
| 0


шестнадцатеричные: 0[xX][0-9a-fA-F]+

восьмеричные: 0[0-7]+

целые:

[+-]?десятичные

| [+-]?шестнадцатеричные

| [+-]?восьмеричные

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

Превышение размера целого

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


$large_number = 2147483647;

var_dump($large_number);

  • вывод: int(2147483647)

$large_number = 2147483648;

var_dump($large_number);

// вывод: float(2147483648)

это справедливо и для шестнадцатеричных целых:

var_dump( 0x80000000 );

  • вывод: float(2147483648)

$million = 1000000;

$large_number = 50000 * $million;

var_dump($large_number);

    • вывод: float(50000000000)

?>

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


var_dump(25/7); // float(3.5714285714286) 
 var_dump((int) (25/7)); // int(3) var_dump(round(25/7)); // float(4) ?>

Преобразование в целое (integer)

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

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

FALSE преобразуется в 0 (ноль), а TRUE - в 1 (единицу).

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

При преобразовании из числа с плавающей точкой в целое, число будет округлено в сторону нуля.

Если число с плавающей точкой превышает пределы целого (как правило, это +/- 2.15e+9 = 2^31), результат будет неопределенным, так как целое не имеет достаточной точности, чтобы вернуть верный результат. В этом случае не будет выведено ни предупреждения, ни даже замечания!

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


echo (int) ( (0.1+0.7) * 10 ); // выводит 7! (ошибка!) ?>

Числа с плавающей точкой (Float)

Double - вещественное число довольно большой точности (ее должно хватить для подавляющего большинства математических вычислений).

Числа с плавающей точкой (они же числа двойной точности или действительные числа) могут быть определены при помощи любого из следующих синтаксисов:


$a = 1.234;

$b = 1.2e3;

$c = 7E-10;

?>

Формальная структура скалярного типа float такая:

LNUM [0-9]+

DNUM ([0-9]*[\.]{LNUM}) | ({LNUM}[\.][0-9]*)

EXPONENT_DNUM ( ({LNUM} | {DNUM}) [eE][+-]? {LNUM})
Размер целого зависит от платформы, хотя максимум, как правило, 1.8e308 с точностью около 14 десятичных цифр (это 64-битный IEEE-формат).

Точность числа с плавающей точкой

Довольно часто простые десятичные дроби вроде 0.1 или 0.7 не могут быть преобразованы в свои внутренние двоичные аналоги без небольшой потери точности. Это может привести к неожиданным результатам, например, floor((0.1+0.7)*10) скорее всего возвратит 7 вместо ожидаемой 8 как результат внутреннего представления числа,являющегося вдействительности чем-то вроде 7.9999999999....

Это связано с невозможностью точно выразить некоторые дроби в десятичной системе счисления конечным числом цифр. Например, 1/3 в десятичной форме принимает вид 0.3333333. . ..

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

Строки

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

В PHP символ это то же самое, что и байт, это значит, что возможно ровно 256 различных символов. Это также означает, что PHP не имеет встроенной поддержки Unicode. Некоторую поддержку Unicode обеспечивают функции utf8_encode() и utf8_decode().

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

Простой пример строковой переменной:


$a = "Это просто текст, записанный в строковую переменную";

echo $a; //

Выводит 'Это просто текст, записанный в строковую перем енную'

?>

А теперь подробно разберем синтаксис типа данных string.

Синтаксис типа string (строк)

Строка может быть определена тремя различными способами.

  • одинарными кавычками



  • двойными кавычками



  • heredoc-синтаксисом

Определение строк одинарными кавычками:

Простейший способ определить строку - это заключить ее в одинарные кавычки (символ ').
Чтобы использовать одинарную кавычку внутри строки, как и во многих других языках, ее необходимо предварить символом обратной косой черты (\), т. е. экранировать ее. Если обратная косая черта должна идти перед одинарной кавычкой либо быть в конце строки, вам необходимо продублировать ее. Обратите внимание, что если вы попытаетесь экранировать любой другой символ, обратная косая черта также будет напечатана! Так что, как правило, нет необходимости экранировать саму обратную косую черту.

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

Приведем пример использования одинарных кавычек:


echo 'это простая строка';

echo 'Также вы можете вставлять в строки символ новой строки таким образом, поскольку это нормально';

  • Выведет: Однажды Арнольд сказал: "I'll be back" echo 'Однажды Арнольд сказал: "I\'ll be back"';



  • Выведет: Вы удалили C:\*.*? echo 'Вы удалили C:\\*.*?';




  • Выведет: Вы удалили C:\*.*? echo 'Вы удалили C:\*.*?';



  • Выведет: Это не вставит: \n новую строку echo 'Это не вставит: \n новую строку';



  • Выведет: Переменные $expand также $either не подстав ляются

echo 'Переменные $expand также $either не подставляются'; ?>

Определение строк двойными кавычками:

Если строка заключена в двойные кавычки ("), PHP распознает большее количество управляющих последовательностей для специальных символов:

Таблица управляющих последовательностей:

Последовательность

Значение

\n

новая строка (LF или 0x0A (10) в ASCII)

\r

возврат каретки (CR или 0x0D (13) в ASCII)

\t

горизонтальная табуляция (HT или 0x09 (9) в ASCII)

\\

обратная косая черта

\$

знак доллара

\"

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

\[0-7]{1,3}

последовательность символов, соответствующая регулярному выражению, символ в восьмеричной системе счисления

\x[0-9A-Fa-f]{1,2}

последовательность символов, соответствующая регулярному выражению, символ в шестнадцатеричной системе счисления

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

Самым важным свойством строк в двойных кавычках является обработка переменных.

Определение строкheredoc-синтаксисом:

Другой способ определения строк - это использование heredoc-синтаксиса ("<<<"). После <<< необходимо указать идентификатор, затем идет строка, а потом этот же идентификатор, закрывающий вставку.

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

Внимание! Очень важно отметить, что строка с закрывающим идентификатором не содержит других символов, за исключением, возможно, точки с запятой (;). Это означает, что идентификатор не должен вводиться с отступом и что не может быть никаких пробелов или знаков табуляции до или после точки с запятой. Важно также понимать, что первым символом перед закрывающим идентификатором должен быть символ новой строки, определенный в вашей операционной системе. Например, на Windows® это \r.

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

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

Пример определения heredoc-строки:


$str = <<

Пример строки,охватывающей несколько строчек,с использованием heredoc-синтаксиса. EOD;

/* Более сложный пример с переменными. */ class foo

{

var $foo;


var $bar;


function foo()


{


$this->foo = 'Foo';


$this->bar = array('Bar1', 'Bar2', 'Bar3');


}


}

$foo = new foo();

$name = 'МоеИмя';

echo <<

Меня зовут "$name". Я печатаю $foo->foo. Теперь я вывожу {$foo->bar[1]}.

Это должно вывести заглавную букву 'A': \x41

EOT;

?>

Обработка строк

Если строка определяется в двойных кавычках, либо при помощи heredoc, переменные внутри нее обрабатываются. Существует два типа синтаксиса: простой и сложный. Простой синтаксис более легок и удобен. Он дает возможность обработки переменной, значения массива (array) или свойства объекта (object).

Сложный синтаксис был введен в PHP 4 и может быть распознан по фигурным скобкам, окружающим выражение.

Простой синтаксис

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


$beer = 'Heineken';

echo "$beer's taste is great"; // работает, "'" это нев ерный символ для имени переменной

echo "He drank some $beers"; //

не работает, 's' это

верный символ для имени переменной



echo "He drank some ${beer}s"; //

работает



echo "He drank some {$beer}s"; //

работает



?>










Точно также могут быть обработаны элемент массива (array) или свойство объекта (object). В индексах массива закрывающая квадратная скобка (]) обозначает конец определения индекса. Для свойств объекта применяются те же правила, что и для простых переменных, хотя с ними невозможен трюк, как с переменными.


  • Эти примеры специфически об использовании массивов в нутри

  • строк. Вне строк всегда заключайте строковые ключи в ашего

  • массива в кавычки и не используйте вне строк {скобки

}.

  • Давайте покажем все ошибки error_reporting(E_ALL);

$fruits = array('strawberry' => 'red', 'banana' => 'yel low');

  • Работает, но заметьте, что вне кавычек строки это ра ботает по-другому

echo "A banana is $fruits[banana].";

//Работает

echo "A banana is {$fruits['banana']}.";

  • Работает, но PHP, как описано ниже, сначала ищет

  • константу banana.

echo "A banana is {$fruits[banana]}.";

  • Не работает, используйте фигурные скобки. Это вызове т ошибку обработки.

echo "A banana is $fruits['banana'].";

  • Работает

echo "A banana is " . $fruits['banana'] . ".";

  • Работает

echo "This square is $square->width meters broad.";

  • Не работает. Для решения см. сложный синтаксис. echo "This square is $square->width00 centimeters broad."; ?>



Для более сложных задач вы можете использовать сложный синтаксис.

Сложный (фигурный) синтаксис

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

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

  • }. Поскольку вы не можете экранировать '{', этот синтаксис будет распознаваться только когда $ следует непосредственно за {. (Используйте "{\$" или "\{$" чтобы отобразить "{$"). Несколько поясняющих примеров:


  • Давайте покажем все ошибки error_reporting(E_ALL);

$great = 'fantastic';

  • Не работает, выведет: This is { fantastic} echo "This is { $great}";



  • Работает, выведет: This is fantastic echo "This is {$great}";

echo "This is ${great}";



  • Работает

echo "Этот квадрат шириной {$square->width}

  1. сантиметров.";



  • Работает

echo "Это работает: {$arr[4][3]}";

  • Это неверно по той же причине, что и $foo[bar] невер но вне

  • строки. Другими словами, это по-

прежнему будет работать,

  • но поскольку PHP сначала ищет константу foo, это выз овет

  • ошибку уровня E_NOTICE (неопределенная константа). echo "Это неправильно: {$arr[foo][3]}";

  • Работает. При использовании многомерных массивов, вн утри

  • строк всегда используйте фигурные скобки

echo "Это работает: {$arr['foo'][3]}";

  • Работает.

echo "Это работает: " . $arr['foo'][3];

echo "Вы даже можете записать {$obj->values[3]->name}";

echo "Это значение переменной по имени $name: {$ {$name}}";

?>

Доступ к символу в строке и его изменение:

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


  • Получение первого символа строки $str = 'Это тест.';

$first = $str{0};

  • Получение третьего символа строки $third = $str{2};

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

$str = 'Это все еще тест.';

$last = $str{strlen($str)-1};

  • Изменение последнего символа строки $str = 'Посмотри на море'; $str{strlen($str)-1} = 'я';

?>

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

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

Конкатенация строк:

  • различных языках программирования используются различные операторы конкатенации (объединения) строк. Например, в Pascal используется оператор "+". Использование в PHP оператора "+" для конкатенации строк некорректно: если строки содержат числа, то вместо объединения строк будет выполнена операция сложения двух чисел.



  • PHP есть два оператора, выполняющие конкатенацию.


Первый - оператор конкатенации ('.'), который возвращает объединение левого и правого аргумента.

Второй - оператор присвоения с конкатенацией, который присоединяет правый аргумент к левому.

Приведем конкретный пример:


$a = "Hello ";

$b = $a . "World!"; // $b содержит строку "Hello World!

  • - Это конкатенация

$a = "Hello ";

$a .= "World!"; // $a содержит строку "Hello World!

  • - Это присвоение с конкатенацией

?>

Операторы сравнения строк

Для сравнения строк не рекоммендуется использовать операторы сравнения == и !=, поскольку они требуют преобразования типов. Пример:


$x=0;

$y=1;

if ($x == "") echo "
x - пустая строка
";

if ($y == "") echo "
y - пустая строка
"; //Выводит:

  • x - пустая строка

?>

Данный скрипт сообщает нам, что $x - пустая строка. Это связано с тем, что пустая строка ("") трактуется прежде всего как 0, а только затем - как "пусто". В PHP операнды сравниваются, как строки, только в том случае, если оба они - строки. В противном случае они сравниваются как числа. При этом любая строка, которую PHP не удается перевести в число (в том числе и пустая строка), будет восприниматься как 0.

Примеры сравнения строк:


$x="Строка";

$y="Строка";

$z="Строчка";

if ($x == $z) echo "
Строка X равна строке Z
";

if ($x == $y) echo "
Строка X равна строке Y
";

if ($x != $z) echo "
Строка X НЕ равна строке Z
";

  • Выводит:

  • Строка X равна строке Y

  • Строка X НЕ равна строке Z

?>

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


$x="Строка";

$y="Строка";

$z="Строчка";

if ($x === $z) echo "
Строка X равна строке Z
";!

if ($x === $y) echo "
Строка X равна строке Y
";!

if ($x !== $z) echo "
Строка X НЕ равна строке Z
";!

  • Выводит:

  • Строка X равна строке Y

  • Строка X НЕ равна строке Z

?>

Функции для работы со строками

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

Базовые строковые функции

strlen(string $st)

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

$x = "Hello!";


echo strlen($x); // Выводит 6

strpos(string $where, string $what, int $fromwhere=0)

Пытается найти в строке $where подстроку (то есть последовательность символов) $what и в случае успеха возвращает позицию (индекс) этой подстроки в строке. Необязательный параметр $fromwhere можно задавать, если поиск нужно вести не с начала строки $ from, а с какой-то другой позиции. В этом случае следует эту позицию передать в $fromwhere. Если подстроку найти не удалось, функция возвращает false. Однако будьте внимательны, проверяя результат вызова strpos() на false — используйте для этого только оператор ===. Пример:

echo strpos("Hello","el"); // Выводит 1

И еще пример:

if (strpos("Norway","rwa") !== false) echo "Строка rwa есть в Norway";

  • При сравнении используйте операторы тождественных сравнений (===) (!==) чтобы избежать проблем с определением типов

substr(string $str, int $start [,int $length])'

Данная функция тоже востребуется очень часто. Ее назначение — возвращать участок строки $str, начиная с позиции $start и длиной $length. Если $length не задана, то подразумевается подстрока от $start до конца строки $str. Если $start больше, чем длина строки, или же значение $length равно нулю, то возвращается пустая подстрока. Однако эта функция может делать и еще довольно полезные вещи. К примеру, если мы передадим в $start отрицательное число, то будет считаться, что это число является индексом подстроки, но только отсчитываемым от конца $str (например, -1 означает "начиная с последнего символа строки"). Параметр $length, если он задан, тоже может быть отрицательным. В этом случае последним символом возвращенной подстроки будет символ из $str с индексом $length, определяемым от конца строки. Примеры:

$str = "Programmer";


echo substr($str,0,2); // Выводит Pr echo substr($str,-3,3); //

Выводит mer

strcmp(string $str1, string $str2)

Сравнивает две строки посимвольно (точнее, побайтово) и возвращает: 0, если строки полностью совпадают; -1, если строка $str1 лексикографически меньше $str2; и 1, если, наоборот, $str1 "больше" $str2. Так как сравнение идет побайтово, то регистр символов влияет на результаты сравнений.

strcasecmp(string $str1, string $str2)

То же самое, что и strcmp(), только при работе не учитывается регистр букв. Например, с точки зрения этой функции "ab" и "AB" равны.

Функции для работы с блоками текста

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

str_replace(string $from, string $to, string $str)'

Заменяет в строке $str все вхождения подстроки $from (с учетом регистра) на $to и возвращает результат. Исходная строка, переданная третьим параметром, при этом не меняется. Эта функция работает значительно быстрее, чем ereg_replace(), которая используется при работе с регулярными выражениями PHP, и ее часто используют, если нет необходимости в каких-то экзотических правилах поиска подстроки. Например, вот так мы можем заместить все символы перевода строки на их HTML эквивалент — тэг
:

$st=str_replace("\n","
\n",$str)

Как видим, то, что в строке
\n тоже есть символ перевода строки, никак не влияет на работу функции, т. е. функция производит лишь однократный проход по строке. Для решения описанной задачи также применима функция nl2br(), которая работает чуть быстрее.

string nl2br(string $string)

Заменяет в строке все символы новой строки \n на
\n и возвращает результат. Исходная строка не изменяется. Обратите внимание на то, что символы \r, которые присутствуют в конце строки текстовых файлов Windows, этой функцией никак не учитываются, а потому остаются на старом месте.

WordWrap(string $str, int $width=75, string $break="\n")

Эта функция, появившаяся в PHP4, оказывается невероятно полезной, например, при форматировании текста письма перед автоматической отправкой его адресату при помощи mail(). Она разбивает блок текста $str на несколько строк, завершаемых символами $break, так, чтобы на одной строке было не более $width букв. Разбиение происходит по границе слова, так что текст остается читаемым. Возвращается получившаяся строка с символами перевода строки, заданными в $break. Пример использования:


$str = "Это текст электронного письма, которое нужно буд ет отправить адресату...";

  • Разбиваем текст по 20 символов

$str = WordWrap ($str, 20, "
");

echo $str;

  • Выводит: /* Это текст электронного письма, которое нужно будет отправить адресату... */

?>

strip_tags (string $str [, string $allowable_tags])

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

$stripped = strip_tags ($str); // Удаляет все html - теги из строки (текста)

$stripped = strip_tags($str, "
1   2   3   4   5   6   7


написать администратору сайта