Как PHP знает, какой тип переменных он использует (или делает это)? - PullRequest
9 голосов
/ 28 октября 2010

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

7 голосов
/ 28 октября 2010

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

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

когда вы создаете новую переменную, она создаст variable_t, присвоит ей тег типа (скажем, 1 для int, 2 для строки) и сохранит ее где-нибудь в списке (по объему, по ссылке по имени) , Фактическое содержимое будет сохранено в *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

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

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

1 голос
/ 08 апреля 2016

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

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

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

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

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

PHP написан на C и использует Cstruct typedef, которую он вызывает zval вместе с typedef для C union, который вызывает 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 является динамическим, слаботипизированный язык, использующий копирование при записи и подсчет ссылок. "Подсчет ссылок и Copy-on-write (COW) - это две мощные концепции, которые использует PHP, но я не буду вдаваться в них, но о них стоит прочитать.

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

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

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

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

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

Откуда он знает, каким будет тип переменной?Это вообще волнует?

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

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

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

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

debug_zval_dump($variableName);
1 голос
/ 28 октября 2010

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

1 голос
/ 28 октября 2010

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

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

0 голосов
/ 28 октября 2010

"Как 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 не заботится о типе вашей переменной, потому что это язык программирования и у него нет чувств.

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

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

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

EDIT2:

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

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

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

http://www.webmaster -talk.com / coding-forum / 186350-фонда-различия-между-php-cc.html

Разница в области видимости между PHP и C: область видимости блока не одинакова?

Обратите внимание, что PHP выполняется на сервере, если вы хотите создавать клиентские события, я предлагаю Javascript.

0 голосов
/ 28 октября 2010

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

...