在PHP 5中,是否需要使用&
修饰符通过引用传递?例如,
class People() { }
$p = new People();
function one($a) { $a = null; }
function two(&$a) { $a = null; )
在PHP4中,您需要使用&
修饰符在进行更改后保持引用,但是我对已阅读的有关PHP5自动使用传递引用的主题感到困惑,除非明确克隆对象。
在PHP5中,是否 &
需要通过修饰符来通过引用传递所有类型的对象(变量,类,数组等)?
您是否需要使用&修饰符来传递引用?
从技术上/意义上讲,即使有对象,答案也是 肯定的 。这是因为有两种传递/分配对象的方式:通过引用或通过 标识符 。当函数声明包含时&
,例如:
function func(&$obj) {}
无论如何,该参数都将通过引用传递。如果您声明时没有&
function func($obj) {}
除对象和资源外,所有内容都将按值传递,然后将通过 identifier 传递。什么是标识符?好吧,您可以将其视为对参考的参考。请看以下示例:
class A
{
public $v = 1;
}
function change($obj)
{
$obj->v = 2;
}
function makezero($obj)
{
$obj = 0;
}
$a = new A();
change($a);
var_dump($a);
/*
output:
object(A)#1 (1) {
["v"]=>
int(2)
}
*/
makezero($a);
var_dump($a);
/*
output (same as before):
object(A)#1 (1) {
["v"]=>
int(2)
}
*/
那么为什么不$a
将其传递给后突然变成整数makezero
呢?这是因为我们只重写了 标识符 。如果我们通过 引用 传递了:
function makezero(&$obj)
{
$obj = 0;
}
makezero($a);
var_dump($a);
/*
output:
int(0)
*/
现在$a
是一个整数。因此,通过 标识符 和通过 引用 之间存在区别。
问题内容: 我似乎无法获得任何一致的信息。不同的消息来源似乎说了不同的话,而古老的php.net本身( 似乎 )并未明确指出这一点- 尽管我必须承认,我只是快速浏览了一下。 如果我要传递“重”对象,则需要通过引用传递,但我不想继续输入: 如果我能摆脱 那么标准怎么说呢? 问题答案: 对象通过引用传递(和分配)。无需使用操作员地址。 当然,我键入的内容过于简单,但将适合您的目的。该文档指出: 经常提
问题内容: 是否可以通过Java通过引用传递对象 就像在C#中一样 问题答案: 不,这在Java中是不可能的。 在Java中,方法的所有参数均按值传递。注意非原始型的的变量,它们是对对象的引用,也由值来传递:在这种情况下, 参考 是 由值来传递 。请注意,按值传递引用与按引用传递不同。
问题内容: 我想知道在您仅读取变量时是否将其作为按引用传递的优良作法,还是应始终将其作为值传递。 引用传递示例: 传递值的示例: 哪个更好 ?例如,如果我要循环运行1000次? 循环示例: 问题答案: 如果您打算传递一个 值 (因此该函数不会对其进行修改) ,则没有理由通过引用传递它:这只会使您的代码更难以理解,因为人们会认为“ 此函数可以修改我将要修改的内容。传递给它-哦,它没有修改? ” 在您
问题内容: 您可以使用关键字“ ref”在.NET中进行操作。用Java有什么办法吗? 问题答案: 您正在用自己的方法做什么?如果仅填充现有数组,则不需要.NET或Java中的按引用传递语义。在这两种情况下,引用都将按值传递-因此对 对象的 更改将由调用者看到。这就像告诉某人您的住所地址,并要求他们向其提供物品-没问题。 如果您 确实 需要传递引用语义,即调用方将看到对参数本身所做的任何更改,例如
问题内容: Python文档似乎尚不清楚参数是通过引用还是通过值传递,并且以下代码会产生未更改的值“原始” 我可以做些什么来通过实际引用传递变量吗? 问题答案: 传入的参数实际上是对对象的引用(但引用是通过值传递的) 有些数据类型是可变的,但有些则不是 所以: 如果将可变对象传递给方法,则该方法将获得对该对象的引用,并且可以对其进行突变,但是如果您将该引用重新绑定到该方法中,则外部作用域对此一无所
问题内容: 我有以下代码: 有人可以解释为什么输出是:零一二二。 摘自zend认证学习指南。 问题答案: 因为在第二个循环中,仍然是对最后一个数组项的引用,所以每次都将其覆盖。 您可以看到这样的内容: 如您所见,最后一个数组项采用当前循环值:“零”,“一个”,“两个”,然后就是“两个” …:)