Это вопрос о внутренних функциях PHP и том, как он работает под капотом:
Как php решает, что:
$a = 3;
должно быть целочисленным (внутренним)?
и как это
$a = "3";
должна быть строка?
Я когда-то слышал, что PHP использует для включения каждой переменной (для разных типов) для определения необходимого внутреннего типа данных, но при попытке проверить это утверждение я не смог ничего найти в Интернете.
В официальном PHP-документе есть некоторые странные примеры, которые описывают некоторые странные поведения языка:
источник: http://php.net/manual/en/language.types.type-juggling.php
<?php
$foo = "0"; // $foo is string (ASCII 48)
$foo += 2; // $foo is now an integer (2)
$foo = $foo + 1.3; // $foo is now a float (3.3)
$foo = 5 + "10 Little Piggies"; // $foo is integer (15)
$foo = 5 + "10 Small Pigs"; // $foo is integer (15)
?>
но это не отвечает на мой вопрос.
Это просто показывает, как динамический PHP находится на очень неясном уровне.
Я не думаю, что это имеет какое-либо отношение к оценке (например, "": = false, но "abc": = true), не так ли?
Еще один вопрос: как php может извлечь "примитивное" целое число из строки типа "10 Small Pigs"? Может ли это быть сделано при типизации (внутренне), или это требует какой-то обработки строк с включенным преобразованием символов или что-то еще?
PHP будет автоматически переводить значения из одного типа в другой по мере необходимости. Если переменная содержит строку, но вы используете ее в арифметическом выражении, она преобразует ее в число. Если он содержит число, но вы используете его как аргумент функции, которая нуждается в строке, она преобразует ее в строку.
Когда вы выполняете сравнения, если типы двух значений различны, один из них будет преобразован в другой тип (если вы не используете "строгие" операторы сравнения, ===
и !==
). Таблицы сравнения типов объясняют, что будет преобразовано в зависимости от двух типов.
Когда вы выполняете начальные задания, например
$a = 3;
$b = "3";
$c = false;
он смотрит на синтаксис. Если значение находится в кавычках, то это строка. Если значение - это голый номер, это число. Таким образом, $a
содержит число, $b
содержит строку. $c
содержит логическое значение, потому что оно было присвоено из булевого литерала.
Если вы назначаете переменную с помощью вызова функции, это зависит от того, что возвращает функция (например, substr
возвращает строку); все стандартные функции PHP имеют возвращаемые типы, указанные в документации.
В большинстве случаев, что он делает во всех этих случаях, это то, что интуитивно кажется "правильным" из синтаксиса и вероятной семантики.
$a=3
. Хорошо, PHP автоматически конвертирует переменные, но откуда он знает тип, в который нужно конвертировать? Можно ли сделать это так просто, как кажется, когда вы говорите «если в нем есть строка ...»? Php определяет только по кавычкам, должна ли переменная быть строкой при инициализации? Это как-то меня смущает
Для вашего второго вопроса вы можете использовать intval.
С php.net, http://php.net/manual/en/function.intval.php
(PHP 4, PHP 5)
intval - получить целочисленное значение переменной
int intval (mixed $ var [, int $ base = 10])
Возвращает целочисленное значение var, используя указанную базу для преобразования (по умолчанию используется база 10). intval() не следует использовать для объектов, так как это приведет к ошибке уровня E_NOTICE и возвращает 1.