Как PHP знает, какой тип переменных он использует (или делает это)?

Я не много программировал на многих языках, но я знаю, что в C (++) вы должны объявить тип переменной (int,charи т. д.).

в PHP вам, конечно, не нужно этого делать. Вы можете начать с $str = "something"; потом $str = array("something" => "smells"); и она счастлива.

как компилируется PHP? Как он узнает, каким будет тип переменной? Он даже уход?

этот вопрос не имеет никакого отношения к тому, что я делаю. Мне просто любопытно.

правка.

мне нужно немного прояснить этот вопрос.

в C, если я говорю:

int y;

он резервирует x количество байтов для y. Если y переполняется, плохие новости.

PHP не имеет такого характера (по крайней мере, я так не думаю).

$i = "a number";
$i = 8;
$i = 1000000000000000000;

это все равно для языка. Откуда он знает, сколько резервировать? Или я сравниваю яблоки с апельсинами? Если я поступаю неправильно, ты есть ли хорошие темы, которые я могу прочитать, чтобы лучше понять?

6 ответов


поскольку у вас есть опыт C, рассмотрите переменную PHP следующим образом:

typedef struct {
 int varType;
 void* data;
} variable_t;

когда вы создаете новую переменную, она будет создавать variable_t, дайте ему тег типа (скажем, 1 для int, 2 для string) и сохраните его в списке где-нибудь (по области, ссылке по имени). Фактическое содержимое будет сохранено в *data. Когда переменная снова доступна, тип может быть определен из int varType, и соответствующее действие, принятое на void* data, например, используя его как int или строка.

представьте, что фрагмент PHP:

 $data = 12;
 $data2 = $data + 1;
 $data = "Hello";

производит следующие инструкции (псевдо-Cish):

Line 1:
variable_t* var = new_variable(TYPE_INT, data);
store_variable("data", var);

Line 2:
variable_t* var = get_variable("data2");
if (var->varType == TYPE_INT)
   int value = 1 + *(int*)var->data);
else
   error("Can't add non int");
var = new_variable(TYPE_INT, value);
store_variable("data2", var);

Line 3:
variable_t* var = get_variable("data");
if (var)
  destroy_variable(var);
// Do like line 1, but for TYPE_STRING

этот тип дополненных данных работает в байт-кодированных, скомпилированных или прямых интерпретируемых языках.

существует более подробная информация о различных реализациях виртуальных машин (локальное распределение, распределение кучи, Регистрация VMs и т. д.). Если вы действительно хотите понять, как работают виртуальные машины, лучшей ссылкой является Lua. Очень чистый язык, очень чистый байт-код и очень чистая виртуальная машина. PHP, вероятно, последняя реализация, на которую вы должны смотреть.


PHP на самом деле не компилируется-он интерпретируется (в op-коды).

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


Он не компилируется. Это интерпретируемый язык, как Javascript.


" как компилируется PHP? Как он узнает, каким будет тип переменной? Он даже уход?

этот вопрос не имеет никакого отношения к тому, что я делаю. Мне просто любопытно."

PHP является интерпретируемым языком и не компилируется.

PHP не знает, какого типа будет переменная, потому что тип переменной определяется типом значения, которое было присвоено в прошлый раз этой переменной.

вы можете сделать это:

$foo = 5;
var_dump($foo);
$foo = "5";
var_dump($foo);
$foo = array();
$foo[] = 0;
$foo[] = 1;
$foo[] = 2;
var_dump($foo);

Как вы можете видеть, всякий раз, когда значение присваивается переменной Foo, тип может быть изменен.

PHP не заботится о типе вашей переменной, потому что это язык программирования, и у него нет чувств.

изменить:


Я понимаю, что это старый вопрос, но вот более конкретная информация о том, как PHP обрабатывает вопросы, заданные OP.

Это страница из ссылки на PHP, с которой вы хотите начать:

переменные

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

OP: как работает PHP знать, какой тип переменных (или она)?

PHP написан на C и использует структуру c typedef, которую он называет звал вместе с C union typedef, который вызывает zval_value для представления всех переменных.

typedef struct _zval_struct {
    zvalue_value value;        /* variable value */
    zend_uint refcount__gc;    /* reference counter */
    zend_uchar type;           /* value type */
    zend_uchar is_ref__gc;     /* reference flag */
} zval;

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

"PHP-это динамический, слабо типизированный язык, который использует копирование при записи и подсчет ссылок."Подсчет ссылок и копирование на запись (COW)-это две мощные концепции, которые использует PHP, но я не буду здесь читать.

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

"zval_value-это объединение, которое может представлять все типы, которые может содержать переменная."

" ... переменная может быть одного типа, данные переменной представлены соответствующим полем в объединении zval_value. Сам zval содержит тип, счетчик ссылок и флаг, чтобы указать, является ли переменная ссылка."

как компилируется PHP?

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

как он знает, что переменный тип будет? Он даже уход?

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

"PHP слабо типизированный, как таковой движок предоставляет функции API для преобразования переменных из одного типа в другой."

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

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

debug_zval_dump($variableName);

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