我知道这是一个旧问题,但以下是有关PHP如何处理OP提出的问题的更具体信息。
这是您要开始阅读的PHP参考页面:
变量介绍
我知道链接不是首选,但该链接应该是稳定的,我不想完全复制PHP参考文档。以下是亮点。
OP:PHP如何知道它使用的变量类型(或是否使用)?
PHP是用C编写的,并使用称为
zval 的C结构typedef以及称为
zval_value 的C union typedef来表示所有变量。
typedef struct _zval_struct {
zvalue_value value;
zend_uint refcount__gc;
zend_uchar type;
zend_uchar is_ref__gc;
} zval;
"The engine provides a set of macros that are uniform and intuitive for accessing the various fields of a structure, in order to simplify the concept of a variable that can be of any type. PHP is a dynamic language that is loosely typed and uses reference counting and copy-on-write (COW). The engine's preference for converting or coercing variables into the required type at execution time is implicit in weak typing. Reference counting allows the engine to determine when a variable no longer has any references in the user's code, so it can free the structures associated with the variable. The zval_value is a union that can represent all the types a variable may hold. If a variable is of a single type, the appropriate field in the zval_value union represents the variable data. The zval itself holds the type, reference count, and a flag indicating whether a variable is a reference. "
"编译"是一个广义的词,可以有不同的含义,而PHP并不是以传统意义上的编译方式运行。它做了一种预编译,将源代码转换为可由处理器执行的指令(opcode)。这些opcode被缓存,防止PHP频繁解析调用的脚本。
它如何知道变量类型会是什么?它关心吗?
正如上面引用的那样,这是PHP引擎在执行时“优先将变量转换或强制转换为所需类型”的结果。基本上,PHP总是在创建变量时存储其确定的类型,但当引用变量时,PHP根据使用上下文再次确定其类型。
"PHP是弱类型的,因此引擎提供API函数来将变量从一种类型转换为另一种类型。"
引擎有一组宏用于处理zval以转换变量的类型,因此通常你不必处理这个问题。
如果您想看到zval的实际效果,可以使用以下命令进行转储:
debug_zval_dump($variableName);
x = f 1000
,它会推断出x
的类型,根据f
的类型等信息计算出它的数据类型。在编译时,它看起来更像C语言;在声明时,它看起来更像PHP语言。当然,PHP的工作方式就像theatrus所说的那样。 - Antal Spector-Zabusky