Pergunta

Não tenho feito muita programação em muitas linguagens, mas sei que em C(++), você tem que declarar um tipo de variável (int,char, etc).

Em PHP você, claro, não precisa fazer isso.Você pode começar com $str = "something"; então mais tarde $str = array("something" => "smells"); e ela está feliz.

Como o PHP compila?Como ele sabe qual será o tipo de variável?Será que isso se importa?

Esta questão não tem relevância para nada que estou fazendo.Eu só estou curioso.

EDITAR.

Preciso esclarecer um pouco essa questão.

Em C, se eu disser:

int y;

Ele reserva x quantidade de bytes para y.Se y transborda, más notícias.

PHP não tem essa natureza (pelo menos acho que não).

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

É tudo a mesma coisa para o idioma.Como ele sabe quanto reservar?Ou estou comparando maçãs com laranjas?Se estou fazendo isso errado, você tem algum bom tópico que eu possa ler para entender melhor?

Foi útil?

Solução

Since you have C experience, consider a PHP variable to be like the following:

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

when you create a new variable, it will create a variable_t, give it a type tag (lets say 1 for int, 2 for string), and store it in a list somewhere (by scope, reference by name). The actual contents will be stored in *data. When the variable is again accessed, the type can be determined from int varType, and the appropiate action taken on void* data, such as using it as an int or string.

Imagine that the PHP snippet:

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

produces instructions like the following (pseudo-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

This type of augmented data works in bytecoded, compiled, or direct interpreted languages.

There are more details in regards to different virtual machine implementations (local allocation, heap allocation, register VMs, etc). If you actually want to understand how virtual machines work, the best reference is Lua. Very clean language, very clean bytecode, and very clean virtual machine. PHP is probably the last implementation you should look at.

Outras dicas

O PHP realmente não compila-é interpretado (em códigos operacionais).

Praticamente se você tentar fazer algo em um determinado tipo de dados que não pode ser feito, isso lhe dará um erro. Não há verificação de tipo.

Não compila. É um linguagem interpretada, como JavaScript.

Sei que esta é uma pergunta antiga, mas aqui estão algumas informações mais específicas sobre como o PHP lida com as perguntas feitas pelo OP.

Esta é a página da referência PHP com a qual você deseja começar:

Introdução às variáveis

Eu sei que o link não é preferido, mas esse link deve ser estável e não quero copiar a documentação de referência do PHP no atacado.Aqui estão os destaques.

OP:Como o PHP sabe que tipo de variáveis ​​ele usa (ou usa)?

PHP é escrito em C e usa uma estrutura C typedef que ele chama de zval junto com um typedef união C que é chamado de valor_zval para representar todas as variáveis.

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;

"O mecanismo tenta encobrir a complexidade do conceito de uma variável que pode ser de qualquer tipo, fornecendo um conjunto uniforme e intuitivo de macros para acessar os vários campos das estruturas."

"O PHP é um idioma dinâmico e digitado, que usa a contagem de cópias e referência". Contagem de referência e cópia-on-write (vaca) são dois conceitos poderosos usos de php que eu não vou entrar aqui, mas vale a pena ler.

"A digitação fraca está implícita na preferência do mecanismo para converter ou coagir variáveis ​​para o tipo necessário em tempo de execução.A contagem de referências é o meio pelo qual o mecanismo pode deduzir quando uma variável não possui mais referências no código do usuário e, assim, é capaz de liberar as estruturas associadas à variável."

"O zval_value é uma união que pode representar todos os tipos que uma variável pode conter."

" ... uma variável pode ser de um tipo, os dados da variável são representados pelo campo apropriado na união zval_value.O próprio zval contém o tipo, a contagem de referências e um sinalizador para indicar se uma variável é uma referência."

Como o PHP compila?

"Compile" é uma palavra ampla que pode ter significados diferentes e o PHP não compila no sentido tradicional.Ele faz uma espécie de pré-compilação que converte o código-fonte em opcodes, que são instruções que podem ser executadas pelo processador.Esses opcodes são armazenados em cache, o que evita que o PHP tenha que analisar scripts chamados com frequência.

Como ele sabe qual será o tipo de variável?Será que isso se importa?

Como já citado acima é o motor PHP "preferência para converter ou coagir variáveis ​​para o tipo requerido em tempo de execução." Baiscally PHP sempre armazena o que determina o tipo de uma variável quando ela é criada, mas quando uma variável é referenciada, o PHP faz outra determinação de qual é o tipo com base no contexto em que está sendo usado.

"O PHP é de tipo fraco, portanto, o mecanismo fornece funções de API para converter variáveis ​​de um tipo para outro."

O mecanismo possui um conjunto de macros que usa para trabalhar com zvals para converter o tipo de uma variável, para que você normalmente não precise lidar com isso.

Se você quiser ver como são os zvals em ação, eles podem ser descartados com:

debug_zval_dump($variableName);

"Como o PHP compila?Como ele sabe qual será o tipo de variável?Será que isso se importa?

Esta questão não tem relevância para nada que estou fazendo.Eu só estou curioso."

PHP é uma linguagem interpretada e não compila.

O PHP não sabe que tipo a variável será, porque o tipo da variável é determinado pelo tipo do valor que foi atribuído da última vez a essa variável.

Você consegue fazer isso:

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

Como você pode ver, sempre que um valor é atribuído a foo, o tipo pode ser alterado.

O PHP não se importa com o tipo da sua variável, porque é uma linguagem de programação e não tem sentimentos.

EDITAR:

"Ou estou comparando maçãs com laranjas?"

Sim você é. Aqui você pode aprender mais sobre o idioma.

EDITAR2:

PHP é uma linguagem de script com interpretador e sem compilador.Isso significa que em PHP você só pode obter erros de tempo de execução.É uma linguagem liberal se considerarmos os tipos, porque você tem o direito de fazer qualquer coisa com suas variáveis ​​e seus tipos serão modificados de acordo com o uso delas.

Esses links podem ser úteis para você:

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

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

Diferença de escopo variável entre PHP e C:o escopo do bloco não é exatamente o mesmo?

Observe que o PHP é executado no servidor, caso queira criar eventos de cliente, Javascript é minha sugestão.

PHP agora suporta dicas de tipo, você pode incluir coisas como 'string' ou 'array' nas definições de função que são capturadas conforme os scripts são analisados ​​para indicar que há uma incompatibilidade de tipo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top