Jas*_*son 9 php variables types vm-implementation
我没有做太多的编程在许多语言,但我知道在C(++),你必须声明一个变量类型(int
,char
,等).
在PHP中,您当然不必这样做.你可以$str = "something";
稍后再开始,$str = array("something" => "smells");
她很高兴.
PHP如何编译?它如何知道变量类型将是什么?它甚至关心吗?
这个问题与我正在做的任何事情无关.我只是好奇.
编辑.
我需要澄清一下这个问题.
在C中,如果我说:
int y;
Run Code Online (Sandbox Code Playgroud)
它保留x个字节数y
.如果y
溢出,坏消息.
PHP没有这种性质(至少我认为它没有).
$i = "a number";
$i = 8;
$i = 1000000000000000000;
Run Code Online (Sandbox Code Playgroud)
它与语言完全相同.它怎么知道保留多少?或者我将苹果与橘子比较?如果我说错了,你有什么好主题我能读懂以便更好地理解吗?
由于您具有C经验,请将PHP变量视为如下所示:
typedef struct {
int varType;
void* data;
} variable_t;
Run Code Online (Sandbox Code Playgroud)
当你创建一个新变量时,它会创建一个variable_t
,给它一个类型标签(假设1表示int,2表示字符串),并将其存储在某个列表中(按范围,按名称引用).实际内容将存储在*data
.当再次访问该变量时,可以从中确定类型int varType
,并采取适当的操作void* data
,例如将其用作int或字符串.
想象一下PHP片段:
$data = 12;
$data2 = $data + 1;
$data = "Hello";
Run Code Online (Sandbox Code Playgroud)
产生如下指令(伪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
Run Code Online (Sandbox Code Playgroud)
这种类型的增强数据以字节编码,编译或直接解释语言工作.
有关不同虚拟机实现(本地分配,堆分配,寄存器VM等)的更多详细信息.如果您真的想了解虚拟机的工作原理,最好的参考是Lua.非常干净的语言,非常干净的字节码,非常干净的虚拟机.PHP可能是您应该关注的最后一个实现.
归档时间: |
|
查看次数: |
706 次 |
最近记录: |