php 美元符号与C++指针有某种联系吗?[关闭]

cyvaqqii  于 2023-04-28  发布在  PHP
关注(0)|答案(4)|浏览(130)

很难说这里问的是什么。这个问题是模棱两可的,模糊的,不完整的,过于广泛的,或修辞,不能合理地回答其目前的形式。有关澄清此问题以便重新打开的帮助,请访问visit the help center
11年前关闭。
今天我在www.example上看到一篇文章 www.example.com ,我在这里引用:

$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
指针相关吗?

7ajki6be

7ajki6be1#

PHP是从C++派生出来的。..

***停止。***这种想法只会给你带来痛苦和痛苦。Perl, LPC, Lua, Pike, Ada 95, Java, PHP, D, C99, C#, and Falcon也都是从C派生的,对于“派生”的一些定义,我可以向你保证它们的行为与C完全不同,当然也不像C++那样使用。相似之处是表面上的,语义上是完全不同的。

在上面提供的例子中,它更类似于JavaScript这样的语言,在这个意义上,你可以解析和取消引用一个变量名 *,只要给出一个字符串 *。在C中,仅仅知道变量的名称并不允许对变量进行解引用。您需要的是它的内存地址(因此使用&运算符)。这是关键的区别。
我认为最明显的误解是你的问题的这一部分:
就像指针一样,当你定义$a = 'var'和$var = 'test',然后你执行$$a时,你使用$a的R值指向$var,这就像C
指针一样。
这不是解释,没有捕捉到关于指针的整个画面。我想你是在说这样的事情:
PHP:

$var = 'test' 
$a = 'var'
//$$a == 'test'

C++:

std::string var = "test";
std::string* a = &var;
// *a == "test";

两者之间最大的区别是Ca包含var变量的 * 内存地址 *,而不是包含变量var名称的字符串。
它更像reflection,而不是其他任何东西,C
肯定没有标准的reflection,因此不能简单地取消引用一个只有字符串名称的变量。
the PHP documentation for variable variables
有时候,能够有变量名是很方便的。也就是说,是一个可以动态设置和使用的变量名。[强调我的]
如果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"

这与简单的指针解引用非常不同,因为指针不保存字符串,它们保存内存地址。即使你shouldn't be using pointers in your code anyway除了在非常特殊的情况下。

h43kikqp

h43kikqp2#

这与指针无关。它更像是reflection的一个示例,通过它,一段字符串变成了代码。C++没有这样的反射。
在PHP中可以使用反射:解释器在程序执行时运行,因此可以将字符串作为一段代码反馈回解释器。

  • Java* 有一个与某人相关的机制,通过该机制,您可以在运行时将类的名称指定为字符串,然后Java VM可以在运行时加载该类并示例化其类型的对象。Java以某种方式在托管上下文中执行,而C程序通常不这样做:当一个C程序被编译时,没有“C++”的痕迹,它只是机器码 *。
  • )学究的脚注:当然,除非你碰巧正在编译一个C++编译器。
waxmsbnn

waxmsbnn3#

我不认为这和指针有关。http://www.php.net/manual/en/language.variables.variable.php
变量变量不寻址内存地址,但解析用于保存php变量的结构中的名称。

blmhpbnm

blmhpbnm4#

指针只包含地址,这里你使用一个变量作为你想访问的另一个变量的“名字”。.

相关问题