PHP中是否有指针?

61

这段代码是什么意思?这是在PHP中声明指针的方式吗?

$this->entryId = $entryId;

2
这是如何初始化变量的方法,-> 在Java中相当于点运算符。 - user1020069
$this 只是指当前类作用域,以访问在该上下文中可用的变量。 $entryId 只是在本地上下文中可访问的变量或作为参数传递。 - pythonian29033
1
你应该先搜索一下 PHP 中的美元符号是什么意思。 - Damjan Pavlica
9个回答

174

在PHP中,变量名以$开头,因此$entryId是一个变量名。

$this是Object Oriented编程中的特殊变量,在PHP中它是指向当前对象的引用。

->用于访问PHP中的对象成员(如属性或方法),类似于C++中的语法。因此,您的代码意味着:

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

在PHP中,&运算符表示传递引用。以下是一个例子:

$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
在上面的代码中,由于我们使用了 & 运算符,$a 中存储了 $b 指向的引用。因此,$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 将复制该值,然后更改该变量。通过这种方式,您将有机会节省内存和时间,但要注意不要更改该值。

所以:

$b=3;
$a=$b;
// $a points to $b, equals to $a=&$b
$b=4;
// now PHP will copy 3 into $a, and places 4 into $b

经过所有这些步骤,如果你想将$entryId的值放入你的对象的'entryId'属性中,上述代码将实现此操作,并且不会复制entryId的值,直到你更改其中任何一个,从而减少内存使用。如果你实际上希望它们都指向同一个值,则使用以下代码:

$this->entryId=&$entryId;

3
PHP 中像 C++ 那样有指针吗?变量和变量的引用是可以的,但指针呢? - Koray Tugay
好的,现在我们有一个引用。是否可能增加引用,使其指向内存中的下一个部分?例如:$a=array(1,2); $b=&$a[0]; &$b++; //现在$b指向$a[1]?这对我来说意味着真正使用指针。是否可能实现这样的构造或类似的构造? - ulkas
7
对象始终通过引用传递! - ComFreek
值得注意的是,在C++中,->运算符实际上只是解引用和访问属性的语法糖,(*myObject).property等同于myObject->property。由于PHP实际上没有指针(而是使用引用),因此在PHP中,->运算符的含义与C++中并不完全相同。你不能在PHP中用(*$myObject).property代替->。 - echochamber

30

不,正如其他人所说,“PHP中没有指针”,而且我要补充的是,在PHP中没有任何与RAM相关的内容。

所有回答都很清楚。但是有些要点被忽略了,我无法抵制!

有许多东西的功能类似于指针

  • eval 结构(我的最爱,也很危险)
  • $GLOBALS 变量
  • 在变量前加上额外的 '$' 符号(就像prathk提到的那样)
  • 引用

第一个

首先我必须说PHP是一种真正强大的语言,因为它有一个名为“eval”的构造,因此您可以在运行时创建自己的PHP代码!(非常酷!)

虽然存在PHP注入的危险,这比SQL注入更具破坏性。小心!

例如:

代码:

$a='echo "Hello World.";';
eval ($a);

输出

Hello World.

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


第二个

$GLOBAL 变量非常有用,您可以使用其键访问所有变量。

示例:

代码:

$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

输出

b-c-d-e-f


最后一个

引用(Reference)与指针(Pointers)非常相似,但您可能需要查看此链接以获得更多澄清。

示例1:

代码:

$a="Hello";
$b=&$a;
$b="yello";
echo $a;

输出

yello

示例2:

代码:

function junk(&$tion)
{$GLOBALS['a'] = &$tion;}
$a="-Hello World<br>";
$b="-To You As Well";
echo $a;
junk($b);
echo $a;

输出

- 你好,世界

- 也祝你好

希望有所帮助。


2
非常感谢您的帖子,真是一篇宝藏。虽然我被多个 $ 弄得有些迷茫,但我找到了一个很好的解释 -- https://dev59.com/lnE85IYBdhLWcg3wkkU8 - greenoldman
1
太好的解释了!(Y) - DirtyBit
2
当我们看到PHP开发人员从未学习过C++时,就不要谈论指针/引用编程,因为C++是这些概念首次创建/实现的语言。 - reuns
谢谢!不过请考虑在您的代码示例中使用更多空格... - LukasKroess

11

那个语法是访问类成员的一种方式。PHP没有指针,但它有引用。

你引用的语法基本上与在C++中从指向类的指针访问成员相同(而点符号表示法用于非指针情况)。


3
那些是参考资料,它们稍有不同。 - Richard Levasseur

5
回答你问题的第二部分-在PHP中没有指针。
当使用对象时,通常会通过引用传递而不是按值传递-因此在某些方面,这类似于指针,但通常完全透明。
这取决于您使用的PHP版本。

1
在PHP中,传递对象通常仍然是按值传递的。PHP变量实际上从来没有对象作为它们的值 - 它们有对象的引用。当您将一个对象变量传递给函数时,您就有了两个变量,它们都具有相同的值,并且该值是对对象的引用。引用存在的事实只是关于PHP中变量如何工作的问题,与传递无关。您可以在函数内重新分配变量而不更改外部变量。我在这里忽略了古老的php版本4。 - bdsl

3

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

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++ 指针一样对待方法调用(您无法直接访问对象变量,但这本身就是有害的 :))。

2

是的,PHP中有类似于指针的东西,但可能与c或c++中发生的情况不完全匹配。 以下是一个例子。

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

//output
test
a
test

这说明了PHP中指针的类似概念。

这怎么说明指针呢?它并没有展示OP所问的任何东西(至少对我来说不是)... - Joshua Grosso Reinstate CMs

2

entryId是当前类($this)的实例属性,而$entryId则是一个局部变量。


0

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

$y=array(&$x);

现在$y就像是指向$x的指针,而$y[0]则是对指针进行解引用。

数组值(&$x)只是一个值,因此它可以被传递给函数、存储在其他数组中、复制到其他变量中等。你甚至可以创建一个指向这个指针变量的指针。(但是序列化会破坏指针。)


1
哦,不行。$ php -r '$x = 1; $y = array(&$x); var_dump($y); $x = 2; var_dump($y); $y[0] = 3; var_dump($x);' //// 输出:array(1) { [0]=> &int(1) } array(1) { [0]=> &int(2) } int(3) - Jim Rubenstein

0

PHP通过引用(指针)传递数组和对象。如果您想传递普通变量,例如$var = 'boo',那么请使用$boo = &$var;。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接