PHP: Манипуляции с типами — Manual
Манипуляции с типами
PHP не требует (и не поддерживает) явного типа при определении переменной; тип переменной определяется по контексту, в котором она используется. То есть, если вы присвоите значение типа string переменной $var, то $var изменит тип на string. Если вы затем присвоите $var значение типа integer, она станет целым числом (integer).
Примером автоматического преобразования типа является оператор умножения ‘*’. Если какой-либо из операндов является float, то все операнды интерпретируются как float, и результатом также будет float. В противном случае операнды будут интерпретироваться как integer и результат также будет integer. Обратите внимание, что это НЕ меняет типы самих операндов; меняется только то, как они вычисляются и сам тип выражения.
<?php
$foo = "1"; // $foo - это строка (ASCII-код 49)
$foo *= 2; // $foo теперь целое число (2)
$foo = 5 * "10 Little Piggies"; // $foo - это целое число (50)
$foo = 5 * "10 Small Pigs"; // $foo - это целое число (50)
?>
Если последние два примера вам непонятны, смотрите Преобразование строк в числа.
Если вы хотите, чтобы переменная принудительно вычислялась как определенный тип, смотрите раздел приведение типов. Если вы хотите изменить тип переменной, смотрите settype().
Если вы хотите протестировать любой из примеров, приведенных в данном разделе, вы можете использовать функцию var_dump().
Замечание:
Поведение автоматического преобразования в массив в настоящий момент не определено.
К тому же, так как PHP поддерживает индексирование в строках аналогично смещениям элементов массивов, следующий пример будет верен для всех версий PHP:
<?php
$a = 'car'; // $a - это строка
$a[0] = 'b'; // $a все еще строка
echo $a; // bar
?>Более подробно смотрите в разделе Доступ к символу в строке.
Приведение типов
Приведение типов в PHP работает так же, как и в C: имя требуемого типа записывается в круглых скобках перед приводимой переменной.
<?php
$foo = 10; // $foo - это целое число
$bar = (boolean) $foo; // $bar - это булев тип
?>
Допускаются следующие приведения типов:
- (int), (integer) — приведение к integer
- (bool), (boolean) — приведение к boolean
- (float), (double), (real) — приведение к float
- (string) — приведение к string
- (array) — приведение к array
- (object) — приведение к object
- (unset) — приведение к NULL
Приведение типа (binary) и поддержка префикса b были добавлены в PHP 5.2.1. Обратите внимание, что (binary) по существу то же самое, что и (string), но не следует полагаться на этот тип приведения.
Приведение типа (unset) объявлено устаревшим с PHP 7.2.0. Обратите внимание, что приведение типа (unset) это то же самое, что присвоение NULL переменной. Тип приведения (unset) будет удален в PHP 8.0.0.
Обратите внимание, что внутри скобок допускаются пробелы и символы табуляции, поэтому следующие примеры равносильны по своему действию:
<?php
$foo = (int) $bar;
$foo = ( int ) $bar;
?>
Приведение строковых литералов и переменных к бинарным строкам:
<?php
$binary = (binary) $string;
$binary = b"binary string";
?>
Замечание:
Вместо использования приведения переменной к string, можно также заключить ее в двойные кавычки.
<?php
$foo = 10; // $foo - это целое число
$str = "$foo"; // $str - это строка
$fst = (string) $foo; // $fst - это тоже строка// Это напечатает "они одинаковы"
if ($fst === $str) {
echo "они одинаковы";
}
?>
Может быть не совсем ясно, что именно происходит при приведении между типами. Для дополнительной информации смотрите разделы:
www.php.net
PHP проверка на тип данных
В этой статье вы узнаете как и зачем проверяют на тип данных (как правило в переменной) в PHP.
Как проверить тип переменной в PHP
В ваших скриптах может возникнуть необходимость на дополнительную проверку и иногда, это проверка на какой-то определенный тип. Чаще всего, смотрим, есть ли хоть какого-то значение в переменной:
<? if (!empty($var)): // code here endif;
В этом языке программирования типизацию называют динамической (также, можно встретить термин «слабая типизация«). Это означает, что строка может стать числом, если мы применим оператор сложения.
За это, кстати говоря, у PHP так много ненавистников 🙂 .
Вернемся к нашей теме. Чтобы проверить на типы данных существуют следующие проверки:
if (is_array($arr)) { // переменная является массивом } /* is_bool() - Проверяем, является ли переменная булевой is_int() - Проверяем, является ли переменная целым числом is_numeric() - Проверяем, является ли переменная числом или строкой, содержащей число is_float() - Проверим, является ли переменная числом с плавающей точкой is_string() - Проверим, является ли переменная строкой is_object() - Проверим, является ли переменная объектом */
Можем проверить на массив, на тип булево (true или false), число с плавающей точкой, обычное число, строку и объект.
Эти проверки помогут вам в ваших скриптах. Например, стоит задача: если приходит целое число, то мы ничего не делаем, а если с плавающей точкой то округляем в какую-то сторону на «столько-то» знаков.
Также, бывают случаи, когда в переменную может записываться как число, так и массив, и нам нужно предусмотреть все эти варианты.
Есть также проверка и для NULL:
is_null()
Вот такие вот простые и полезные вещи могут улучшить наш код 🙂
forwww.com
Знакомство с PHP переменными | PHP
При работе со значениями данных в PHP нам нужен удобный способ хранения, чтобы мы могли легко получить доступ к ним и при необходимости ссылаться на них.
PHP глобальные переменные можно рассматривать как место в памяти компьютера, где должны храниться данные. При объявлении переменной ей присваивается имя, которое может использоваться, чтобы ссылаться на нее в других местах программного кода. К значению переменной можно получить доступ, также оно может быть изменено, а тип переменной можно поменять, ссылаясь на ее имя.
Все имена переменных PHP должны быть снабжены префиксом $. Он информирует препроцессор языка, что он имеет дело с переменной. Первый символ имени должен быть буквой или символом подчеркивания (_). Остальные символы могут быть только буквами, цифрами или символами подчеркивания. Все остальные символы считаются недействительными для использования в имени переменной.
Посмотрим на некоторые допустимые и недопустимые имена переменных PHP:
$_myName // допустимо. $myName // допустимо. $__myvar // допустимо. $myVar21 // допустимо. $_1Big // недопустимо, подчеркивание должно следовать после буквы. $1Big // недопустимо - должно начинаться с буквы или символа подчеркивания. $_er-t // недопустимо - содержит буквенно-цифровой символ (-).
Имена PHP переменных чувствительны к регистру. Это означает, что PHP считает переменную $ _myVariable отличной от переменной » $ _myvariable.
Переменные инициализируются значениями с помощью оператора присваивания PHP (=). Чтобы присвоить значение переменной, ее имя помещается слева от выражения, за которым следует оператор присваивания. Значение, которое присваивается после PHP объявления переменных, помещается справа от оператора присваивания. Строка, как и во всех выражениях PHP кода, завершается точкой с запятой (;).
Начнем с присвоения слова «Круг» переменной с именем myShape:
Мы объявили переменную с именем myShape и присвоили ей строковое значение «Круг«. Аналогичным образом можно объявить переменную, содержащую численное значение:
Мы создаем переменную numberOfShapes и присваиваем ей числовое значение 6. После того, как PHP переменная была создана, присвоенное ей значение может быть изменено с помощью оператора присваивания:
<?php $numberOfShapes = 6; // Присвоено начальное значение $myShape = "Круг"; $numberOfShapes = 7; // Изменение изначального значения на новое $myShape = "Квадрат"; ?>
Теперь мы должны рассмотреть, как получить доступ к текущему значению, присвоенному переменной. Например, если мы хотим вывести на экран значение, которое мы присваивали переменной numberOfShapes, нужно сослаться на него в команде echo:
<?php echo "Номер фигуры $numberOfShapes."; ?>
Это приведет к следующему выводу в браузере:
Номер фигуры 6.
Точно так же можно отобразить значение переменной myShape:
<?php echo "$myShape – значение текущей фигуры."; ?>
Примеры, использованные для демонстрации доступа к значениям переменных, простые, потому что у нас всегда был пробел после имени переменной. Возникает вопрос, Что делать, если нужно поставить другие символы сразу после имени PHP переменной. Например:
<?php echo "Круг 6 $numberOfShapesth фигура"; ?>
То, что нам нужно в этом случае выводится следующим образом:
Круг это 6-я фигура.
К сожалению, PHP будет видеть th на конце имени переменной $ numberOfShapes как часть имени. Затем он попытается вывести значение переменной $ numberOfShapesth, которой не существует. Это приводит к тому, что значение этой переменной не отображается:
Круг это фигура.
Можно обойти эту проблему, поставив фигурные скобки ({ }) вокруг имени переменной, чтобы экранировать ее от других символов:
<?php echo "Круг это ${numberOfShapes}th фигура"; ?>
Что дает нам желаемый результат:
Круг это 6-я фигура.
PHP типы переменных: целое, вещественное, логическое, массив, объект и строка. Для начала рассмотрим изменение типа переменной после ее создания.
PHP является слабо типизированным языком. Правила строго типизированного языка диктуют, что как только переменная была объявлена как определенный тип, ее тип не может быть изменен позже. В Java, например, нельзя присвоить число с плавающей точкой переменной, которая первоначально была объявлена как строка.
Слабо типизированные языки, такие как PHP и JavaScript, позволяют изменять тип переменной в любой момент существования переменной путем присвоения ей значения другого типа. Например, можно создать переменную, присвоить ей целое значение, а позже поменять на string:
<?php $myNumber = 6; // переменная целого типа $myNumber = "шесть"; // тип переменной изменился на строковый ?>
Процесс динамического изменения типа переменной называется автоматическим преобразованием типов.
В PHP проверка существования переменной является часто используемой операцией. В этом языке предусмотрен механизм для обеспечения этой возможности путем использования функции isset(). Чтобы проверить, имеет ли переменная значение, вызывают функцию isset(), которой в качестве аргумента передается имя переменной:
<?php $myVariable = "Привет"; if (isset($myVariable)) { echo "Переменная инициализирована."; } else { echo " Переменная не инициализирована."; } ?>
Данная публикация представляет собой перевод статьи «An Introduction to PHP Variables» , подготовленной дружной командой проекта Интернет-технологии.ру
www.internet-technologies.ru
Как устроены переменные в PHP / Habr
Вроде простой вопрос, даже не понятно что на него ответить, правда?Мы все знаем как создать переменную, как получить значение переменной, как взять ссылку на переменную в конце концов.
Но как они работают изнутри?
Что происходит в интерпретаторе, когда вы изменяете значение переменной? Или когда удаляете ее?
Как реализованы типы переменных?
В этой статье я постараюсь раскрыть именно эти темы.
Abstract
Переменные в PHP выражены в виде неких контейнеров, которые хранят в себе тип переменной, значение, кол-во ссылающихся переменных на этот контейнер, и флаг — является ли эта переменная ссылочной.
Отступление про структуры и указатели
Если вы никогда не писали на Си, то возможно не знаете про такие вещи, как структуры и указатели, которые очень широко тут используются и без которых пожалуй было бы очень сложно представить себе хоть сколько нибудь сложную программу на Си.
Структуры очень похожи на классы, только они не могут иметь методов, только данные, указатели на данные и указатели на функции. Объявляя структуру в Си, вы определяете тип данных, и теперь при определении переменной, вы можете написать имя этой структуры на месте типа той переменной, примерно так:
my_super_struct super_struct_instance;
Указатели — это как переменные-ссылки, только их значение — это адрес в памяти. На самом деле, это ссылки как указатели, только они ведут себя как разыменованные указатели. Лучше показать на коде:
// создали указатель foo, который будет указывать на переменную типа int
int *foo;
// создали переменную типа int
int bar = 3;
// взяли ссылку на переменную bar и присвоили ее указателю.
// теперь foo хранит адрес ячейки памяти, в которой хранится bar
foo = &bar;
// с помощью астериска мы разыменовываем указатель (берем значение по его адресу)
// и инкрементируем значение
(*foo)++;
// а так мы инкрементируем сам указатель, то есть после этой
// операции указатель будет смотреть на другое значение
foo++;
Контейнеры
Контейнером служит структура под названием zval, она выглядит так:
struct zval {
zvalue_value value;
zend_uchar type; // можно предположить, что это обычный char
zend_uchar is_ref;
zend_ushort refcount;
};
Как мы видим, здесь есть значение, тип, флаг и кол-во ссылающихся переменных.
Здесь есть такие типы, как:
- LONG
- BOOL
- DOUBLE
- STRING
- ARRAY
- OBJECT
- RESOURCE
- NULL
zvalue_value — это union. Union — это такой тип, в котором можно объявить несколько членов разных типов, но использоваться в итоге будет только один, вот как он дефайнится:
typedef union _zvalue_value {
long lval; // integer
double dval; // float
struct {
char *val;
int len;
} str; // string
HashTable *ht; // array
zend_object obj; // object
} zvalue_value;
В итоге, когда вы будете создавать переменную этого типа, она займет в памяти ровно столько, сколько занимает самый тяжелый элемент юниона.
Зачем столько лишнего?
Теперь разберем — зачем тут, например, какой-то refcount?
А очень просто: когда вы присваиваете переменной значение другой переменной, то они обе ссылаются на один zval, а refcount инкрементируется.
(оригинал с собачкой тут)
Теперь, если вы захотите изменить значение одной из этих переменных, то PHP, увидя refcount больше 1, скопирует этот zval, сделает изменения там, и ваша переменная будет указывать уже на новый zval.
Если это немного формализовать, то это будет выглядеть примерно так:
PHP | Под капотом |
---|---|
|
|
|
|
Эта техника называется copy on write и она позволяет неплохо снизить потребление памяти.
Также, refcount нужен сборщику мусора, который удаляет из памяти все zval-ы, у которых refcount = 0.
А что делать с ссылками и зачем вообще этот is_ref?
А что происходит со ссылками? Все очень просто: если вы создаете ссылку от переменной, то флаг is_ref становится равным 1, и больше вышеописанная оптимизация для этого zval-а применяться не будет. Поясню кодом:
PHP | Под капотом |
---|---|
|
|
|
|
|
|
Конечно, если вы возьмете еще одну ссылку от foo, то refcount zval-а, на который ссылается foo, увеличится на один.
Пожалуй на этом (пока?) все, в следующей части поговорим о массивах.
PS не знаю кто как воспримет эти картинки, мне показалось это будет забавно 🙂 к сожалению сканера у меня нет
habr.com
PHP: Функции для работы с переменными
Change language: EnglishBrazilian PortugueseChinese (Simplified)FrenchGermanJapaneseRomanianRussianSpanishTurkishOther
Содержание
- boolval — Возвращает логическое значение переменной
- debug_zval_dump — Выводит строковое представление внутреннего значения zend
- doubleval — Псевдоним floatval
- empty — Проверяет, пуста ли переменная
- floatval — Возвращает значение переменной в виде числа с плавающей точкой
- get_defined_vars — Возвращает массив всех определенных переменных
- get_resource_type — Возвращает тип ресурса
- gettype — Возвращает тип переменной
- import_request_variables — Импортирует переменные GET/POST/Cookie в глобальную область видимости
- intval — Возвращает целое значение переменной
- is_array — Определяет, является ли переменная массивом
- is_bool — Проверяет, является ли переменная булевой
- is_callable — Проверяет, может ли значение переменной быть вызвано в качестве функции
- is_countable — Проверить, что содержимое переменной является счетным значением
- is_double — Псевдоним is_float
- is_float — Проверяет, является ли переменная числом с плавающей точкой
- is_int — Проверяет, является ли переменная целым числом
- is_integer — Псевдоним is_int
- is_iterable — Проверяет, является ли переменная итерируемой
- is_long — Псевдоним is_int
- is_null — Проверяет, является ли значение переменной равным NULL
- is_numeric — Проверяет, является ли переменная числом или строкой, содержащей число
- is_object — Проверяет, является ли переменная объектом
- is_real — Псевдоним is_float
- is_resource — Проверяет, является ли переменная ресурсом
- is_scalar — Проверяет, является ли переменная скалярным значением
- is_string — Проверяет, является ли переменная строкой
- isset — Определяет, была ли установлена переменная значением, отличным от NULL
- print_r — Выводит удобочитаемую информацию о переменной
- serialize — Генерирует пригодное для хранения представление переменной
- settype — Задает тип переменной
- strval — Возвращает строковое значение переменной
- unserialize — Создает PHP-значение из хранимого представления
- unset — Удаляет переменную
- var_dump — Выводит информацию о переменной
- var_export — Выводит или возвращает интерпретируемое строковое представление переменной
2 months ago
I thought the PHP developers should include in this section, the operator "identity" ( see http://php.net/manual/en/language.operators.arithmetic.php).From an arithmetic point of view, this operator is useless but, as a converter from string to number, it is great. It does not force the numerical string to have an integer or float type, instead, it automatically determines the adequate type, depending on the numerical quantity represented by the string.
www.php.net
Манипуляции с типами | Руководство по PHP
PHP не требует (и не поддерживает) явного типа при определении переменной; тип переменной определяется по контексту, в котором она используется. То есть, если вы присвоите значение типа string переменной $var, то $var станет строкой. Если вы затем присвоите $var целочисленное значение, она станет целым числом.
Примером автоматического преобразования типа является оператор сложения ‘+’. Если какой-либо из операндов является float, то все операнды интерпретируются как float, и результатом также будет float. В противном случае операнды будут интерпретироваться как целые числа и результат также будет целочисленным. Обратите внимание, что это НЕ меняет типы самих операндов; меняется только то, как они вычисляются и сам тип выражения.
<?php
$foo = "0"; // $foo это строка (ASCII 48)
$foo += 2; // $foo теперь целое число (2)
$foo = $foo + 1.3; // $foo теперь число с плавающей точкой (3.3)
$foo = 5 + "10 Little Piggies"; // $foo это целое число (15)
$foo = 5 + "10 Small Pigs"; // $foo это целое число (15)
?>
Если последние два примера вам непонятны, смотрите Преобразование строк в числа.
Если вы хотите, чтобы переменная принудительно вычислялась как определенный тип, смотрите раздел приведение типов. Если вы хотите изменить тип переменной, смотрите settype().
Если вы хотите протестировать любой из примеров, приведенных в данном разделе, вы можете использовать функцию var_dump().
Замечание:
Поведение автоматического преобразования в массив в настоящий момент не определено.
К тому же, так как PHP поддерживает индексирование в строках аналогично смещениям элементов массивов, следующий пример будет верен для всех версий PHP:
<?php
$a = 'car'; // $a - это строка
$a[0] = 'b'; // $a все еще строка
echo $a; // bar
?>Более подробно смотрите в разделе Доступ к символу в строке.
Приведение типов
Приведение типов в PHP работает так же, как и в C: имя требуемого типа записывается в круглых скобках перед приводимой переменной.
<?php
$foo = 10; // $foo это целое число
$bar = (boolean) $foo; // $bar это булев тип
?>
Допускаются следующие приведения типов:
- (int), (integer) — приведение к integer
- (bool), (boolean) — приведение к boolean
- (float), (double), (real) — приведение к float
- (string) — приведение к string
- (array) — приведение к array
- (object) — приведение к object
- (unset) — приведение к NULL (PHP 5)
Приведение типа (binary) и поддержка префикса b были добавлены в PHP 5.2.1
Обратите внимание, что внутри скобок допускаются пробелы и символы табуляции, поэтому следующие примеры равносильны по своему действию:
<?php
$foo = (int) $bar;
$foo = ( int ) $bar;
?>
Приведение строковых литералов и переменных к бинарным строкам:
<?php
$binary = (binary) $string;
$binary = b"binary string";
?>
Замечание:
Вместо использования приведения переменной к string, можно также заключить ее в двойные кавычки.
<?php
$foo = 10; // $foo - это целое число
$str = "$foo"; // $str - это строка
$fst = (string) $foo; // $fst - это тоже строка// Это напечатает "они одинаковы"
if ($fst === $str) {
echo "они одинаковы";
}
?>
Может быть не совсем ясно, что именно происходит при приведении между типами. Для дополнительной информации смотрите разделы:
Вернуться к: Типы
php.ru
PHP: Обработка переменных — Manual
Change language: EnglishBrazilian PortugueseChinese (Simplified)FrenchGermanJapaneseRomanianRussianSpanishTurkishOther
- Введение
- Установка и настройка
- Предопределенные константы
- Функции для работы с переменными
- boolval — Возвращает логическое значение переменной
- debug_zval_dump — Выводит строковое представление внутреннего значения zend
- doubleval — Псевдоним floatval
- empty — Проверяет, пуста ли переменная
- floatval — Возвращает значение переменной в виде числа с плавающей точкой
- get_defined_vars — Возвращает массив всех определенных переменных
- get_resource_type — Возвращает тип ресурса
- gettype — Возвращает тип переменной
- import_request_variables — Импортирует переменные GET/POST/Cookie в глобальную область видимости
- intval — Возвращает целое значение переменной
- is_array — Определяет, является ли переменная массивом
- is_bool — Проверяет, является ли переменная булевой
- is_callable — Проверяет, может ли значение переменной быть вызвано в качестве функции
- is_countable — Проверить, что содержимое переменной является счетным значением
- is_double — Псевдоним is_float
- is_float — Проверяет, является ли переменная числом с плавающей точкой
- is_int — Проверяет, является ли переменная целым числом
- is_integer — Псевдоним is_int
- is_iterable — Проверяет, является ли переменная итерируемой
- is_long — Псевдоним is_int
- is_null — Проверяет, является ли значение переменной равным NULL
- is_numeric — Проверяет, является ли переменная числом или строкой, содержащей число
- is_object — Проверяет, является ли переменная объектом
- is_real — Псевдоним is_float
- is_resource — Проверяет, является ли переменная ресурсом
- is_scalar — Проверяет, является ли переменная скалярным значением
- is_string — Проверяет, является ли переменная строкой
- isset — Определяет, была ли установлена переменная значением, отличным от NULL
- print_r — Выводит удобочитаемую информацию о переменной
- serialize — Генерирует пригодное для хранения представление переменной
- settype — Задает тип переменной
- strval — Возвращает строковое значение переменной
- unserialize — Создает PHP-значение из хранимого представления
- unset — Удаляет переменную
- var_dump — Выводит информацию о переменной
- var_export — Выводит или возвращает интерпретируемое строковое представление переменной
There are no user contributed notes for this page.
www.php.net