PHP如何知道它使用什么类型的变量(或者它)?

时间:2010-10-28 03:35:47

标签: php variables types vm-implementation

我没有用很多语言编写很多程序,但我知道在C(++)中,你必须声明一个变量类型(intchar等。)

在PHP中,您当然不必这样做。您可以从$str = "something";开始,然后再$str = array("something" => "smells");开始,她很高兴。

PHP如何编译?它如何知道变量类型将是什么?它甚至关心吗?

这个问题与我正在做的任何事情无关。我只是好奇。

修改

我需要澄清一下这个问题。

在C中,如果我说:

int y;

它为y保留x个字节数。如果y溢出,那就是坏消息。

PHP没有这种性质(至少我不认为它。)

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

语言完全相同。它怎么知道保留多少?或者我将苹果与橘子比较?如果我说错了,你有什么好主题我可以阅读以便更好地理解吗?

5 个答案:

答案 0 :(得分:7)

由于您有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

此类增强数据以字节编码,编译或直接解释语言工作。

有关不同虚拟机实现(本地分配,堆分配,寄存器VM等)的更多详细信息。如果您真的想了解虚拟机的工作原理,最好的参考是Lua。非常干净的语言,非常干净的字节码,非常干净的虚拟机。 PHP可能是你应该看的最后一个实现。

答案 1 :(得分:1)

PHP没有真正编译 - 它被解释(转换为操作码)。

如果您尝试对某些无法完成的数据类型执行某些操作,那么它会给您一个错误。没有类型检查。

答案 2 :(得分:1)

它无法编译。它是interpreted language,就像Javascript一样。

答案 3 :(得分:0)

“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并不关心变量的类型,因为它是一种编程语言而且没有感觉。

编辑:

“或者我将苹果与橘子比较?”

是的,你是。 Here您可以了解有关该语言的更多信息。

EDIT2:

PHP是一种带有解释器且没有编译器的脚本语言。这意味着在PHP中,您只能获得运行时错误。如果我们考虑类型,它是一种自由语言,因为你有权对你的变量做任何事情,它们的类型将根据它们的用法进行修改。

这些链接可能对您有用:

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

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

Variable scope difference between PHP and C: block scope is not exactly the same?

注意,PHP是在服务器上执行的,如果你想创建客户端事件,Javascript就是我的建议。

答案 4 :(得分:-1)

PHP现在支持类型提示,您可以在函数定义中包含“字符串”或“数组”之类的内容,因为脚本被解析以指示类型不匹配。