PHP5对象是通过引用传递的吗?

mor*_*ous 64 php

我似乎无法得到任何一致的信息.不同的来源似乎说不同的东西和古老的php.net本身(似乎)没有明确说明这一点 - 虽然,我必须承认,我只是快速看.

如果我在传递'重'对象,我需要通过引用传递,但我不想继续输入:

function foo(TypeName& $obj)
Run Code Online (Sandbox Code Playgroud)

如果我可以简单地逃脱

function foo(TypeName $obj)
Run Code Online (Sandbox Code Playgroud)

那标准说的是什么?

web*_*ave 89

通过引用传递(和分配)对象.无需使用运营商的地址.

当然,我输入的内容过于简单,但适合您的目的.该文件规定:

经常提到的PHP5 OOP的关键点之一是"对象默认通过引用传递".这不完全正确.本节使用一些例子来纠正这种一般思想.

PHP引用是一个别名,它允许两个不同的变量写入相同的值.从PHP5开始,对象变量不再包含对象本身作为值.它只包含一个对象标识符,允许对象访问者查找实际对象.当一个对象通过参数发送,返回或分配给另一个变量时,不同的变量不是别名:它们包含标识符的副本,该副本指向同一个对象.

有关更详细的说明(解释过度简化以及标识符),请查看此答案.

  • 传递对象时,仍然按"值"传递.但是,"价值"不是对象本身.值是对象标识符,访问者( - >)用于查找对象.因此,无论何时传递对象或将对象分配给其他对象,它"感觉"就像通过引用传递一样.当使用 - >时,它"感觉"就像一个别名.但从技术上讲,它不是别名,而是值的副本,其中值是对象标识符.如果它是别名,则重新分配给完全不同的值会将所有别名更改为该新值,但您会发现它不会使它们成为别名. (12认同)
  • @JohnSmith-不,不会克隆该对象。复制的“值”不是对象本身。复制的值是一个很小的对象标识符,它使他们可以在内存中找到相同的对象。在变量之间传递或复制对象(传入和传出函数等)与复制整数非常相似。这些“整数”(可以说)代表了内存中用于查找实际对象的位置。发生任何这种情况时,不会复制完整的对象。(它只是位于内存中。)不同的变量别名也不相同。 (2认同)

Jos*_*osh 8

PHP手册:

您可以通过引用函数传递变量,以便函数可以修改变量.语法如下:

<?php
function foo(&$var)
{
    $var++;
}

$a=5;
foo($a);
// $a is 6 here
?>
Run Code Online (Sandbox Code Playgroud)

注意:函数调用上没有引用符号 - 仅在函数定义上.单独的函数定义足以通过引用正确传递参数.从PHP 5.3.0开始,当您在foo(&$ a);中使用&时,您将收到一条警告,指出"call-time pass-by-reference"已弃用.

PHP5中的新功能:

在PHP 5中,对象模型的基础结构被重写以使用对象句柄.除非您使用clone关键字显式克隆对象,否则您将永远不会在对象的场景重复项后面创建.在PHP 5中,既不需要通过引用传递对象也不需要通过引用分配它们

因此,只有function foo(&$var)当$ var可能不是类的实例时,才需要使用该语法.


小智 5

它看起来更精确一点,对象的值是通过值传递的,但是对象本身的值是一个指针.这与仅传递引用不同.

http://www.php.net/manual/en/language.oop5.references.php上列出的示例很好.在第一组中,$ a = NULL; 不会影响$ b,因为$ a只是一个指针.在第二组中,$ c = NULL; 导致$ d也为NULL,因为$ d是对$ c的引用.

<?php
class A {
    public $foo = 1;
}  

$a = new A;
$b = $a;
$a->foo = 2;
$a = NULL;
echo $b->foo."\n"; // 2

$c = new A;
$d = &$c;
$c->foo = 2;
$c = NULL;
echo $d->foo."\n"; // Notice:  Trying to get property of non-object...
?> 
Run Code Online (Sandbox Code Playgroud)