PHP是如何知道它使用什么类型的变量(或做它)?
-
27-09-2019 - |
题
我没有做太多的编程在许多语言,但我知道在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;
这都是相同的语言。它怎么知道多少储备?还是我比较苹果和橘子?如果我要对这个错误的,你有什么好的选题,我可以读更好地了解?
解决方案
既然你有Ç经验,考虑一个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
这个类型在bytecoded,编译或直接解释语言增强数据作品。
有在问候不同的虚拟机实现更多的细节(本地分配,堆分配,注册虚拟机等)。如果你真的想了解机器如何虚功,最好的参考是Lua的。很干净的语言,很干净的字节码,而且很干净的虚拟机。 PHP可能是最后的执行你应该看看。
其他提示
PHP并没有真正编译 - 它被interpretted(成操作码)
相当多,如果你尝试做一些对不能做一个特定的数据类型,它会给你一个错误。没有类型检查。
它不编译。它是一种解释语言时,如Javascript。
我意识到这是一个老问题,但这里是PHP如何处理这些问题提出由OP一些更具体的信息。
这是从PHP引用页面,你会想要入手:
我知道链接是不是首选,但这种联系应该是稳定的,我不想批发副本PHP参考文档。下面是亮点。
OP:如何PHP知道它使用(或做它)是什么类型的变量
PHP是用C,并使用C结构的typedef它称之为一个的zval 与C联合的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函数。强>”
该发动机具有一组它用来与变量容器的工作转换变量的类型,这样的宏,你通常不必面对这一切。
如果你想看到什么行动变量容器的样子,他们可以进行转储:
debug_zval_dump($variableName);
“如何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不关心你的变量的类型,因为它是一种编程语言,它不会有感情的。
编辑:
“还是我比较苹果和橘子?”
是的,你是。 这里你可以了解更多关于语言。
EDIT2:
PHP是一个解释器和不具有编译器的脚本语言。这意味着,在PHP中你只能得到运行时错误。这是一个自由的语言,如果我们考虑的类型,根据他们的使用,因为你做任何事情与你的变量权及其类型将被修改。
这些链接可能对您有用:
http://www.gidforums.com/t-11866.html
的http:// WWW .webmaster-talk.com /编码论坛/ 186350-基波差异的PHP间-cc.html
请注意,PHP是在服务器上执行,如果你想创建客户端事件,JavaScript是我的建议。
PHP现在支持类型提示,可以包括像“字符串”或在被捕获作为脚本函数定义“数组”被解析,以指示有一个类型不匹配。