php中有指针吗?

php中有指针吗?,php,pointers,Php,Pointers,这个代码是什么意思?这就是在php中声明指针的方式吗 $this->entryId = $entryId; entryId是当前类($this)的实例属性 $entryId是一个局部变量,语法是访问类成员的一种方式。PHP没有指针,但它有引用 你引用的语法基本上与从C++中的指针访问一个成员(而不是当指针时使用点符号)相同。(< /p> < p>回答问题的第二部分——PHP中没有指针。 在处理对象时,通常通过引用而不是通过值传递-因此在某些方面,这就像指针一样操作,但通常是完全透明的 这

这个代码是什么意思?这就是在php中声明指针的方式吗

$this->entryId = $entryId;

entryId是当前类($this)的实例属性
$entryId是一个局部变量,语法是访问类成员的一种方式。PHP没有指针,但它有引用


<>你引用的语法基本上与从C++中的指针访问一个成员(而不是当指针时使用点符号)相同。(< /p> < p>回答问题的第二部分——PHP中没有指针。 在处理对象时,通常通过引用而不是通过值传递-因此在某些方面,这就像指针一样操作,但通常是完全透明的


这取决于您使用的PHP版本

PHP中的变量名以$entryId开头,因此$entryId是变量名。 $this是PHP面向对象编程中的一个特殊变量,它引用当前对象。 ->用于访问PHP中的对象成员(如属性或方法),如C++中的语法。 因此,您的代码的意思是:

将变量$entryId的值放入此对象的entryId字段(或属性)

PHP中的&operator表示传递引用。以下是一个例子:

$b=2;
$a=$b;
$a=3;
print $a;
print $b;
// output is 32

$b=2;
$a=&$b; // note the & operator
$a=3;
print $a;
print $b;
// output is 33
在上面的代码中,因为我们使用了&operator,所以$b指向的位置的引用存储在$a中。所以$a实际上是对$b的引用

在PHP中,参数默认按值传递(受C启发)。因此,在调用函数时,当您传入值时,它们是按值复制的,而不是按引用复制的。这是大多数情况下的默认设置。但是,在定义函数时,有一种方法可以通过引用传递行为。例如:

function plus_by_reference( &$param ) {
      // what ever you do, will affect the actual parameter outside the function
      $param++;
}

$a=2;
plus_by_reference( $a );
echo $a;
// output is 3
有许多内置函数的行为与此类似。与sort()函数类似,对数组进行排序将直接影响数组,并且不会返回另一个已排序数组

不过,有一些有趣的事情值得注意。由于“按值传递”模式可能会导致更多内存使用,而PHP是一种解释语言(因此用PHP编写的程序不如编译程序快),为了使代码运行更快并最大限度地减少内存使用,PHP解释器中有一些调整。一个是懒拷贝(我不知道名字)。这意味着:

当您将一个变量转换为另一个变量时,PHP会将对第一个变量的引用复制到第二个变量中。所以你的新变量,实际上是到现在为止第一个变量的引用。尚未复制该值。但是如果您试图更改这些变量中的任何一个,PHP将复制该值,然后更改该变量。这样,如果不更改值,您将有机会节省内存和时间

因此:

在此之后,如果您想将$entryId的值放入对象的“entryId”属性中,上述代码将执行此操作,并且不会复制entryId的值,直到您更改其中任何一个,从而减少内存使用。如果您确实希望它们都指向相同的值,请使用以下命令:

$this->entryId=&$entryId;

PHP通过引用(指针)传递数组和对象。如果要传递一个正态变量,例如$var='boo';然后使用$boo=&$var

PHP可以使用类似指针的东西:

$y=array(&$x);
现在,$y就像指向$x的指针,$y[0]取消对指针的引用


值数组(&$x)只是一个值,因此它可以传递给函数、存储在其他数组中、复制到其他变量等。您甚至可以创建指向此指针变量的指针。(序列化它会破坏指针,但是)< /P> < P>是的,PHP中有类似指针的东西,但可能与C或C++中发生的情况不符。 下面是一个例子

$a = "test";
$b = "a";
echo $a;
echo $b;
echo $$b;

//output
test
a
test
这说明了PHP中指针的类似概念。

不,正如其他人所说,“PHP中没有指针。”我补充说,PHP中没有与RAM_相关的内容

而且所有的答案都很清楚。但有几点被遗漏了,我无法抗拒

有许多行为类似于指针的东西
  • 构造(我最喜欢的也是危险的)
  • 变数
  • 变量前额外的“$”符号(如所述的pratk
  • 参考资料

第一个 首先,我必须说PHP是非常强大的语言,因为我知道有一个名为“eval”的结构,所以您可以在运行它的同时创建PHP代码!(真的很酷!)

尽管存在PHP_注入的危险,但PHP_注入比SQL_注入更具破坏性。当心

例如:

代码:

$a='echo "Hello World.";';
eval ($a);
$three="Hello";$variable=" Amazing ";$names="World";
$arr = Array("three","variable","names");
foreach($arr as $VariableName)
    echo $GLOBALS[$VariableName];
$a="b";
$b="c";
$c="d";
$d="e";
$e="f";

echo $a."-";
echo $$a."-";   //Same as $b
echo $$$a."-";  //Same as $$b or $c
echo $$$$a."-"; //Same as $$$b or $$c or $d
echo $$$$$a;    //Same as $$$$b or $$$c or $$d or $e
$a="Hello";
$b=&$a;
$b="yello";
echo $a;
function junk(&$tion)
{$GLOBALS['a'] = &$tion;}
$a="-Hello World<br>";
$b="-To You As Well";
echo $a;
junk($b);
echo $a;
输出

你好,世界

因此,您可以从头开始创建一个变量,而不是使用指针来充当另一个变量


第二个 $GLOBAL变量非常有用,您可以使用它的键访问所有变量

例如:

代码:

$a='echo "Hello World.";';
eval ($a);
$three="Hello";$variable=" Amazing ";$names="World";
$arr = Array("three","variable","names");
foreach($arr as $VariableName)
    echo $GLOBALS[$VariableName];
$a="b";
$b="c";
$c="d";
$d="e";
$e="f";

echo $a."-";
echo $$a."-";   //Same as $b
echo $$$a."-";  //Same as $$b or $c
echo $$$$a."-"; //Same as $$$b or $$c or $d
echo $$$$$a;    //Same as $$$$b or $$$c or $$d or $e
$a="Hello";
$b=&$a;
$b="yello";
echo $a;
function junk(&$tion)
{$GLOBALS['a'] = &$tion;}
$a="-Hello World<br>";
$b="-To You As Well";
echo $a;
junk($b);
echo $a;
输出

你好,神奇世界

注意:其他人也可以在较小的范围内完成相同的操作


第三个 如果您知道自己在做什么,可以在变量之前添加任意数量的“$”

例如:

代码:

$a='echo "Hello World.";';
eval ($a);
$three="Hello";$variable=" Amazing ";$names="World";
$arr = Array("three","variable","names");
foreach($arr as $VariableName)
    echo $GLOBALS[$VariableName];
$a="b";
$b="c";
$c="d";
$d="e";
$e="f";

echo $a."-";
echo $$a."-";   //Same as $b
echo $$$a."-";  //Same as $$b or $c
echo $$$$a."-"; //Same as $$$b or $$c or $d
echo $$$$$a;    //Same as $$$$b or $$$c or $$d or $e
$a="Hello";
$b=&$a;
$b="yello";
echo $a;
function junk(&$tion)
{$GLOBALS['a'] = &$tion;}
$a="-Hello World<br>";
$b="-To You As Well";
echo $a;
junk($b);
echo $a;
输出

b-c-d-e-f


最后一个 参考是如此接近指针,但您可能需要检查更多的澄清

例1:

代码:

$a='echo "Hello World.";';
eval ($a);
$three="Hello";$variable=" Amazing ";$names="World";
$arr = Array("three","variable","names");
foreach($arr as $VariableName)
    echo $GLOBALS[$VariableName];
$a="b";
$b="c";
$c="d";
$d="e";
$e="f";

echo $a."-";
echo $$a."-";   //Same as $b
echo $$$a."-";  //Same as $$b or $c
echo $$$$a."-"; //Same as $$$b or $$c or $d
echo $$$$$a;    //Same as $$$$b or $$$c or $$d or $e
$a="Hello";
$b=&$a;
$b="yello";
echo $a;
function junk(&$tion)
{$GLOBALS['a'] = &$tion;}
$a="-Hello World<br>";
$b="-To You As Well";
echo $a;
junk($b);
echo $a;
输出

耶洛

例2:

代码:

$a='echo "Hello World.";';
eval ($a);
$three="Hello";$variable=" Amazing ";$names="World";
$arr = Array("three","variable","names");
foreach($arr as $VariableName)
    echo $GLOBALS[$VariableName];
$a="b";
$b="c";
$c="d";
$d="e";
$e="f";

echo $a."-";
echo $$a."-";   //Same as $b
echo $$$a."-";  //Same as $$b or $c
echo $$$$a."-"; //Same as $$$b or $$c or $d
echo $$$$$a;    //Same as $$$$b or $$$c or $$d or $e
$a="Hello";
$b=&$a;
$b="yello";
echo $a;
function junk(&$tion)
{$GLOBALS['a'] = &$tion;}
$a="-Hello World<br>";
$b="-To You As Well";
echo $a;
junk($b);
echo $a;
功能垃圾(&$tion)
{$GLOBALS['a']=&$tion;}
$a=“-Hello World
”; $b=“-也给你”; echo$a; 垃圾(b美元); echo$a;
输出

-你好,世界

-对你也一样


希望有帮助。

您可以在某种程度上模拟指向实例化对象的指针:

class pointer {
   var $child;

   function pointer(&$child) {
       $this->child = $child;
   }

   public function __call($name, $arguments) {
       return call_user_func_array(
           array($this->child, $name), $arguments);
   }
}
这样使用:

$a = new ClassA();

$p = new pointer($a);

如果你传递$p,它将像一个C++指针一样关于方法调用(你不能直接触摸对象变量,但这是邪恶的:)