今天我在php.net上看到一篇文章,我在这里引用它:
$Bar = "a";
$Foo = "Bar";
$World = "Foo";
$Hello = "World";
$a = "Hello";
$a; //Returns Hello
$$a; //Returns World
$$$a; //Returns Foo
$$$$a; //Returns Bar
$$$$$a; //Returns a
$$$$$$a; //Returns Hello
$$$$$$$a; //Returns World
既然PHP从C++继承了它的语法,美元符号难道不会让你想起指针吗?
string bar = "a";
string *foo = &bar;
string **world = &foo;
string ***hello = &world;
string ****a = &hello;
就像指针一样,当您定义$a = 'var'
和$var = 'test'
,然后执行$$a
时,您使用$a
的值来指向$var
,这有点像C++指针只使用字符串而不是内存地址所发生的情况。
那么PHP中的美元符号可以与C++指针相关吗?
由于PHP源于C++。。。
停止 这种思路只会给你带来痛苦。Perl、LPC、Lua、Pike、Ada 95、Java、PHP、D、C99、C#和Falcon都是从C++派生而来的;导出";,我可以向你保证,它们的行为一点也不像C++,当然也不像C++那样使用。相似之处本质上是肤浅的,它们的语义完全不同。
在上面提供的例子中,它与Javascript等语言更相似,因为您可以解析和取消引用仅给定字符串的变量名。在C++中,只知道变量的名称不允许取消引用该变量。您需要的是它的内存地址(因此需要&
运算符)。这是关键区别。
我认为这里最突出的误解是你问题的这一部分:
就像指针一样,当您定义$a='var'和$var='test'并且然后你使用$a的R值来指向$var这有点像C++指针。
这不是解释,不能捕捉到指针的全貌。我想你说的是这样的事情:
PHP:
$var = 'test'
$a = 'var'
//$$a == 'test'
C++:
std::string var = "test";
std::string* a = &var;
// *a == "test";
两者之间的最大区别是C++的a
包含var
变量的内存地址,而不是包含变量var
名称的字符串。
它更像是反射,而不是其他任何东西,C++当然没有将其作为标准,因此不能简单地取消引用只给定字符串名称的变量。
来自可变变量的PHP文档:
有时,可以使用变量变量名是很方便的。也就是说,是一个可以动态设置和使用的变量名[强调矿]
如果C++有这样的功能,它会更像这样:
std::string Bar = "a";
std::string Foo = "Bar";
std::string World = "Foo";
std::string Hello = "World";
std::string a = "Hello";
// Hypothetical function dyn_deref_str that gets the string value
// held by a variable given only its name.
a; //Returns "Hello"
dyn_deref_str(a); //Returns "World"
dyn_deref_str(dyn_deref_str(a)); //Returns "Foo"
dyn_deref_str(dyn_deref_str(dyn_deref_str(a))); //Returns "Bar"
dyn_deref_str(dyn_deref_str(dyn_deref_str(dyn_deref_str(a)))); //Returns "a"
这与简单的指针去引用非常不同,因为指针不包含字符串,而是包含内存地址。尽管除非在非常特殊的情况下,否则无论如何都不应该在代码中使用指针。
这与指针无关。它更像是反射的一个实例,通过它一段字符串就变成了代码。C++没有这种反射。
反射在PHP中是可能的:解释器在程序执行时正在运行,因此可以将字符串作为一段代码反馈给解释器。
Java有一个与某人相关的机制,通过该机制,您可以在运行时将类的名称指定为字符串,然后Java VM可以在运行时或加载该类并实例化其类型的对象。Java以某种托管上下文的方式执行,而C++程序通常不会:编译C++程序时,没有"C++"的痕迹,它只是机器代码*。
*)Pedant’s的脚注:当然,除非你碰巧在编译C++编译器
我不认为它与指针有关。http://www.php.net/manual/en/language.variables.variable.php
变量变量不寻址内存地址,而是解析用于保存php变量的结构中的名称。
指针只包含地址,这里您使用一个变量作为要访问的另一个变量的"名称"。。