Информационные технологииStfw.Ru 🔍

Типы данных

Синтаксис языка и операторы
🕛 01.11.2006, 12:51
РНР поддерживает пять основных типов данных1: целые числа, дробные числа, строки, массивы и объекты. В документации РНР не указано, но имеется также логический тип (boolean): TRUE, FALSE; и специальный тип NULL для пустых2 (либо неинициализированных значений). Обычно тип переменной не указывается, а автоматически определяется интерпретатором во время исполнения. Можно принудительно задать тип переменной.

Целые числа

Целые числа указываются следующим образом:
$а = 1234; # десятичное целое
$а = -123; # отрицательное число
$а = 0123; # восьмеричное число (равно десятичному 83)
$а = 0x12; # шестнадцатеричное число
(равно десятичному 18)

Размерность целых чисел зависит от платформы, обычно она составляет 32 бита (+ 2 млн).

Дробные числа

Дробные числа (doubles) могут быть инициализированы следующим образом:
$а = 1 234; $а = 1.2еЗ. // 1.2еЗ == 1200

Размерность дробных чисел зависит от платформы, обычная максимальная точность -1.8е308 или приблизительно 14 десятичных значащих разрядов (64 бита в формате IEEE). В процессе арифметических преобразований неизбежна потеря точности (например, выражение floor((0.1+0.7)*10) возвратит 7 вместо ожидаемых 8, так как фактически ((0.1+0.7)*10)=7,99999999...). Кроме того, невозможно точное сопоставление иррациональных чисел (например, 1/3=0.3333333). Поэтому нельзя доверять точности последней цифры дробных чисел, а также сравнивать их без округления. Если требуется более высокая точность вычислений, обратитесь к функциям GMP или BCMath.

Строки

Строки могут быть обозначены двумя парами ограничителей (одинарные и двойные кавычки). При использовании одинарных кавычек строка воспринимается «как есть»; единственная замена, которая производится в строке, - это трансформация «\\» и «V» соответственно в «\» и «'», выполняемая для того, чтобы можно было использовать эти символы, если они обозначают самих себя.

Использование двойных кавычек позволяет интерпретатору заменить указанную в строке переменную на ее значение, например:

$а=5:
echo "а=$а"; // напечатает «а=5»

Чтобы вывести после значения переменной символы без разделения их пробелами, используйте заключение переменной в фигурные скобки.
$п=1:
echo "$nst": // такой переменной не существует
echo "{$n}st"; // выведет: lst

Для подстановки значений свойств вложенных объектов и многомерных массивов также используйте фигурные скобки или конкатенацию.
echo "{$obj->subobj->prop} {$a[l][2]['fnrsf]} ".

Обратный слеш «\» (так же, как в С и Perl) используется для подстановки специальных символов. Последовательность Означает
\n' Переход на новую строку (LF или ОхОА в ASCII)
\r Возврат к началу строки (CR или OxOD в ASCII)

\t
Горизонтальная табуляция (НТ или 0x09 в ASCII)

\\
Обратный слеш

\$
Знак доллара

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

\[0-7]{1,3}
1-3 восьмеричные цифры после слеша заменяются на корреспондирующий данному ASCII-коду символ

\x[0-9A-Fa-f]{l,2)
1-2 шестнадцатеричные цифры после \х заменяются на корреспондирующий данному ASCII-коду символ


Если после слеша стоит иной сиМbол, будет выдано предупреждение (если выдача предупреждений разрешена).

Иной способ обозначения длинных строк - это использование синтаксиса «here doc1 цитирование»: после последовательности <« указывается идентификатор, и все последующие строки, вплоть до того как вновь встретится этот идентификатор (он должен стоять в начальной позиции строки), считаются текстом строки. К идентификатору применяются те же требования, как и к именам переменных (он должен начинаться с буквы или «_» и содержать только алфавитно-цифровые символы или «_»). Цитирование аналогично использованию двойных кавычек, но кавычки здесь обозначают самих себя. Такой синтаксис широко используется в Perl.
<?php
$str = <«fndOfSl
Пример многострочной строки
синтаксиса «heredoc».
EndOfSl.
/* Пример посложнее с переменными. */ class foo {
echo " строка 1 строка 2
var $foo: var $bar:
function foo() { // конструктор класса
$tms->foo = 'Foo'.
$this->t>ar = arrayCBarl1. 'Ваг2'. 'ЕагЗ'): } }
$foo = new foot); $name = 'Игорь' :
echo «< EndOfS?
Мое имя - "Sname".
Значение переменной класса $foo->foo.
Еще одно значение другой
переменной класса {$foo->bar[l]}.
Заглавная
'А': \х41 EndOfS2; ->>

Строки можно объединять с помощью оператора конкатенации - точка, например:
echo "Значение а = ". $а "\n" "И т.д.";
Оператор сложения «+» не объединяет строки!

Строку можно использовать как нумерованный массив символов, используя С-подобный синтаксис.
<?php // Примеры работы со строками $str = "This is ";
$str = $str . " a string";
// $str = "This is a string"
$str .= " with a newline at the end An",
// $str = "This is a string with a newline at the end.\n"
$niJ!II = 9.
$str = "Значение- $num"; // подставляется значение $str = 'Переменная $num'; // значение НЕ подставляется
Sstr = 'This is a string ';
$first = $str[0]; // первый символ строки - 'Т'
$1ast = &#163;str[strlen($str)-l]; // последний символ строки - пробел ?>

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

При преобразовании строки в числовое значение результирующая неременная будет иметь тип дробного числа, если строка содержит символы «.», «е», «Е»; в противном случае результирующая пере-\ менная окажется целочисленной. Значение определяется по начальным цифрам строки, а если строка начинается с букв, ее числовое значение будет равно нулю. Правильным строковым представлени-_-s ем числа считается знак («-» или «+», который может отсутствовать у положительных чисел), за которым следует последовательность чисел, среди которых могут встречаться точка и/или буква «е». Незначащий ноль может быть пропущен.
$а = 1 + "10 5"; // $а - дробное (11.5)
$а = 1 + "-1.3еЗ": // $а - дробное (-1299)
$а = 1 + "-.ЗеЗ"; // $а - дробное (-299)
$а = 1 + "1-1.ЗеЗ"; // $а - целое (1)
$а = 1 + "тдогЗЗЗ": // $а - целое (1)
$а - 1 + "10 Разных Штук "; // $а - целое (11)
$а = "10.0 у е. " + 1: // $а - целое (11)
$а = "10.0 у.е " + 1.0: // $а - дробное (11)

Как видите, преобразование строк в числа происходит при осуществлении с ними арифметических операций, и если строка - это первый элемент выражения, тип ее преобразования зависит от типа последующих чисел. Если вы хотите проверить примеры, приведенные выше, добавьте строку: echo "\$а == $а: тип (" gettype ($а) . ")<br>\n";

Массивы

Массивы могут быть и действовать как простые индексированные списки (их называют векторами - в них индексом является число) или как ассоциативные списки (их называют хеш-таблицами - в них индексом служит строковое значение). Как в С и Perl, элементы массива нумеруются, начиная с 0, а не с 1.

Одномерные массивы

Массив можно инициализировать либо простым присваиванием ему новых элементов, либо явно, используя функцию аггауО. При добавлении в массив элемента без указания его индекса он заносится в конец списка.
$a[J = "abc". /, $а[0] = "abc";
$а[1] = "def":
$а[0] = "абв"; // заменить уже имеющийся элемент
*а[] = "gh"; // $а[2] - "abc";
rf пример инициализации нумерованного массива'
$м = array ("первый",
"седьмой". 86. 22):
# пример инициализации ассоциативного
массива: $с["нулевой"] = "АБВ":
$С["первый"] = 444;
$с[99] = 4.
// эквивалентно записи $с["99"]= 4:
//(это. тем не менее - третий элемент)
# аналог примера выше: $с = аггау(
"нулевой " => " АБВ ". "первый" '>
444. 99 => 4 ):

Массивы можно затем сортировать. Число элементов массива можно узнать, используя функцию countO. Для поэлементного перебора значений ассоциативного массива используются функции next (), prev() и each().

Многомерные массивы
$а[][0] = $f: I двухмерный $а[1][0] = tf: # двухмерный
$а["аа"][2] = $f. # возможно комбинировать $а[3]["бб"] = $f. # скалярные и ассоциативные индексы
$а["ааа"][4]["ббб"][0] = $f:# четырехмерный!
$а = агтау(
"апельсин" => аггау(
"цвет" => "оранжевый". "вкус" =>
"сладкий". ).
"лимон"=> аггау(
"цвет" => "желтый". "вкус" => "кислый". ) ):
echo $а["апельсин"]["вкус"]: # выведет "сладкий"

Для правильной подстановки значений многомерных массивов используйте оператор конкатенации или заключайте имя переменной в фигурные скобки. Иначе функция вывода будет воспринимать как относящиеся к массиву только первые скобки, а последующие - как текст.
$а[3]['6бб'] = 'Слово':
echo "Ошибочка: $а[3][ббб]": // Выведет «Ошибочка Аггау[ббб]»
echo "Работает: " . $а[3][ббб]. // Выведет «Работает:
Слово»
echo "Работает {$а[3][ббб]}": // Выведет «Работает:
Слово»

Объекты

Объекты создаются на основе заранее определенных классов с помощью оператора new:
<?php class foo {
function do_foo() { echo "Doing foo ".
} }
Ibar = new foo. .
$bar->do_foo().
?>

Определение типа

PHP не требует явного указания типа переменной, тип определяется интерпретатором во время выполнения и зависимости от того, как переменная используется (и какие значения ей присваиваются). Обычно такие преобразования интуитивно понятны (например, если одно из слагаемых дробное число, то результат - дробное число). Сами переменные не меняют своего типа, изменяется их восприятие. Тип изменяется только при присваивании или изменении значения.
$foo = "О": // $foo - строка (ASCII 48)
$foo++; // $foo - строка "1" (ASCII 49)
$foo += 1; // $foo - целое (2)
$foo = $foo +1.3: // $foo - дробное (3 3)
Sfoo = 5 + "10 Круглых кубиков": // $foo - целое (15)

Что касается автоматических преобразований массивов, то здесь возникают неоднозначности.
$а = 1. // $а - целое число $а[0] = "f": // $a становится массивом

Помните, что строки могут рассматриваться как массивы символов. Как поведет себя следующий код:
$а = "Г; // $а - это строка
$а[0] = "f": // станет ли $а массивом или
останется строкой?

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

Большинство функций возвращает значение FALSE при ошибке, а в случае нормального завершения - значение, отличное от FALSE. Для того чтобы можно было отличить значение FALSE от пустой строки или нуля, используйте оператор идентичности (а не равенства, который автоматически преобразует тип).
<? $1=-2: $b=TRUE:
// переменная $ZZZ не существует
1f($i) echo"! - TRU&#163;\n".
else echo"! != TRUEXn":
if($i - TRUE) echo"! - TRUEVn":
else echo"! !== TRUEVn":
if($b - TRUE) echo"b === TRUE\n";
else echo"b !== TRUE\n";
if($ZZZ === null)echo"ZZZ === null\n";
else echo"ZZZ !== null\n"; ?>

Приведенный сценарий должен вывести
i == TRUE т !== TRUE b === TRUE ZZZ - null

Явное приведение типов

Приведение типов сходно с С-стилем: тип переменной указывается перед исходной переменной.
$foo = 10; // $foo is an integer $foo = (boolean) $foo.
// теперь значение
$foo = 1 $bar = (double) $foo: // $bar is a double

Типы обозначаются как: (int), (integer) для целых; (real), (double), (float) для дробей; (string) для строк; (array) для массивов; (object) для объектов. Для логических значений: (bool) или (boolean). Тип также можно изменить функцией settype().

Заметьте, некоторые виды преобразований могут быть курьезными.

При преобразовании скалярного1 массива или строки в массив переменная становится нулевым элементом массива.
$var = 'ciao1:
$arr = (array) $var.
echo $згг[0]. // выводит 'ciao'

При преобразовании скалярного массива или строки в объект переменная становится свойством объекта с именем scalar:
$var = 'ciao':
$obj = (object) $var.
echo $obj->scalar: // выводит 'ciao'

Учебник по основам PHP   Теги:

Читать IT-новости в Telegram
Информационные технологии
Мы в соцсетях ✉