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

StackOverflow https://stackoverflow.com/questions/4039542

Вопрос

Я не сделал много программирования на многих языках, но я знаю в 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;

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

Это было полезно?

Решение

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

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

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

Представьте, что фрагмент 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 на самом деле не скомпилируется - он интерпретируется (в операционные коды).

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

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

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

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

Введение в переменные

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

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

PHP записывается в C и использует Typedef structe-файл C, который он называет Zval наряду с CONOSE 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?

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

Как он знает, что будет тип переменного? Это даже заботятся?

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

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

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

Если вы хотите увидеть, как выглядят ZVALS в действии, они могут быть сброшены с:

debug_zval_dump($variableName);

«Как компилируется PHP? Как он знает, что будет иметь тип переменного типа?

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

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

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

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

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

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

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

РЕДАКТИРОВАТЬ:

«Или я сравниваю яблоки к апельсинам?»

Да Вы. Здесь Вы можете узнать больше о языке.

Редактировать2:

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

Эти ссылки могут быть полезны для вас:

http://www.gidforums.com/t--1866.html.

http://www.webmaster-talk.com/coding-forum/186350-fundamental-differences-betwending-php-cc.html.

Переменная разница сферы применения между PHP и C: Область блока не совсем одинаково?

Обратите внимание, что PHP выполняется на сервере, если вы хотите создать события клиента, JavaScript - это мое предложение.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top