美元符号在某种程度上与C++指针有关吗


Is the dollar sign somehow related to C++ pointers?

今天我在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变量的结构中的名称。

指针只包含地址,这里您使用一个变量作为要访问的另一个变量的"名称"。。