PHP如何知道它使用了什么类型的变量?
我没有用很多语言编写过很多程序,但我知道在C(++)中,必须声明变量类型(PHP如何知道它使用了什么类型的变量?,php,variables,types,vm-implementation,Php,Variables,Types,Vm Implementation,我没有用很多语言编写过很多程序,但我知道在C(++)中,必须声明变量类型(int,char,等等) 当然,在PHP中,您不必这样做。您可以从$str=“something”开始然后稍后$str=array(“某物”=>“气味”)因为您有C经验,考虑PHP变量如下: typedef struct { int varType; void* data; } variable_t; 当您创建一个新变量时,它将创建一个变量\u t,给它一个类型标记(比如1代表int,2代表string),并将其存储
int
,char
,等等)
当然,在PHP中,您不必这样做。您可以从$str=“something”开始代码>然后稍后$str=array(“某物”=>“气味”)她很开心
PHP是如何编译的?它如何知道变量类型是什么?它在乎吗
这个问题与我正在做的任何事情都无关。我只是好奇
编辑。
我需要澄清一下这个问题
在C中,如果我说:
int y;
它为y
保留x个字节。如果y
溢出,则为坏消息
PHP没有这种性质(至少我认为它没有)
语言也是一样的。它怎么知道要保留多少?还是我在拿苹果和桔子做比较?如果我说的不对,你有什么好的主题可以让我更好地理解吗?PHP并不是真正编译的——它是被解释的(转换成操作代码)
如果您试图对某个数据类型执行一些无法执行的操作,那么它会给您一个错误。没有类型检查。它不编译。它是一个类似Javascript的函数。PHP现在支持类型暗示,您可以在函数定义中包含诸如“字符串”或“数组”之类的内容,这些内容在解析脚本时被捕获,以指示存在类型不匹配。“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不关心变量的类型,因为它是一种编程语言,没有感觉
编辑:
“还是我在拿苹果和桔子做比较?”
是的,你是。你可以学习更多关于这门语言的知识
编辑2:
PHP是一种带解释器的脚本语言,没有编译器。这意味着在PHP中只能得到运行时错误。如果我们考虑类型,它是一种自由语言,因为你有权对你的变量做任何事情,并且它们的类型会根据它们的用法来修改。
这些链接可能对您有用:
注意,PHP是在服务器上执行的,如果您想创建客户端事件,JavaScript是我的建议。
< P>因为您有C经验,考虑PHP变量如下:
typedef struct {
int varType;
void* data;
} variable_t;
当您创建一个新变量时,它将创建一个变量\u t
,给它一个类型标记(比如1代表int,2代表string),并将其存储在某个列表中(按范围,按名称引用)。实际内容将存储在*数据中。再次访问变量时,可以通过int varType
确定类型,并对void*data
采取适当的操作,例如将其用作int或字符串
假设PHP代码段:
$data = 12;
$data2 = $data + 1;
$data = "Hello";
生成如下指令(伪Cish):
这种类型的增强数据在字节编码、编译或直接解释语言中工作
关于不同的虚拟机实现(本地分配、堆分配、注册VM等),还有更多的细节。如果您真的想了解虚拟机是如何工作的,最好的参考是Lua。非常干净的语言,非常干净的字节码,非常干净的虚拟机。PHP可能是您应该查看的最后一个实现。我意识到这是一个老问题,但这里有一些关于PHP如何处理OP提出的问题的更具体的信息
这是您希望从PHP参考中开始的页面:
我知道链接不是首选,但链接应该是稳定的,我不想大量复制PHP参考文档。以下是亮点
OP:PHP如何知道它使用了什么类型的变量
PHP是用C编写的,它使用一个C结构类型定义(它调用zval)和一个C联合类型定义(它调用zval_值)来表示所有变量
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是一种动态的、松散类型的语言,使用写时复制和引用计数。”引用计数和写时复制(COW)是PHP使用的两个强大概念,我在这里不赘述,但值得一读
弱类型隐含了引擎在执行时将变量转换或强制转换为所需类型的偏好。引用计数是引擎可以推断变量在用户代码中不再有任何引用的方法,从而能够释放与变量关联的结构
“zval_值是一个并集,可以表示变量可能持有的所有类型。”
“..变量可以是一种类型,变量数据由zval_值联合中的相应字段表示。zval本身保存类型、引用计数和标志,以指示变量是否为引用。”
PHP是如何编译的
“Compile”是一个宽泛的词,可以有不同的含义,而PHP不是传统意义上的编译。它会进行某种预编译,将源代码转换为操作码,这些操作码是处理器可以执行的指令。这些操作码在
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
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;
debug_zval_dump($variableName);