这段代码是什么意思?这是在PHP中声明指针的方式吗?
$this->entryId = $entryId;
在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 的引用。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;
$a=array(1,2); $b=&$a[0]; &$b++; //现在$b指向$a[1]
?这对我来说意味着真正使用指针。是否可能实现这样的构造或类似的构造? - ulkas(*myObject).property
等同于myObject->property
。由于PHP实际上没有指针(而是使用引用),因此在PHP中,->运算符的含义与C++中并不完全相同。你不能在PHP中用(*$myObject).property
代替->。 - echochamber不,正如其他人所说,“PHP中没有指针”,而且我要补充的是,在PHP中没有任何与RAM相关的内容。
所有回答都很清楚。但是有些要点被忽略了,我无法抵制!
首先我必须说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;
输出
- 你好,世界
- 也祝你好
希望有所帮助。
$
弄得有些迷茫,但我找到了一个很好的解释 -- https://dev59.com/lnE85IYBdhLWcg3wkkU8 - greenoldman那个语法是访问类成员的一种方式。PHP没有指针,但它有引用。
你引用的语法基本上与在C++中从指向类的指针访问成员相同(而点符号表示法用于非指针情况)。
您可以在一定程度上模拟指向实例化对象的指针:
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);
是的,PHP中有类似于指针的东西,但可能与c或c++中发生的情况不完全匹配。 以下是一个例子。
$a = "test";
$b = "a";
echo $a;
echo $b;
echo $$b;
//output
test
a
test
entryId是当前类($this)的实例属性,而$entryId则是一个局部变量。
PHP 可以使用类似指针的东西:
$y=array(&$x);
现在$y就像是指向$x的指针,而$y[0]则是对指针进行解引用。
数组值(&$x)只是一个值,因此它可以被传递给函数、存储在其他数组中、复制到其他变量中等。你甚至可以创建一个指向这个指针变量的指针。(但是序列化会破坏指针。)
PHP通过引用(指针)传递数组和对象。如果您想传递普通变量,例如$var = 'boo',那么请使用$boo = &$var;。
$this
只是指当前类作用域,以访问在该上下文中可用的变量。$entryId
只是在本地上下文中可访问的变量或作为参数传递。 - pythonian29033