美元符号是否与C++指针有某种关联?

Sho*_*hoe 0 php c++

今天我在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
Run Code Online (Sandbox Code Playgroud)

由于PHP从C++继承了它的语法,美元符号不会提醒你指针吗?

string bar = "a";
string *foo = &bar;
string **world = &foo;
string ***hello = &world;
string ****a = &hello;
Run Code Online (Sandbox Code Playgroud)

就像指针一样,当你定义时$a = 'var',$var = 'test'然后你$$a就会使用$a指向的值来$var表示C++指针只是用字符串而不是内存地址发生的事情.

因此,PHP中的美元符号可以与C++指针相关吗?

In *_*ico 17

由于PHP源自C++ ...

停止.这种思路只会给你带来痛苦和痛苦.Perl中,LPC,Lua中,派克,阿达95,Java,PHP和d,C99,C#和猎鹰都衍生自C++以及,对于"派生"的一些定义,我可以向你保证他们的行为没有像C++和肯定不会像C++一样使用.相似之处本质上是肤浅的,它们的语义完全不同.


在上面提供的情况下,它更类似于Javascript之类的语言,因为您只能在给定字符串的情况下解析和取消引用变量名称.在C++中,只知道变量的名称不允许您取消引用变量.你需要的是它的内存地址(因此是&运营商).这是关键的区别.

我认为这里误解最突出的一点是你的问题的这一部分:

就像指针一样,当你定义$ a ='var'和$ var ='test'然后你执行$$ a时,你使用$ a的R值指向$ var,这与C++指针有什么关系.

这不是解释不捕获关于指针的整个图片.我假设你在谈论这些事情:

PHP:

$var = 'test' 
$a = 'var'
//$$a == 'test'
Run Code Online (Sandbox Code Playgroud)

C++:

std::string var = "test";
std::string* a = &var;
// *a == "test";
Run Code Online (Sandbox Code Playgroud)

这两者之间的最大区别在于,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"
Run Code Online (Sandbox Code Playgroud)

这与简单的指针解除引用非常不同,因为指针不包含字符串,它们保存内存地址.即使你不应该在代码中使用指针,除非在非常特殊的情况下.


Ker*_* SB 5

这与指针无关.它更像是一个反射实例,通过它,一段字符串成为代码.C++没有这种反射.

可以在PHP中进行反射:解释器在程序执行时运行,因此可以将字符串作为一段代码反馈到解释器中.

Java有一个与某人相关的机制,您可以通过该机制在运行时将类的名称指定为字符串,然后Java VM可以在运行时加载该类并实例化其类型的对象.Java以某种方式执行托管上下文,而C++程序通常不执行:编译C++程序时,没有"C++"的痕迹,它只是机器代码*.

*)Pedant的脚注:除非您正好在编译C++编译器.

  • Pedantry警报:作为一种编译语言并不禁止反思. (4认同)
  • 没有什么能阻止C++编译器产生更多的机器代码并保留一些C++.事实上,这已经发生在`std :: typeinfo`实例中. (2认同)