我意识到这是一个老问题,但这里有一些关于 PHP 如何处理 OP 提出的问题的更具体信息。
这是您想要开始的 PHP 参考页面:
变量简介
我知道链接不是首选,但该链接应该是稳定的,我不想批发复制 PHP 参考文档。以下是重点。
OP:PHP 是如何知道它使用什么类型的变量(或者确实知道)?
PHP 是用 C 语言编写的,使用 C struct typedef 调用zval以及 C union typedef 调用zval_value来表示所有变量。
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_value 是一个联合,它可以表示一个变量可能包含的所有类型。 "
“ ...变量可以是一种类型,变量数据由 zval_value 联合中的适当字段表示。zval 本身包含类型、引用计数和一个标志,以指示变量是否为引用。 ”
PHP是如何编译的?
“编译”是一个宽泛的词,可以有不同的含义,而 PHP 不是传统意义上的编译。它确实进行了一种预编译,将源代码转换为操作码,这些操作码是可以由处理器执行的指令。这些操作码被缓存,以防止 PHP 必须解析频繁调用的脚本。
它如何知道变量类型将是什么?它甚至在乎吗?
正如上面已经引用的那样,它是 PHP 引擎“在执行时将变量转换或强制转换为所需类型的偏好”。Baiscally PHP 确实总是存储它在创建变量时确定变量的类型,但是当引用变量时,PHP 会根据使用它的上下文再次确定类型是什么。
" PHP 是弱类型的,因此引擎提供了用于将变量从一种类型转换为另一种类型的 API 函数。 "
该引擎有一组宏,用于与 zval 一起转换变量的类型,因此您通常不必处理它。
如果你想看看 zvals 在行动中的样子,可以用以下方式倾倒它们:
debug_zval_dump($variableName);