2012-09-22 33 views
7

当我今天测试了以下代码我惊奇:PHP如何实现“动态”变量?

$star = "Aquarius"; 
$star = 11; 

调试时,我观察到$star简单地改变从string类型integer类型。我对这个功能感到惊讶。以C++为例,这是不可能的,但在c#中我认为var变量,但它不一样。

举例来说,你不能做的:

var dynamic = "Hello"; 
dynamic = 3; 

我开始怀疑到底发生了什么在点的时候我基本上说$星级= 11。我的猜测是,$star仅仅是重新初始化,因为它是直接为(但这看起来很奇怪,因为解释者已经知道变量$star已经被提前声明)。任何人都可以帮助一些明确或官方源支持解释?

谢谢。

回答

7

在C/C++的类型在编译时定义的,因为该种优化的可能发生的基础上的。

在C#中,编译器根据上下文推断类型,并在编译器的大脑中将var关键字替换为该类型。这就是为什么在编译器进行初始推断后你不能改变类型的原因。

在像PHP这样的脚本语言中,变量是进入哈希映射(关联数组,符号表)的条目。这定义了命名空间(和范围)。实际值部分是存储值和类型的通用对象类型。

+0

哇,太好了。那么这是否意味着在C#中变量永远不会真正存储为* generic * object类型?是否有可能提供任何资源,我可以学到更多?谢谢 – rtuner

+1

C#是输出字节码以在VM上运行的语言。我在PHP例子中提到的'通用对象类型'只不过是一个包含2个成员的'C语言结构体'(我通过这样说简化了一些问题)。由于您将三种不同语言(一种用于汇编代码,一种用于字节码,一种用于解释执行)的概念组合起来,所以更多的源代码很困难。 –

0

PHP是一种动态语言,在精神上与Perl,Ruby,Python或其他类似。另一方面,C++是编译和静态类型的,要求每个变量在编译时定义一个类型。

检查PHP文档一些伟大的洞察到PHP的动态类型实现: http://php.net/manual/en/language.types.type-juggling.php

+0

我不认为这是很什么,他们正在寻找... –