我没有用很多语言编写很多程序,但我知道在C(++)中,你必须声明一个变量类型(int
,char
等。)
在PHP中,您当然不必这样做。您可以从$str = "something";
开始,然后再$str = array("something" => "smells");
开始,她很高兴。
PHP如何编译?它如何知道变量类型将是什么?它甚至关心吗?
这个问题与我正在做的任何事情无关。我只是好奇。
修改
我需要澄清一下这个问题。
在C中,如果我说:
int y;
它为y
保留x个字节数。如果y
溢出,那就是坏消息。
PHP没有这种性质(至少我不认为它。)
$i = "a number";
$i = 8;
$i = 1000000000000000000;
语言完全相同。它怎么知道保留多少?或者我将苹果与橘子比较?如果我说错了,你有什么好主题我可以阅读以便更好地理解吗?
答案 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现在支持类型提示,您可以在函数定义中包含“字符串”或“数组”之类的内容,因为脚本被解析以指示类型不匹配。